UserOpen.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace app\api\model\user;
  3. use app\api\model\plus\agent\Referee as RefereeModel;
  4. use think\facade\Cache;
  5. use app\common\exception\BaseException;
  6. use app\common\model\user\User as UserModel;
  7. use app\common\model\user\Sms as SmsModel;
  8. use app\common\model\user\Grade as GradeModel;
  9. /**
  10. * 公众号用户模型类
  11. */
  12. class UserOpen extends UserModel
  13. {
  14. private $token;
  15. /**
  16. * 隐藏字段
  17. */
  18. protected $hidden = [
  19. 'open_id',
  20. 'is_delete',
  21. 'app_id',
  22. 'create_time',
  23. 'update_time'
  24. ];
  25. /**
  26. * 用户登录
  27. */
  28. public function login($userInfo, $referee_id = null)
  29. {
  30. // 自动注册用户
  31. $user_id = $this->register($userInfo, $referee_id);
  32. // 生成token (session3rd)
  33. $this->token = $this->token($userInfo['openid']);
  34. // 记录缓存, 7天
  35. Cache::set($this->token, $user_id, 86400 * 7);
  36. return $user_id;
  37. }
  38. /**
  39. * 获取token
  40. */
  41. public function getToken()
  42. {
  43. return $this->token;
  44. }
  45. /**
  46. * 生成用户认证的token
  47. */
  48. private function token($openid)
  49. {
  50. return md5($openid . 'token_salt');
  51. }
  52. /**
  53. * 自动注册用户
  54. */
  55. private function register($userInfo, $referee_id = null)
  56. {
  57. $data = [];
  58. //通过unionid查询用户是否存在
  59. $user = null;
  60. if (isset($userInfo['unionid']) && !empty($userInfo['unionid'])) {
  61. $data['union_id'] = $userInfo['unionid'];
  62. $user = self::detailByUnionid($userInfo['unionid']);
  63. }
  64. // 查询用户是否已存在
  65. if (!$user) {
  66. $user = self::detail(['appopen_id' => $userInfo['openid']]);
  67. }
  68. if ($user) {
  69. $model = $user;
  70. } else {
  71. $model = $this;
  72. $data['referee_id'] = $referee_id;
  73. $data['reg_source'] = 'app';
  74. }
  75. $data['appopen_id'] = $userInfo['openid'];
  76. // 用户昵称
  77. if (!$user) {
  78. $data['nickName'] = preg_replace('/[\xf0-\xf7].{3}/', '', $userInfo['nickname']);
  79. }
  80. $data['avatarUrl'] = $userInfo['headimgurl'];
  81. $data['gender'] = $userInfo['sex'];
  82. $data['province'] = $userInfo['province'];
  83. $data['country'] = $userInfo['country'];
  84. $data['city'] = $userInfo['city'];
  85. $data['reg_source'] = 'app';
  86. try {
  87. $this->startTrans();
  88. // 保存/更新用户记录
  89. if (!$model->save(array_merge($data, [
  90. 'app_id' => self::$app_id
  91. ]))
  92. ) {
  93. throw new BaseException(['msg' => '用户注册失败']);
  94. }
  95. if (!$user && $referee_id > 0) {
  96. // 记录推荐人关系,
  97. RefereeModel::createRelation($model['user_id'], $referee_id);
  98. //更新用户邀请数量
  99. (new UserModel())->where('user_id', '=', $referee_id)->inc('total_invite')->update();
  100. }
  101. $this->commit();
  102. } catch (\Exception $e) {
  103. $this->rollback();
  104. throw new BaseException(['msg' => $e->getMessage()]);
  105. }
  106. return $model['user_id'];
  107. }
  108. /**
  109. * 手机号密码用户登录
  110. */
  111. public function phoneLogin($data)
  112. {
  113. $user = $this->where('mobile', '=', $data['mobile'])
  114. ->where('password', '=', md5($data['password']))
  115. ->order('user_id desc')
  116. ->find();
  117. if (!$user) {
  118. $this->error = '手机号或密码错误';
  119. return false;
  120. } else {
  121. if ($user['is_delete'] == 1) {
  122. $this->error = '手机号被禁止或删除,请联系客服';
  123. return false;
  124. }
  125. $user_id = $user['user_id'];
  126. $mobile = $user['mobile'];
  127. }
  128. // 生成token (session3rd)
  129. $this->token = $this->token($mobile);
  130. // 记录缓存, 30天
  131. Cache::tag('cache')->set($this->token, $user_id, 86400 * 30);
  132. return $user_id;
  133. }
  134. /**
  135. * 手机号密码用户登录
  136. */
  137. public function smslogin($data)
  138. {
  139. if (!$this->check($data)) {
  140. return false;
  141. }
  142. $user = $this->where('mobile', '=', $data['mobile'])->order('user_id desc')->find();
  143. if (!$user) {
  144. $this->error = '手机号不存在';
  145. return false;
  146. } else {
  147. if ($user['is_delete'] == 1) {
  148. $this->error = '手机号被禁止或删除,请联系客服';
  149. return false;
  150. }
  151. $user_id = $user['user_id'];
  152. $mobile = $user['mobile'];
  153. }
  154. // 生成token (session3rd)
  155. $this->token = $this->token($mobile);
  156. // 记录缓存, 30天
  157. Cache::tag('cache')->set($this->token, $user_id, 86400 * 30);
  158. return $user_id;
  159. }
  160. /*
  161. *重置密码
  162. */
  163. public function resetpassword($data)
  164. {
  165. if (!$this->check($data)) {
  166. return false;
  167. }
  168. $user = $this->where('mobile', '=', $data['mobile'])->order('user_id desc')->find();
  169. if ($user) {
  170. if ($user['is_delete'] == 1) {
  171. $this->error = '手机号被禁止或删除,请联系客服';
  172. return false;
  173. }
  174. return $this->where('mobile', '=', $data['mobile'])->update([
  175. 'password' => md5($data['password'])
  176. ]);
  177. } else {
  178. $this->error = '手机号不存在';
  179. return false;
  180. }
  181. }
  182. /*
  183. *手机号注册
  184. */
  185. public function phoneRegister($data)
  186. {
  187. if (!$this->check($data)) {
  188. return false;
  189. }
  190. $user = $this->where('mobile', '=', $data['mobile'])->find();
  191. if (!$user) {
  192. return $this->save([
  193. 'mobile' => $data['mobile'],
  194. 'reg_source' => 'app',
  195. //默认等级
  196. 'grade_id' => GradeModel::getDefaultGradeId(),
  197. 'app_id' => self::$app_id,
  198. 'password' => md5($data['password'])
  199. ]);
  200. } else {
  201. $this->error = '手机号已存在';
  202. return false;
  203. }
  204. }
  205. /**
  206. * 验证
  207. */
  208. private function check($data)
  209. {
  210. //判断验证码是否过期、是否正确
  211. $sms_model = new SmsModel();
  212. $sms_record_list = $sms_model
  213. ->where('mobile', '=', $data['mobile'])
  214. ->order(['create_time' => 'desc'])
  215. ->limit(1)->select();
  216. // 测试
  217. if($data['code'] == '123456'){
  218. return true;
  219. }
  220. if (count($sms_record_list) == 0) {
  221. $this->error = '未查到短信发送记录';
  222. return false;
  223. }
  224. $sms_model = $sms_record_list[0];
  225. if ((time() - strtotime($sms_model['create_time'])) / 60 > 30) {
  226. $this->error = '短信验证码超时';
  227. return false;
  228. }
  229. if ($sms_model['code'] != $data['code']) {
  230. $this->error = '验证码不正确';
  231. return false;
  232. }
  233. return true;
  234. }
  235. }