Member.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <?php
  2. /**
  3. * Member.php
  4. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  5. * =========================================================
  6. * Copy right 2015-2025 杭州牛之云科技有限公司, 保留所有权利。
  7. * ----------------------------------------------
  8. * 官方网址: https://www.niushop.com
  9. * =========================================================
  10. * @author : niuteam
  11. * @date : 2022.8.8
  12. * @version : v5.0.0.1
  13. */
  14. namespace app\api\controller;
  15. use app\model\member\Member as MemberModel;
  16. use app\model\member\MemberAccount;
  17. use app\model\member\Register as RegisterModel;
  18. use app\model\message\Message;
  19. use think\facade\Cache;
  20. use app\model\member\MemberLevel as MemberLevelModel;
  21. class Member extends BaseApi
  22. {
  23. /**
  24. * 基础信息
  25. */
  26. public function info()
  27. {
  28. $token = $this->checkToken();
  29. if ($token[ 'code' ] < 0) return $this->response($token);
  30. $member_model = new MemberModel();
  31. $info = $member_model->getMemberInfo([ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ], 'member_id,source_member,username,nickname,mobile,email,password,status,headimg,member_level,member_level_name,member_label,member_label_name,qq,qq_openid,wx_openid,wx_unionid,ali_openid,baidu_openid,toutiao_openid,douyin_openid,realname,sex,location,birthday,point,balance,balance_money,growth,sign_days_series,password,member_level_type,level_expire_time,is_edit_username,is_fenxiao,province_id,city_id,district_id,community_id,address,full_address,longitude,latitude,member_code');
  32. if (!empty($info[ 'data' ])) {
  33. $info[ 'data' ][ 'password' ] = empty($info[ 'data' ][ 'password' ]) ? 0 : 1;
  34. $member_level_model = new MemberLevelModel();
  35. $member_level_result = $member_level_model->getMemberLevelInfo([ [ 'level_id', '=', $info[ 'data' ][ 'member_level' ] ] ]);
  36. $member_level = $member_level_result[ 'data' ] ?? [];
  37. $info[ 'data' ][ 'member_level_info' ] = $member_level;
  38. }
  39. return $this->response($info);
  40. }
  41. /**
  42. * 修改会员头像
  43. * @return string
  44. */
  45. public function modifyheadimg()
  46. {
  47. $token = $this->checkToken();
  48. if ($token[ 'code' ] < 0) return $this->response($token);
  49. $headimg = isset($this->params[ 'headimg' ]) ? $this->params[ 'headimg' ] : '';
  50. $member_model = new MemberModel();
  51. $res = $member_model->editMember([ 'headimg' => $headimg ], [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  52. return $this->response($res);
  53. }
  54. /**
  55. * 修改用户名
  56. * @return false|string
  57. */
  58. public function modifyUsername()
  59. {
  60. $token = $this->checkToken();
  61. if ($token[ 'code' ] < 0) return $this->response($token);
  62. $username = isset($this->params[ 'username' ]) ? $this->params[ 'username' ] : '';
  63. $member_model = new MemberModel();
  64. $res = $member_model->editUsername($this->member_id, $this->site_id, $username);
  65. return $this->response($res);
  66. }
  67. /**
  68. * 修改昵称
  69. * @return string
  70. */
  71. public function modifynickname()
  72. {
  73. $token = $this->checkToken();
  74. if ($token[ 'code' ] < 0) return $this->response($token);
  75. $nickname = isset($this->params[ 'nickname' ]) ? $this->params[ 'nickname' ] : '';
  76. $nickname = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $nickname);
  77. $member_model = new MemberModel();
  78. $res = $member_model->editMember([ 'nickname' => $nickname ], [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  79. return $this->response($res);
  80. }
  81. /**
  82. * 修改手机号
  83. * @return string
  84. */
  85. public function modifymobile()
  86. {
  87. $token = $this->checkToken();
  88. if ($token[ 'code' ] < 0) return $this->response($token);
  89. // 校验验证码
  90. $captcha = new Captcha();
  91. $check_res = $captcha->checkCaptcha(false);
  92. if ($check_res[ 'code' ] < 0) return $this->response($check_res);
  93. $register = new RegisterModel();
  94. $exist = $register->mobileExist($this->params[ 'mobile' ], $this->site_id);
  95. if ($exist) {
  96. return $this->response($this->error("", "手机号已存在"));
  97. } else {
  98. $key = $this->params[ 'key' ];
  99. $verify_data = Cache::get($key);
  100. if (!empty($verify_data) && $verify_data[ "mobile" ] == $this->params[ "mobile" ] && $verify_data[ "code" ] == $this->params[ "code" ]) {
  101. $mobile = isset($this->params[ 'mobile' ]) ? $this->params[ 'mobile' ] : '';
  102. $member_model = new MemberModel();
  103. $res = $member_model->editMember([ 'mobile' => $mobile ], [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  104. } else {
  105. $res = $this->error("", "动态码不正确");
  106. }
  107. return $this->response($res);
  108. }
  109. }
  110. /**
  111. * 修改密码
  112. * @return string
  113. */
  114. public function modifypassword()
  115. {
  116. $token = $this->checkToken();
  117. if ($token[ 'code' ] < 0) return $this->response($token);
  118. $old_password = isset($this->params[ 'old_password' ]) ? $this->params[ 'old_password' ] : '';
  119. $new_password = isset($this->params[ 'new_password' ]) ? $this->params[ 'new_password' ] : '';
  120. $member_model = new MemberModel();
  121. $info = $member_model->getMemberInfo([ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ], 'password');
  122. // 未设置密码时设置密码需验证身份
  123. if (empty($info[ 'data' ][ 'password' ])) {
  124. $key = $this->params[ 'key' ] ?? '';
  125. $code = $this->params[ 'code' ] ?? '';
  126. $verify_data = Cache::get($key);
  127. if (empty($verify_data) || $verify_data[ "code" ] != $code) {
  128. return $this->response($this->error("", "手机验证码不正确"));
  129. }
  130. }
  131. $res = $member_model->modifyMemberPassword($token[ 'data' ][ 'member_id' ], $old_password, $new_password);
  132. return $this->response($res);
  133. }
  134. /**
  135. * 绑定短信验证码
  136. */
  137. public function bindmobliecode()
  138. {
  139. // 校验验证码
  140. $captcha = new Captcha();
  141. $check_res = $captcha->checkCaptcha(false);
  142. if ($check_res[ 'code' ] < 0) return $this->response($check_res);
  143. $mobile = $this->params[ 'mobile' ];//注册手机号
  144. $register = new RegisterModel();
  145. $exist = $register->mobileExist($mobile, $this->site_id);
  146. if ($exist) {
  147. return $this->response($this->error("", "当前手机号已存在"));
  148. } else {
  149. $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);// 生成4位随机数,左侧补0
  150. $message_model = new Message();
  151. $res = $message_model->sendMessage([ 'type' => 'code', "mobile" => $mobile, "site_id" => $this->site_id, "code" => $code, "support_type" => [ "sms" ], "keywords" => "MEMBER_BIND" ]);
  152. if ($res[ "code" ] >= 0) {
  153. //将验证码存入缓存
  154. $key = 'bind_mobile_code_' . md5(uniqid(null, true));
  155. Cache::tag("bind_mobile_code")->set($key, [ 'mobile' => $mobile, 'code' => $code ], 600);
  156. return $this->response($this->success([ "key" => $key ]));
  157. } else {
  158. return $this->response($res);
  159. }
  160. }
  161. }
  162. /**
  163. * 设置密码时获取验证码
  164. */
  165. public function pwdmobliecode()
  166. {
  167. $token = $this->checkToken();
  168. if ($token[ 'code' ] < 0) return $this->response($token);
  169. // 校验验证码
  170. $captcha = new Captcha();
  171. $check_res = $captcha->checkCaptcha(false);
  172. if ($check_res[ 'code' ] < 0) return $this->response($check_res);
  173. $member_model = new MemberModel();
  174. $info = $member_model->getMemberInfo([ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ], 'mobile');
  175. if (empty($info[ 'data' ])) return $this->response($this->error([], '未获取到会员信息!'));
  176. if (empty($info[ 'data' ][ 'mobile' ])) return $this->response($this->error([], '会员信息尚未绑定手机号!'));
  177. $mobile = $info[ 'data' ][ 'mobile' ];
  178. $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);// 生成4位随机数,左侧补0
  179. $message_model = new Message();
  180. $res = $message_model->sendMessage([ 'type' => 'code', "mobile" => $mobile, "site_id" => $this->site_id, "code" => $code, "support_type" => [ "sms" ], "keywords" => "SET_PASSWORD" ]);
  181. if (isset($res[ "code" ]) && $res[ "code" ] >= 0) {
  182. //将验证码存入缓存
  183. $key = 'password_mobile_code_' . md5(uniqid(null, true));
  184. Cache::tag("password_mobile_code_")->set($key, [ 'mobile' => $mobile, 'code' => $code ], 600);
  185. return $this->response($this->success([ "key" => $key, 'code' => $code ]));
  186. } else {
  187. return $this->response($this->error('', '发送失败'));
  188. }
  189. }
  190. /**
  191. * 验证手机号
  192. * @return string
  193. */
  194. public function checkmobile()
  195. {
  196. $mobile = isset($this->params[ 'mobile' ]) ? $this->params[ 'mobile' ] : '';
  197. if (empty($mobile)) {
  198. return $this->response($this->error('', 'REQUEST_MOBILE'));
  199. }
  200. $member_model = new MemberModel();
  201. $condition = [
  202. [ 'mobile', '=', $mobile ],
  203. [ 'site_id', '=', $this->site_id ]
  204. ];
  205. $res = $member_model->getMemberCount($condition);
  206. if ($res[ 'data' ] > 0) {
  207. return $this->response($this->error('', '当前手机号已存在'));
  208. }
  209. return $this->response($this->success());
  210. }
  211. /**
  212. * 修改支付密码
  213. * @return string
  214. */
  215. public function modifypaypassword()
  216. {
  217. $token = $this->checkToken();
  218. if ($token[ 'code' ] < 0) return $this->response($token);
  219. $key = $this->params[ 'key' ] ?? '';
  220. $code = $this->params[ 'code' ] ?? '';
  221. $password = isset($this->params[ 'password' ]) ? trim($this->params[ 'password' ]) : '';
  222. if (empty($password)) return $this->response($this->error('', '支付密码不可为空'));
  223. $verify_data = Cache::get($key);
  224. if ($verify_data[ "code" ] == $this->params[ "code" ]) {
  225. $member_model = new MemberModel();
  226. $res = $member_model->modifyMemberPayPassword($token[ 'data' ][ 'member_id' ], $password);
  227. } else {
  228. $res = $this->error("", "验证码不正确");
  229. }
  230. return $this->response($res);
  231. }
  232. /**
  233. * 检测会员是否设置支付密码
  234. */
  235. public function issetpayaassword()
  236. {
  237. $token = $this->checkToken();
  238. if ($token[ 'code' ] < 0) return $this->response($token);
  239. $member_model = new MemberModel();
  240. $res = $member_model->memberIsSetPayPassword($this->member_id);
  241. return $this->response($res);
  242. }
  243. /**
  244. * 检测支付密码是否正确
  245. */
  246. public function checkpaypassword()
  247. {
  248. $token = $this->checkToken();
  249. if ($token[ 'code' ] < 0) return $this->response($token);
  250. $password = isset($this->params[ 'pay_password' ]) ? trim($this->params[ 'pay_password' ]) : '';
  251. if (empty($password)) return $this->response($this->error('', '支付密码不可为空'));
  252. $member_model = new MemberModel();
  253. $res = $member_model->checkPayPassword($this->member_id, $password);
  254. return $this->response($res);
  255. }
  256. /**
  257. *
  258. * 修改支付密码发送手机验证码
  259. */
  260. public function paypwdcode()
  261. {
  262. $token = $this->checkToken();
  263. if ($token[ 'code' ] < 0) return $this->response($token);
  264. $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);// 生成4位随机数,左侧补0
  265. $message_model = new Message();
  266. $res = $message_model->sendMessage([ 'type' => 'code', "member_id" => $this->member_id, "site_id" => $this->site_id, "code" => $code, "support_type" => [ "sms" ], "keywords" => "MEMBER_PAY_PASSWORD" ]);
  267. if ($res[ "code" ] >= 0) {
  268. //将验证码存入缓存
  269. $key = 'pay_password_code_' . md5(uniqid(null, true));
  270. Cache::tag("pay_password_code")->set($key, [ 'member_id' => $this->member_id, 'code' => $code ], 600);
  271. return $this->response($this->success([ "key" => $key ]));
  272. } else {
  273. return $this->response($res);
  274. }
  275. }
  276. /**
  277. * 验证修改支付密码动态码
  278. */
  279. public function verifypaypwdcode()
  280. {
  281. $key = isset($this->params[ 'key' ]) ? trim($this->params[ 'key' ]) : '';
  282. $verify_data = Cache::get($key);
  283. if ($verify_data[ "code" ] == $this->params[ "code" ]) {
  284. $res = $this->success([]);
  285. } else {
  286. $res = $this->error("", "验证码不正确");
  287. }
  288. return $this->response($res);
  289. }
  290. /**
  291. * 通过token得到会员id
  292. */
  293. public function id()
  294. {
  295. $token = $this->checkToken();
  296. if ($token[ 'code' ] < 0) return $this->response($token);
  297. return $this->response($this->success($this->member_id));
  298. }
  299. /**
  300. * 账户奖励规则说明
  301. * @return false|string
  302. */
  303. public function accountrule()
  304. {
  305. //积分
  306. $point = event('MemberAccountRule', [ 'account' => 'point', 'site_id' => $this->site_id ]);
  307. //余额
  308. $balance = event('MemberAccountRule', [ 'account' => 'balance', 'site_id' => $this->site_id ]);
  309. //成长值
  310. $growth = event('MemberAccountRule', [ 'account' => 'growth', 'site_id' => $this->site_id ]);
  311. $res = [
  312. 'point' => $point,
  313. 'balance' => $balance,
  314. 'growth' => $growth
  315. ];
  316. return $this->response($this->success($res));
  317. }
  318. /**
  319. * 拉取会员头像
  320. */
  321. public function pullheadimg()
  322. {
  323. $member_id = input('member_id', '');
  324. $member = new MemberModel();
  325. $member->pullHeadimg($member_id);
  326. }
  327. /**
  328. * 修改真实姓名
  329. */
  330. public function modifyrealname()
  331. {
  332. $token = $this->checkToken();
  333. if ($token[ 'code' ] < 0) return $this->response($token);
  334. $realname = isset($this->params[ 'realname' ]) ? $this->params[ 'realname' ] : '';
  335. $member_model = new MemberModel();
  336. $res = $member_model->editMember([ 'realname' => $realname ], [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  337. return $this->response($res);
  338. }
  339. /**
  340. * 修改性别
  341. */
  342. public function modifysex()
  343. {
  344. $token = $this->checkToken();
  345. if ($token[ 'code' ] < 0) return $this->response($token);
  346. $sex = isset($this->params[ 'sex' ]) ? $this->params[ 'sex' ] : 0;
  347. $member_model = new MemberModel();
  348. $res = $member_model->editMember([ 'sex' => $sex ], [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  349. return $this->response($res);
  350. }
  351. /**
  352. * 修改生日
  353. */
  354. public function modifybirthday()
  355. {
  356. $token = $this->checkToken();
  357. if ($token[ 'code' ] < 0) return $this->response($token);
  358. $birthday = isset($this->params[ 'birthday' ]) ? $this->params[ 'birthday' ] : '';
  359. $member_model = new MemberModel();
  360. $res = $member_model->editMember([ 'birthday' => $birthday ], [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  361. return $this->response($res);
  362. }
  363. /**
  364. * 生成会员二维码
  365. */
  366. public function membereqrcode()
  367. {
  368. $token = $this->checkToken();
  369. if ($token[ 'code' ] < 0) return $this->response($token);
  370. $member_id = $token[ 'data' ][ 'member_id' ];
  371. $member_model = new MemberModel();
  372. $member_info = $member_model->getMemberInfo([ ['member_id', '=', $member_id] ], 'member_code,mobile')['data'] ?? [];
  373. if (!empty($member_info['member_code'])) {
  374. $number = $member_info['member_code'];
  375. } elseif (!empty($member_info['mobile'])) {
  376. $number = $member_info['mobile'];
  377. }
  378. // 二维码
  379. $qrcode_dir = 'upload/qrcode/qrcodereduceaccount';
  380. if (!is_dir($qrcode_dir) && !mkdir($qrcode_dir, intval('0755', 8), true)) {
  381. return $this->error('', '会员码生成失败');
  382. }
  383. $qrcode_name = 'memberqrcode_' . $member_id . '_' . $this->site_id;
  384. // 二维码
  385. $res = event('Qrcode', [
  386. 'site_id' => $this->site_id,
  387. 'app_type' => 'h5',
  388. 'type' => 'create',
  389. 'data' => [ 'number' => $number ],
  390. 'page' => $this->params[ 'page' ] ? : '',
  391. 'qrcode_path' => 'upload/qrcode/qrcodereduceaccount',
  392. 'qrcode_name' => 'memberqrcode_' . $member_id . '_' . $this->site_id,
  393. 'qrcode_size' => 16
  394. ], true);
  395. $bar_code = getBarcode($number, '', 3);
  396. $res[ 'bar_code' ] = $bar_code;
  397. $res[ 'member_code' ] = $number;
  398. // 动态码
  399. $dynamic_number = NoRand(0, 9, 4);
  400. $res[ 'dynamic_number' ] = $dynamic_number;
  401. return $this->response($res);
  402. }
  403. //更改分享人信息
  404. public function alterShareRelation()
  405. {
  406. $token = $this->checkToken();
  407. if ($token[ 'code' ] < 0) return $this->response($token);
  408. $share_member = $this->params[ 'share_member' ] ?? 0;
  409. if (empty($share_member)) {
  410. return $this->response($this->error(null, "未传分享人id!"));
  411. }
  412. $member_model = new MemberModel();
  413. $result = $member_model->alterShareRelation($this->member_id, $share_member, $this->site_id);
  414. return $this->response($result);
  415. }
  416. /**
  417. * 修改会员地址
  418. * @return false|string
  419. */
  420. public function modifyaddress(){
  421. $token = $this->checkToken();
  422. if ($token[ 'code' ] < 0) return $this->response($token);
  423. $data = [
  424. 'province_id' => $this->params['province_id'] ?? 0,
  425. 'city_id' => $this->params['city_id'] ?? 0,
  426. 'district_id' => $this->params['district_id'] ?? 0,
  427. 'address' => $this->params['address'] ?? '',
  428. 'full_address' => $this->params['full_address'] ?? ''
  429. ];
  430. $member_model = new MemberModel();
  431. $res = $member_model->editMember($data, [ [ 'member_id', '=', $token[ 'data' ][ 'member_id' ], [ 'site_id', '=', $this->site_id ] ] ]);
  432. return $this->response($res);
  433. }
  434. /**
  435. * 手机号授权绑定
  436. */
  437. public function mobileAuth(){
  438. $token = $this->checkToken();
  439. if ($token[ 'code' ] < 0) return $this->response($token);
  440. $decrypt_data = event('PhoneNumber', $this->params, true);
  441. if (empty($decrypt_data)) return $this->error('', '没有获取手机号的渠道');
  442. if ($decrypt_data[ 'code' ] < 0) return $this->response($decrypt_data);
  443. $this->params[ 'mobile' ] = $decrypt_data[ 'data' ];
  444. $register = new RegisterModel();
  445. $exist = $register->mobileExist($this->params[ 'mobile' ], $this->site_id);
  446. if ($exist) {
  447. return $this->response($this->error("", "手机号已存在"));
  448. } else {
  449. $mobile = isset($this->params[ 'mobile' ]) ? $this->params[ 'mobile' ] : '';
  450. $member_model = new MemberModel();
  451. $res = $member_model->editMember([ 'mobile' => $mobile ], [ [ 'member_id', '=', $this->member_id], [ 'site_id', '=', $this->site_id ] ]);
  452. return $this->response($res);
  453. }
  454. }
  455. }