RegisterController.php 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 17/2/22
  6. * Time: 上午11:56
  7. */
  8. namespace app\frontend\modules\member\controllers;
  9. use app\backend\modules\charts\modules\phone\models\PhoneAttribution;
  10. use app\backend\modules\charts\modules\phone\services\PhoneAttributionService;
  11. use app\common\components\ApiController;
  12. use app\common\events\member\MemberBindMobile;
  13. use app\common\events\member\RegisterByMobile;
  14. use app\common\exceptions\MemberNotLoginException;
  15. use app\common\exceptions\ShopException;
  16. use app\common\facades\RichText;
  17. use app\common\helpers\Cache;
  18. use app\common\helpers\Client;
  19. use app\common\helpers\Url;
  20. use app\common\models\Address;
  21. use app\common\models\Member;
  22. use app\common\models\member\MemberInvitationCodeLog;
  23. use app\common\models\MemberAlipay;
  24. use app\common\models\MemberGroup;
  25. use app\common\models\MemberLevel;
  26. use app\common\models\MemberShopInfo;
  27. use app\common\models\Protocol;
  28. use app\common\modules\sms\SmsService;
  29. use app\common\services\aliyun\AliyunSMS;
  30. use app\common\services\Session;
  31. use app\common\services\txyunsms\SmsSingleSender;
  32. use app\framework\Http\Request;
  33. use app\frontend\modules\member\models\MemberMiniAppModel;
  34. use app\frontend\modules\member\models\MemberModel;
  35. use app\frontend\modules\member\models\MemberUniqueModel;
  36. use app\frontend\modules\member\models\SubMemberModel;
  37. use app\frontend\modules\member\models\MemberWechatModel;
  38. use app\frontend\modules\member\services\factory\MemberFactory;
  39. use app\frontend\modules\member\services\MemberPluginSmsService;
  40. use app\frontend\modules\member\services\MemberService;
  41. use Illuminate\Support\Facades\Cookie;
  42. use Illuminate\Support\Facades\Input;
  43. use Illuminate\Support\Str;
  44. use iscms\Alisms\SendsmsPusher as Sms;
  45. use app\common\exceptions\AppException;
  46. use Mews\Captcha\Captcha;
  47. use app\common\facades\Setting;
  48. use app\common\services\alipay\OnekeyLogin;
  49. use app\common\models\McMappingFans;
  50. class RegisterController extends ApiController
  51. {
  52. protected $publicController = ['Register'];
  53. protected $publicAction = ['newApiData', 'index', 'sendCode', 'sendCodeV2', 'checkCode', 'sendSms', 'changePassword', 'getInviteCode', 'chkRegister', 'alySendCode', 'appSendCode','registerPage','register'];
  54. protected $ignoreAction = ['newApiData', 'index', 'sendCode', 'sendCodeV2', 'checkCode', 'sendSms', 'changePassword', 'getInviteCode', 'chkRegister', 'alySendCode', 'appSendCode','registerPage','register'];
  55. public function index()
  56. {
  57. $mobile = \YunShop::request()->mobile;
  58. $code = \YunShop::request()->code;
  59. $password = \YunShop::request()->password;
  60. $confirm_password = \YunShop::request()->confirm_password;
  61. $customDatas = \YunShop::request()->customDatas;
  62. $address = \YunShop::request()->address;
  63. $birthday = \YunShop::request()->birthday;
  64. $gender = \YunShop::request()->gender;
  65. $custom_value = \YunShop::request()->custom_value;
  66. $uniacid = \YunShop::app()->uniacid;
  67. $systemType = \YunShop::app()->system_type;
  68. $realname = request()->input('realname', '');
  69. $set = json_decode(\Setting::get('shop.form'), true);
  70. if ((\Request::getMethod() == 'POST')) {
  71. if ($set['base']['name_must'] == 1 && empty($realname)) {
  72. return $this->errorJson('请填写姓名');
  73. }
  74. $check_code = app('sms')->checkCode($mobile, $code);
  75. if ($check_code['status'] != 1) {
  76. return $this->errorJson($check_code['json']);
  77. }
  78. $invite_code = MemberService::inviteCode();
  79. if ($invite_code['status'] != 1) {
  80. return $this->errorJson($invite_code['json']);
  81. }
  82. $register = Setting::get('shop.register');
  83. if (isset($register['is_password']) && $register['is_password'] == 0) {
  84. $password = '';
  85. } else {
  86. $msg = MemberService::validate($mobile, $password, $confirm_password);
  87. if ($msg['status'] != 1) {
  88. return $this->errorJson($msg['json']);
  89. }
  90. }
  91. $member_info = MemberModel::getId($uniacid, $mobile);
  92. if (!empty($member_info)) {
  93. return $this->errorJson('该手机号已被注册');
  94. }
  95. //添加mc_members表
  96. $default_groupid = MemberGroup::getDefaultGroupId($uniacid)->first();
  97. $member_set = \Setting::get('shop.member');
  98. if (isset($member_set) && $member_set['headimg']) {
  99. $avatar = replace_yunshop(tomedia($member_set['headimg']));
  100. } else {
  101. $avatar = Url::shopUrl('static/images/photo-mr.jpg');
  102. }
  103. if ($birthday) {
  104. $birthday = explode('-', $birthday);
  105. }
  106. $data = array(
  107. 'uniacid' => $uniacid,
  108. 'mobile' => $mobile,
  109. 'groupid' => $default_groupid->id ? $default_groupid->id : 0,
  110. 'createtime' => time(),
  111. 'nickname' => $mobile,
  112. 'realname' => request()->input('realname', ''),
  113. 'avatar' => $avatar,
  114. 'gender' => $gender?:0,
  115. 'birthyear' => $birthday[0]?:0,
  116. 'birthmonth' => $birthday[1]?:0,
  117. 'birthday' => $birthday[2]?:0,
  118. 'residecity' => '',
  119. );
  120. $data['salt'] = Str::random(8);
  121. $data['password'] = md5($password . $data['salt']);
  122. $memberModel = MemberModel::create($data);
  123. $member_id = $memberModel->uid;
  124. //添加yz_member表
  125. $default_sub_group_id = MemberGroup::getDefaultGroupId()->first();
  126. if (!empty($default_sub_group_id)) {
  127. $default_subgroup_id = $default_sub_group_id->id;
  128. } else {
  129. $default_subgroup_id = 0;
  130. }
  131. $customDatas['customDatas'] = $customDatas;
  132. //自定义表单
  133. $member_form = (new MemberService())->updateMemberForm($customDatas);
  134. if (!empty($member_form)) {
  135. $member_form = json_encode($member_form);
  136. }
  137. $sub_data = array(
  138. 'member_id' => $member_id,
  139. 'uniacid' => $uniacid,
  140. 'group_id' => $default_subgroup_id,
  141. 'level_id' => 0,
  142. 'invite_code' => \app\frontend\modules\member\models\MemberModel::generateInviteCode(),
  143. 'member_form' => $member_form,
  144. 'province' => $address['province']?:'',
  145. 'city' => $address['city']?:'',
  146. 'area' => $address['area']?:'',
  147. 'province_name' => $address['province_name']?:'',
  148. 'city_name' => $address['city_name']?:'',
  149. 'area_name' => $address['area_name']?:'',
  150. 'address' => $address['address']?:'',
  151. 'custom_value' => $custom_value,
  152. 'system_type' => $systemType,
  153. );
  154. SubMemberModel::insertData($sub_data);
  155. //生成分销关系链
  156. Member::createRealtion($member_id);
  157. $cookieid = "__cookie_yun_shop_userid_{$uniacid}";
  158. Cookie::queue($cookieid, $member_id);
  159. Session::set('member_id', $member_id);
  160. $password = $data['password'];
  161. $member_info = MemberModel::getUserInfo($uniacid, $mobile, $password)->first();
  162. $yz_member = MemberShopInfo::getMemberShopInfo($member_id)->toArray();
  163. $data = MemberModel::userData($member_info, $yz_member);
  164. if(\YunShop::request()->positioning_success == 1)
  165. {
  166. \Log::info($member_id.'注册定位' . \YunShop::app()->uniacid);
  167. if (!is_null(\app\common\modules\shop\ShopConfig::current()->get('set_location'))) {
  168. $class = array_get(\app\common\modules\shop\ShopConfig::current()->get('set_location'), 'class');
  169. $function = array_get(\app\common\modules\shop\ShopConfig::current()->get('set_location'), 'function');
  170. $class::$function($member_id,\Yunshop\RegistrationArea\Common\models\MemberLocation::TYPE_REGISTER,\YunShop::request()->register_province,\YunShop::request()->register_city);
  171. }
  172. }
  173. event(new \app\common\events\member\RegisterMember(0, $member_id));
  174. event(new RegisterByMobile($member_info));
  175. return $this->successJson('', $data);
  176. } else {
  177. return $this->errorJson('手机号或密码格式错误');
  178. }
  179. }
  180. /**
  181. * 注册(new) todo 旧注册接口保留
  182. * @return \Illuminate\Http\JsonResponse
  183. */
  184. public function register()
  185. {
  186. try {
  187. $uniacid = \YunShop::app()->uniacid;
  188. if (request()->getMethod() != 'POST') {
  189. throw new \Exception('手机号或密码格式错误');
  190. }
  191. $request = request()->all();
  192. list($data,$sub_data) = $this->registerVerify($request);
  193. \Log::debug('---新注册---',[$data,$sub_data]);
  194. //添加mc_members表
  195. $memberModel = new MemberModel();
  196. $memberModel->fill($data);
  197. $memberModel->realname = $data['realname'];
  198. if (!$memberModel->save()) {
  199. throw new \Exception('注册失败');
  200. }
  201. $member_id = $memberModel->uid;
  202. //添加yz_member表
  203. $sub_data['member_id'] = $member_id;
  204. SubMemberModel::insertData($sub_data);
  205. //生成分销关系链
  206. Member::createRealtion($member_id);
  207. $cookieid = "__cookie_yun_shop_userid_{$uniacid}";
  208. Cookie::queue($cookieid, $member_id);
  209. Session::set('member_id', $member_id);
  210. $password = $data['password'];
  211. $member_info = MemberModel::getUserInfo($uniacid, $data['mobile'], $password)->first();
  212. $yz_member = MemberShopInfo::getMemberShopInfo($member_id)->toArray();
  213. $data = MemberModel::userData($member_info, $yz_member);
  214. if(request()->positioning_success == 1)
  215. {
  216. \Log::info($member_id.'注册定位' . \YunShop::app()->uniacid);
  217. if (!is_null(\app\common\modules\shop\ShopConfig::current()->get('set_location'))) {
  218. $class = array_get(\app\common\modules\shop\ShopConfig::current()->get('set_location'), 'class');
  219. $function = array_get(\app\common\modules\shop\ShopConfig::current()->get('set_location'), 'function');
  220. $class::$function($member_id,\Yunshop\RegistrationArea\Common\models\MemberLocation::TYPE_REGISTER,request()->register_province,request()->register_city);
  221. }
  222. }
  223. event(new \app\common\events\member\RegisterMember(0, $member_id));
  224. event(new RegisterByMobile($member_info));
  225. return $this->successJson('', $data);
  226. } catch (\Exception $e) {
  227. return $this->errorJson($e->getMessage());
  228. }
  229. }
  230. /**
  231. * 注册信息验证
  232. * @param $request
  233. * @return array[]
  234. * @throws \Exception
  235. */
  236. private function registerVerify($request)
  237. {
  238. $uniacid = \YunShop::app()->uniacid;
  239. $formSet = json_decode(Setting::get('shop.form'),true);
  240. if ($formSet['base']['basic_register']) {
  241. //基础信息-注册填写
  242. if ($formSet['base']['name'] && $formSet['base']['name_must'] && !$request['name']) {
  243. throw new \Exception('请填写姓名');
  244. }
  245. if ($formSet['base']['sex'] && $formSet['base']['sex_must'] && !$request['gender']) {
  246. throw new \Exception('请填写性别');
  247. }
  248. if ($formSet['base']['address'] && $formSet['base']['address_must'] && !$request['address']) {
  249. throw new \Exception('请填写详细地址');
  250. }
  251. if ($formSet['base']['birthday'] && $formSet['base']['birthday_must'] && !$request['birthday']) {
  252. throw new \Exception('请填写生日');
  253. }
  254. }
  255. //验证码
  256. $check_code = app('sms')->checkCode($request['mobile'], $request['code']);
  257. if ($check_code['status'] != 1) {
  258. throw new \Exception($check_code['json']);
  259. }
  260. //邀请码
  261. $invite_code = MemberService::inviteCode();
  262. if ($invite_code['status'] != 1) {
  263. throw new \Exception($invite_code['json']);
  264. }
  265. //手机号&密码
  266. $validateData = array(
  267. 'mobile' => $request['mobile'],
  268. );
  269. $validateRules = array(
  270. 'mobile' => 'required|numeric',
  271. );
  272. $validateMessage = array(
  273. 'regex' => ':attribute 格式错误',
  274. 'required' => ':attribute 不能为空',
  275. 'number' => ':attribute 格式错误',
  276. 'min' => ':attribute 最少6位'
  277. );
  278. $validateAttributes = array(
  279. "mobile" => '手机号',
  280. 'password' => '密码',
  281. );
  282. $registerSet = Setting::get('shop.register');
  283. $password = '';
  284. if (!isset($registerSet['is_password']) || $registerSet['is_password']) {
  285. $password = $request['password'];
  286. $validateData['password'] = $password;
  287. $validateRules['password'] = 'required|min:6|regex:/^[A-Za-z0-9@!#\$%\^&\*]+$/';
  288. }
  289. $validate = \Validator::make($validateData, $validateRules, $validateMessage, $validateAttributes);
  290. if ($validate->fails()) {
  291. $warnings = $validate->messages();
  292. $show_warning = $warnings->first();
  293. throw new \Exception($show_warning?:'手机号或密码格式错误');
  294. }
  295. $member_info = MemberModel::getId($uniacid, $request['mobile']);
  296. if (!empty($member_info)) {
  297. throw new \Exception('该手机号已被注册');
  298. }
  299. $memberSet = Setting::get('shop.member');
  300. //自定义字段-固定
  301. $custom_value = $request['custom_value'] ? : '';
  302. if (!$memberSet['is_custom'] || !$memberSet['is_custom_register']) {
  303. $custom_value = '';
  304. }
  305. //自定义字段
  306. $member_form = '';
  307. if ($formSet['base']['form_register']) {//注册填写开启
  308. $member_form = $form = array_values(array_sort($formSet['form'],function ($value) {
  309. return $value['sort'];
  310. }));
  311. foreach ($form as $key => &$item) {
  312. $item['del'] = 1;
  313. $member_form[$key]['value'] = $request['customDatas'][$item['pinyin']];
  314. if ($formSet['base']['form_open'] && !$member_form[$key]['value']) {
  315. throw new \Exception('自定义字段必填');
  316. }
  317. }
  318. $formSet['form'] = $form;
  319. Setting::set('shop.form', json_encode($formSet));
  320. unset($item);
  321. $member_form = $member_form ? json_encode($member_form) : '';
  322. }
  323. //添加mc_members表
  324. if (isset($member_set) && $member_set['headimg']) {
  325. $avatar = replace_yunshop(tomedia($member_set['headimg']));
  326. } else {
  327. $avatar = Url::shopUrl('static/images/photo-mr.jpg');
  328. }
  329. $birthday = $request['birthday'] ? explode('-', $request['birthday']) : [];
  330. $default_group = MemberGroup::getDefaultGroupId($uniacid)->first();
  331. $member = [
  332. 'uniacid' => \YunShop::app()->uniacid,
  333. 'mobile' => $request['mobile'],
  334. 'groupid' => $default_group->id ? : 0,
  335. 'createtime' => time(),
  336. 'nickname' => $request['mobile'],
  337. 'realname' => $request['name'] ? : '',
  338. 'avatar' => $avatar,
  339. 'gender' => $request['gender'] ? : 0,
  340. 'birthyear' => $birthday ? $birthday[0] : 0,
  341. 'birthmonth' => $birthday ? $birthday[1] : 0,
  342. 'birthday' => $birthday ? $birthday[2] : 0,
  343. 'residecity' => '',
  344. 'salt' => Str::random(8),
  345. ];
  346. $member['password'] = md5($password . $member['salt']);
  347. //添加yz_member表
  348. $default_sub_group = MemberGroup::getDefaultGroupId()->first();
  349. $yz_member = [
  350. 'uniacid' => $uniacid,
  351. 'group_id' => $default_sub_group ? $default_sub_group->id : 0,
  352. 'level_id' => 0,
  353. 'invite_code' => \app\frontend\modules\member\models\MemberModel::generateInviteCode(),
  354. 'member_form' => $member_form,
  355. 'province' => $request['address']['province'] ? : '',
  356. 'city' => $request['address']['city']?:'',
  357. 'area' => $request['address']['area']?:'',
  358. 'province_name' => $request['address']['province_name']?:'',
  359. 'city_name' => $request['address']['city_name']?:'',
  360. 'area_name' => $request['address']['area_name']?:'',
  361. 'address' => $request['address']['address']?:'',
  362. 'custom_value' => $custom_value,
  363. 'system_type' => $request['system_type'],
  364. ];
  365. return [$member,$yz_member];
  366. }
  367. public function newApiData()
  368. {
  369. if (!miniVersionCompare('1.1.137') || !versionCompare('1.1.137')) {
  370. return $this->newApiData1();
  371. }
  372. return $this->newApiData2();
  373. }
  374. public function newApiData1()
  375. {
  376. $request = request();
  377. $this->dataIntegrated($this->getInviteCode($request, true),'getInviteCode');
  378. $this->dataIntegrated(\app\frontend\controllers\SettingController::getRegisterDiyForm($request, true),'get_register_diy_form');
  379. $this->dataIntegrated(\app\frontend\controllers\SettingController::getMemberProtocol($request, true),'get_member_protocol');
  380. $this->apiData['get_captcha'] = $this->getCaptcha();
  381. if (app('plugins')->isEnabled('diyform') && $this->apiData['get_register_diy_form']['status'] == 1) {
  382. $this->dataIntegrated(\Yunshop\Diyform\api\DiyFormController::getDiyFormById($request, true, $this->apiData['get_register_diy_form']['form_id']),'get_diy_form_by_id');
  383. }
  384. // 获取后台开启会员自定义字段设置
  385. $set = \Setting::get('shop.form');
  386. $set = json_decode($set, true);
  387. $this->apiData['form_open'] = $set['base']['form_open'];
  388. $this->apiData['name_must'] = !isset($set['base']['name_must']) ? 0 : $set['base']['name_must'];
  389. if (empty($this->apiErrMsg)) {
  390. return $this->successJson('', $this->apiData);
  391. } else {
  392. return $this->errorJson($this->apiErrMsg[0]);
  393. }
  394. }
  395. public function newApiData2()
  396. {
  397. if (Client::is_weixin() && Setting::get('shop.member')['wechat_login_mode'] != '1') { //非手机号登陆
  398. return $this->successJson('', $this->redirectUrl());
  399. }
  400. $request = request();
  401. $this->dataIntegrated($this->getInviteCode($request, true),'getInviteCode');
  402. $this->dataIntegrated(\app\frontend\controllers\SettingController::getRegisterDiyForm($request, true),'get_register_diy_form');
  403. $this->dataIntegrated(\app\frontend\controllers\SettingController::getMemberProtocol($request, true),'get_member_protocol');
  404. $this->apiData['get_captcha'] = $this->getCaptcha();
  405. if (app('plugins')->isEnabled('diyform') && $this->apiData['get_register_diy_form']['status'] == 1) {
  406. $this->dataIntegrated(\Yunshop\Diyform\api\DiyFormController::getDiyFormById($request, true, $this->apiData['get_register_diy_form']['form_id']),'get_diy_form_by_id');
  407. }
  408. // 获取后台开启会员自定义字段设置
  409. $set = \Setting::get('shop.form');
  410. $set = json_decode($set, true);
  411. $this->apiData['form_open'] = $set['base']['form_open'];
  412. $this->apiData['name_must'] = !isset($set['base']['name_must']) ? 0 : $set['base']['name_must'];
  413. if (empty($this->apiErrMsg)) {
  414. return $this->successJson('', $this->apiData);
  415. } else {
  416. return $this->errorJson($this->apiErrMsg[0]);
  417. }
  418. }
  419. /**
  420. * todo 新版注册页信息接口
  421. * @return \Illuminate\Http\JsonResponse
  422. * @throws MemberNotLoginException
  423. * @throws \app\common\exceptions\ShopException
  424. */
  425. public function registerPage()
  426. {
  427. $memberSet = Setting::get('shop.member');
  428. if (Client::is_weixin() && $memberSet['wechat_login_mode'] != '1') { //非手机号登陆
  429. return $this->successJson('', $this->redirectUrl());
  430. }
  431. $returnData = [];
  432. $shop_setting = Setting::get('shop.shop');
  433. $returnData['name'] = $shop_setting['name'] ? : '商城';
  434. $registerSet = Setting::get('shop.register');
  435. $returnData['getInviteCode'] = $this->getInviteCode(request(), true);
  436. //引导标题
  437. $returnData['title1'] = $registerSet['title1'] ? : '欢迎来到['.$returnData['name'].']';
  438. $returnData['title2'] = $registerSet['title2'] ? : '登录尽享各种优惠权益!';
  439. $returnData['is_password'] = (!isset($registerSet['is_password']) || $registerSet['is_password']) ? 1 : 0;
  440. $returnData['top_img'] = $registerSet['top_img'] ? yz_tomedia($registerSet['top_img']) : '';
  441. $returnData['get_captcha'] = $this->getCaptcha();
  442. //基本信息&自定义字段
  443. $returnData['register_basic_info'] = $this->registerBasicInfo();
  444. $returnData['fixed_diy_field'] = $this->fixedDiyField();
  445. $returnData['diy_field'] = $this->diyField();
  446. $returnData['diy_form'] = $this->diyForm();
  447. $returnData['get_register_diy_form'] = [
  448. 'form_id' => $memberSet['form_id'] ? : 0,
  449. 'status' => (app('plugins')->isEnabled('diyform') && $memberSet['form_id_register'] && $memberSet['form_id']) ? 1 : 0,
  450. ];
  451. //协议
  452. $protocol = Protocol::uniacid()->first();
  453. $returnData['agreement'] = [
  454. 'status' => $protocol->status ? : 0,
  455. 'title' => $protocol->title ? : "会员注册协议",
  456. 'default_tick' => $protocol->default_tick ? : 0,
  457. 'content' => $protocol->content ? : ""
  458. ];
  459. $shopSet = Setting::get('shop.shop');
  460. $agreement = RichText::get('shop.agreement');
  461. $returnData['platform_agreement'] = [
  462. 'status' => $shopSet['is_agreement'] ? 1 : 0,
  463. 'title' => $shopSet['agreement_name'] ? : "平台协议",
  464. 'content' => $agreement ? : ""
  465. ];
  466. return $this->successJson('', $returnData);
  467. }
  468. /**
  469. * 新绑定手机号页面接口-member.register.bindApiData接口需废弃
  470. * @return \Illuminate\Http\JsonResponse
  471. */
  472. public function bindMobilePage()
  473. {
  474. $member_id = \YunShop::app()->getMemberId();
  475. $member = MemberModel::getUserInfos_v2($member_id)->first();
  476. $returnData = [
  477. 'mobile' => $member['mobile']
  478. ];
  479. $registerSet = Setting::get('shop.register');
  480. $returnData['is_password'] = $registerSet['is_password'] ? : 0;
  481. $returnData['top_img'] = $registerSet['top_img'] ? yz_tomedia($registerSet['top_img']) : '';
  482. $returnData['get_captcha'] = $this->getCaptcha();
  483. //基本信息&自定义字段
  484. $returnData['register_basic_info'] = $this->registerBasicInfo($member);
  485. $returnData['fixed_diy_field'] = $this->fixedDiyField($member);
  486. $returnData['diy_field'] = $this->diyField($member);
  487. $returnData['diy_form'] = $this->diyForm();
  488. $memberSet = Setting::get('shop.member');
  489. $returnData['get_register_diy_form'] = [
  490. 'form_id' => $memberSet['form_id'] ? : 0,
  491. 'status' => (app('plugins')->isEnabled('diyform') && $memberSet['form_id_register'] && $memberSet['form_id']) ? 1 : 0,
  492. ];
  493. //协议
  494. $shopSet = Setting::get('shop.shop');
  495. $agreement = RichText::get('shop.agreement');
  496. $returnData['agreement'] = [
  497. 'status' => $shopSet['is_agreement'] ? : 0,
  498. 'title' => $shopSet['agreement_name'] ? : "平台用户协议",
  499. 'content' => $agreement ? : ""
  500. ];
  501. return $this->successJson('', $returnData);
  502. }
  503. private function registerBasicInfo($member=[])
  504. {
  505. $formSet = json_decode(Setting::get('shop.form'),true);
  506. $show = (bool)$formSet['base']['basic_register'];
  507. $returnData[] = [
  508. 'name' => '姓名',
  509. 'field' => 'name',
  510. 'must' => $formSet['base']['name_must'] ? : 0,
  511. 'value' => $member['realname'] ? : '',
  512. 'show' => ($show && $formSet['base']['name'])
  513. ];
  514. $returnData[] = [
  515. 'name' => '性别',
  516. 'field' => 'gender',
  517. 'must' => $formSet['base']['sex_must'] ? 1 : 0,
  518. 'value' => $member['gender'] ? : 0,
  519. 'show' => ($show && $formSet['base']['sex'])
  520. ];
  521. $returnData[] = [
  522. 'name' => '详细地址',
  523. 'field' => 'address',
  524. 'must' => $formSet['base']['address_must'] ? 1 : 0,
  525. 'value' => [
  526. 'province' => $member['yz_member']['province'] ? : '',
  527. 'city' => $member['yz_member']['city'] ? : '',
  528. 'area' => $member['yz_member']['area'] ? : '',
  529. 'province_name' => $member['yz_member']['province_name'] ? : '',
  530. 'city_name' => $member['yz_member']['city_name'] ? : '',
  531. 'area_name' => $member['yz_member']['area_name'] ? : '',
  532. 'address' => $member['yz_member']['address'] ? : '',
  533. ],
  534. 'show' => ($show && $formSet['base']['address'])
  535. ];
  536. $returnData[] = [
  537. 'name' => '生日',
  538. 'field' => 'birthday',
  539. 'must' => $formSet['base']['birthday_must'] ? 1 : 0,
  540. 'value' => [
  541. 'birthyear' => $member['birthyear'] ? : '',
  542. 'birthmonth' => $member['birthmonth'] ? : '',
  543. 'birthday' => $member['birthday'] ? : '',
  544. ],
  545. 'show' => ($show && $formSet['base']['birthday'])
  546. ];
  547. return $returnData;
  548. }
  549. private function fixedDiyField($member=[])
  550. {
  551. $memberSet = Setting::get('shop.member');
  552. if (!$memberSet['is_custom_register'] || !$memberSet['is_custom']) {
  553. return [];
  554. }
  555. return [
  556. [
  557. 'name' => $memberSet['custom_title'] ? : "",
  558. 'field' => 'custom_value',
  559. 'must' => 1,
  560. 'value' => $member['yz_member']['custom_value'] ? : '',
  561. ]
  562. ];
  563. }
  564. private function diyField($member=[])
  565. {
  566. $formSet = json_decode(Setting::get('shop.form'),true);
  567. if (!$formSet['base']['form_register']) {
  568. return [];
  569. }
  570. $form = array_values(array_sort($formSet['form'], function ($value) {
  571. return $value['sort'];
  572. }));
  573. $returnData = [
  574. 'form_edit' => $formSet['base']['form_edit'] ? 1 : 0,
  575. 'form_open' => $formSet['base']['form_open'] ? 1 : 0,
  576. 'form' => []
  577. ];
  578. $member_form = $member['yz_member']['member_form']?json_decode($member['yz_member']['member_form'],true):[];
  579. $member_form = collect($member_form);
  580. foreach ($form as $item) {
  581. $has = $member_form->where('pinyin',$item['pinyin'])->first();
  582. $returnData['form'][] = [
  583. 'name' => $item['name'],
  584. 'field' => $item['pinyin'],
  585. 'value' => $has ? $has['value'] : '',
  586. ];
  587. }
  588. return $returnData;
  589. }
  590. private function diyForm()
  591. {
  592. $memberSet = Setting::get('shop.member');
  593. if (!app('plugins')->isEnabled('diyform') || !$memberSet['form_id_register'] || !$memberSet['form_id']) {
  594. return [];
  595. }
  596. $data = \Yunshop\Diyform\api\DiyFormController::getDiyFormById(request(), true, $memberSet['form_id']);
  597. return $data['json'] ? : [];
  598. }
  599. public function bindApiData()
  600. {
  601. $request = request();
  602. $this->dataIntegrated($this->getInviteCode($request, true),'getInviteCode');
  603. $this->dataIntegrated(\app\frontend\controllers\SettingController::getRegisterDiyForm($request, true),'get_register_diy_form');
  604. $this->dataIntegrated(\app\frontend\controllers\SettingController::getMemberProtocol($request, true),'get_member_protocol');
  605. $this->apiData['get_captcha'] = $this->getCaptcha();
  606. if (app('plugins')->isEnabled('diyform') && $this->apiData['get_register_diy_form']['status'] == 1) {
  607. $this->dataIntegrated(\Yunshop\Diyform\api\DiyFormController::getDiyFormById($request, true, $this->apiData['get_register_diy_form']['form_id']),'get_diy_form_by_id');
  608. }
  609. // 获取后台开启会员自定义字段设置
  610. $set = \Setting::get('shop.form');
  611. $set = json_decode($set, true);
  612. $this->apiData['form_open'] = $set['base']['form_open'];
  613. $this->apiData['name_must'] = !isset($set['base']['name_must']) ? 0 : $set['base']['name_must'];
  614. if (empty($this->apiErrMsg)) {
  615. return $this->successJson('', $this->apiData);
  616. } else {
  617. return $this->errorJson($this->apiErrMsg[0]);
  618. }
  619. }
  620. /**
  621. * 发送短信验证码
  622. *
  623. *
  624. */
  625. public function sendCode()
  626. {
  627. $mobile = \YunShop::request()->mobile;
  628. $reset_pwd = \YunShop::request()->reset;
  629. $state = \YunShop::request()->state ?: '86';
  630. if (empty($mobile)) {
  631. return $this->errorJson('请填入手机号');
  632. }
  633. try {
  634. MemberService::mobileValidate([
  635. 'mobile' => $mobile,
  636. 'state' => $state,
  637. ]);
  638. } catch (ShopException $exception) {
  639. return $this->errorJson($exception->getMessage());
  640. }
  641. $info = MemberModel::getId(\YunShop::app()->uniacid, $mobile);
  642. if (!empty($info) && empty($reset_pwd)) {
  643. return $this->errorJson('该手机号已被注册!不能获取验证码');
  644. }
  645. $sms = app('sms')->sendCode($mobile, $state);
  646. if(0 == $sms['status']){
  647. return $this->errorJson($sms['json']);
  648. }
  649. return $this->successJson();
  650. }
  651. public function alySendCode()
  652. {
  653. $mobile = \YunShop::request()->mobile;
  654. $state = \YunShop::request()->state ?: '86';
  655. $sms_type = \YunShop::request()->sms_type;
  656. if (empty($mobile)) {
  657. return $this->errorJson('请填入手机号');
  658. }
  659. try {
  660. MemberService::mobileValidate([
  661. 'mobile' => $mobile,
  662. 'state' => $state,
  663. ]);
  664. } catch (ShopException $exception) {
  665. return $this->errorJson($exception->getMessage());
  666. }
  667. if (Setting::get('shop.sms.status')) {
  668. $captcha = request()->captcha;
  669. if (!$captcha) {
  670. return $this->errorJson('图形验证码不能为空');
  671. }
  672. if (!app('captcha')->check($captcha)) {
  673. return $this->errorJson('图形验证码错误');
  674. }
  675. }
  676. if(2 == $sms_type){
  677. $sms = app('sms')->sendPwd($mobile, $state,0);
  678. }elseif(3 == $sms_type){
  679. $sms = app('sms')->sendLog($mobile, $state,0);
  680. }else{
  681. $sms = app('sms')->sendCode($mobile, $state,0);
  682. }
  683. if(0 == $sms['status']){
  684. return $this->errorJson($sms['json']);
  685. }
  686. return $this->successJson();
  687. }
  688. public function appSendCode()
  689. {
  690. $mobile = \YunShop::request()->mobile;
  691. $state = \YunShop::request()->state ?: '86';
  692. if (empty($mobile)) {
  693. return $this->errorJson('请填入手机号');
  694. }
  695. try {
  696. MemberService::mobileValidate([
  697. 'mobile' => $mobile,
  698. 'state' => $state,
  699. ]);
  700. } catch (ShopException $exception) {
  701. return $this->errorJson($exception->getMessage());
  702. }
  703. $sms = app('sms')->sendLog($mobile, $state);
  704. if(0 == $sms['status']){
  705. return $this->errorJson($sms['json']);
  706. }
  707. return $this->successJson();
  708. }
  709. public function sendCodeV2()
  710. {
  711. $mobile = \YunShop::request()->mobile;
  712. $reset_pwd = \YunShop::request()->reset;
  713. $state = \YunShop::request()->state ?: '86';
  714. $sms_type = \YunShop::request()->sms_type;
  715. if (empty($mobile)) {
  716. return $this->errorJson('请填入手机号');
  717. }
  718. try {
  719. MemberService::mobileValidate([
  720. 'mobile' => $mobile,
  721. 'state' => $state,
  722. ]);
  723. } catch (ShopException $exception) {
  724. return $this->errorJson($exception->getMessage());
  725. }
  726. $type = \YunShop::request()->type;
  727. if (empty($type)) {
  728. $type = Client::getType();
  729. }
  730. if (Setting::get('shop.sms.status')) {
  731. $captcha = request()->captcha;
  732. if (!$captcha) {
  733. return $this->errorJson('图形验证码不能为空');
  734. }
  735. if (!app('captcha')->check($captcha)) {
  736. return $this->errorJson('图形验证码错误');
  737. }
  738. }
  739. //微信登录绑定已存在的手机号
  740. $member_info = MemberModel::getId(\YunShop::app()->uniacid, $mobile);
  741. $unique_info = MemberUniqueModel::getUnionidInfoByMemberId(\YunShop::app()->uniacid, $member_info['uid'])->first();
  742. $fans_info = McMappingFans::getFansById($member_info['uid']);
  743. $mini_info = MemberMiniAppModel::getFansById($member_info['uid']);
  744. $wechat_info = MemberWechatModel::getFansById($member_info['uid']);
  745. $ali_info = MemberAlipay::getFansById($member_info['uid']);
  746. if ($type!=8&&($unique_info||$fans_info||$mini_info||$wechat_info)&&!$reset_pwd) {
  747. return $this->errorJson('该手机号已被绑定!不能获取验证码');
  748. }
  749. if ($type==8&&$ali_info&&!$reset_pwd) {
  750. return $this->errorJson('该手机号已被注册!不能获取验证码');
  751. }
  752. if ($type==5&&!request()->scope&&$member_info&&!$reset_pwd) { //request()->scope tjpcps
  753. return $this->errorJson('该手机号已被注册!不能获取验证码');
  754. }
  755. try {
  756. if (2 == $sms_type) {
  757. $sms = app('sms')->sendPwd($mobile, $state);
  758. } elseif (3 == $sms_type) {
  759. $sms = app('sms')->sendLog($mobile, $state);
  760. } else {
  761. $sms = app('sms')->sendCode($mobile, $state);
  762. }
  763. } catch (\Exception $e) {
  764. return $this->errorJson('请检查后台短信配置');
  765. }
  766. if (0 == $sms['status']) {
  767. return $this->errorJson('请检查后台短信配置');
  768. }
  769. return $this->successJson();
  770. }
  771. public function sendWithdrawCode()
  772. {
  773. $mobile = \YunShop::request()->mobile;
  774. $state = \YunShop::request()->state ?: '86';
  775. if (empty($mobile)) {
  776. return $this->errorJson('请填入手机号');
  777. }
  778. try {
  779. MemberService::mobileValidate([
  780. 'mobile' => $mobile,
  781. 'state' => $state,
  782. ]);
  783. } catch (ShopException $exception) {
  784. return $this->errorJson($exception->getMessage());
  785. }
  786. $sms = app('sms')->sendCode($mobile);
  787. if (0 == $sms['status']) {
  788. return $this->errorJson($sms['json']);
  789. }
  790. return $this->successJson();
  791. }
  792. /**
  793. * 发送短信
  794. *
  795. * @param $mobile
  796. * @param $code
  797. * @param string $templateType
  798. * @return array|mixed
  799. */
  800. public function sendSmsV2($mobile, $code, $state, $templateType = 'reg', $sms_type = 1)
  801. {
  802. //增加验证码验证
  803. $captcha_status = Setting::get('shop.sms.status');
  804. if ($captcha_status == 1) {
  805. if (app('captcha')->check(Input::get('captcha')) == false) {
  806. return $this->errorJson('图形验证码错误');
  807. }
  808. }
  809. $sms = app('sms')->sendCode($mobile, $state);
  810. if(0 == $sms['status']){
  811. return $this->errorJson($sms['json']);
  812. }
  813. return $this->successJson();
  814. }
  815. /**
  816. * 短信验证
  817. *
  818. * @return \Illuminate\Http\JsonResponse
  819. */
  820. public function checkCode()
  821. {
  822. $mobile = \YunShop::request()->mobile;
  823. $uniacid = \YunShop::app()->uniacid;
  824. $check_code = MemberService::checkCode();
  825. $member_info = MemberModel::getId($uniacid, $mobile);
  826. if (empty($member_info)) {
  827. return $this->errorJson('手机号不存在');
  828. }
  829. if ($check_code['status'] != 1) {
  830. return $this->errorJson($check_code['json']);
  831. }
  832. return $this->successJson('ok');
  833. }
  834. /**
  835. * 修改密码
  836. *
  837. * @return \Illuminate\Http\JsonResponse
  838. */
  839. public function changePassword()
  840. {
  841. $mobile = \YunShop::request()->mobile;
  842. $password = \YunShop::request()->password;
  843. // $confirm_password = \YunShop::request()->confirm_password;
  844. $uniacid = \YunShop::app()->uniacid;
  845. $code = \YunShop::request()->code;
  846. if ((\Request::getMethod() == 'POST')) {
  847. $check_code = app('sms')->checkCode($mobile, $code);
  848. if ($check_code['status'] != 1) {
  849. return $this->errorJson($check_code['json']);
  850. }
  851. $msg = MemberService::validate($mobile, $password);
  852. if ($msg['status'] != 1) {
  853. return $this->errorJson($msg['json']);
  854. }
  855. $member_info = MemberModel::getId($uniacid, $mobile);
  856. if (empty($member_info)) {
  857. return $this->errorJson('该手机号不存在');
  858. }
  859. //更新密码
  860. $data['salt'] = Str::random(8);
  861. $data['password'] = md5($password . $data['salt']);
  862. MemberModel::updataData($member_info->uid, $data);
  863. $member_id = $member_info->uid;
  864. $password = $data['password'];
  865. $member_info = MemberModel::getUserInfo($uniacid, $mobile, $password)->first();
  866. $yz_member = MemberShopInfo::getMemberShopInfo($member_id)->toArray();
  867. $data = MemberModel::userData($member_info, $yz_member);
  868. return $this->successJson('修改密码成功', $data);
  869. } else {
  870. return $this->errorJson('手机号或密码格式错误');
  871. }
  872. }
  873. public function getInviteCode(Request $request, $integrated = null)
  874. {
  875. $close = \YunShop::request()->close;
  876. $required = intval(\Setting::get('shop.member.required'));
  877. $is_invite = intval(\Setting::get('shop.member.is_invite'));
  878. $mid = \YunShop::request()->get('mid');
  879. $member_id = \YunShop::app()->getMemberId();
  880. $default_invite = \Setting::get('shop.member.default_invite');//默认邀请码
  881. if($is_invite == 1){
  882. $up_yz_member = MemberShopInfo::select(['invite_code','status','is_agent'])->where('member_id',$mid)->first();
  883. if($mid == $member_id || ($up_yz_member->status != 2 && $up_yz_member->is_agent != 1)){
  884. $invitation_code = '';
  885. }else{
  886. $invitation_code = $up_yz_member;
  887. }
  888. }
  889. // 国家区号是否显示
  890. $country_code = 0; // 默认关闭
  891. $sms = \Setting::get('shop.sms');
  892. if (isset($sms['country_code'])) {
  893. $country_code = $sms['country_code'];
  894. }
  895. if (isset($close) && 1 == $close) {
  896. $is_invite = 0;
  897. $required = 0;
  898. }
  899. $data = [
  900. 'status' => $is_invite,
  901. 'required' => $required,
  902. 'country_code' => $country_code,
  903. 'invitation_code'=>$invitation_code,
  904. 'default_invite' => $default_invite ?: '',
  905. ];
  906. if(is_null($integrated)){
  907. return $this->successJson('返回数据成功',$data);
  908. }else{
  909. return show_json(1,$data);
  910. }
  911. }
  912. public function chkRegister()
  913. {
  914. $member = Setting::get('shop.member');
  915. $shop_reg_close = !empty($member['get_register']) ? $member['get_register'] : 0;
  916. $app_reg_close = 0;
  917. $msg = $member["Close_describe"] ?: '注册已关闭';//关闭原因
  918. $list = [];
  919. //$list['state']= $shop_reg_close;
  920. $list['state'] = $list['state'] = $shop_reg_close;
  921. if (!is_null($app_set = \Setting::get('shop_app.pay')) && 0 == $app_set['phone_oauth']) {
  922. $app_reg_close = 1;
  923. }
  924. if (($shop_reg_close && !Client::is_app()) || ($app_reg_close && Client::is_app())) {
  925. $list['reason'] = $msg;
  926. return $this->errorJson('失败', $list);
  927. }
  928. return $this->successJson('返回数据成功',$list);
  929. }
  930. private function getCaptcha()
  931. {
  932. //增加验证码功能
  933. $status = \Setting::get('shop.sms.status');
  934. if ($status == 1) {
  935. $result['captcha'] = app('captcha')->create('default', true);
  936. $result['captcha']['status'] = $status;
  937. } else {
  938. $result['captcha']['status'] = $status;
  939. }
  940. return $result;
  941. }
  942. /**
  943. * @throws MemberNotLoginException
  944. * @throws \app\common\exceptions\ShopException
  945. */
  946. private function redirectUrl()
  947. {
  948. $client = 1;
  949. $uniacid = \YunShop::app()->uniacid;
  950. $member = MemberFactory::create($client);
  951. if ($member->checkLogged()) {
  952. return ['status' => 'redirec', 'url' => Url::absoluteApp('member/editmobile', ['i' => $uniacid, 'mid' => Member::getMid()])];
  953. } else {
  954. throw new MemberNotLoginException('请登录', $_SERVER['QUERY_STRING']);
  955. }
  956. }
  957. }