UserMp.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace app\api\model\user;
  3. use app\api\model\plus\agent\Referee as RefereeModel;
  4. use app\common\model\user\Grade as GradeModel;
  5. use think\facade\Cache;
  6. use app\common\exception\BaseException;
  7. use app\common\model\user\User as UserModel;
  8. /**
  9. * 公众号用户模型类
  10. */
  11. class UserMp extends UserModel
  12. {
  13. private $token;
  14. /**
  15. * 隐藏字段
  16. */
  17. protected $hidden = [
  18. 'open_id',
  19. 'is_delete',
  20. 'app_id',
  21. 'create_time',
  22. 'update_time'
  23. ];
  24. /**
  25. * 用户登录
  26. */
  27. public function login($userInfo, $referee_id = null)
  28. {
  29. $userInfo = $userInfo['original'];
  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(['mpopen_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'] = 'mp';
  74. //默认等级
  75. $data['grade_id'] = GradeModel::getDefaultGradeId();
  76. }
  77. $data['mpopen_id'] = $userInfo['openid'];
  78. // 用户昵称
  79. if(!$user){
  80. $data['nickName'] = preg_replace('/[\xf0-\xf7].{3}/', '', $userInfo['nickname']);
  81. }
  82. $data['avatarUrl'] = $userInfo['headimgurl'];
  83. $data['gender'] = $userInfo['sex'];
  84. $data['province'] = $userInfo['province'];
  85. $data['country'] = $userInfo['country'];
  86. $data['city'] = $userInfo['city'];
  87. try {
  88. $this->startTrans();
  89. // 保存/更新用户记录
  90. if (!$model->save(array_merge($data, [
  91. 'app_id' => self::$app_id
  92. ]))
  93. ) {
  94. throw new BaseException(['msg' => '用户注册失败']);
  95. }
  96. if (!$user && $referee_id > 0) {
  97. // 记录推荐人关系,
  98. RefereeModel::createRelation($model['user_id'], $referee_id);
  99. //更新用户邀请数量
  100. (new UserModel())->setIncInvite($referee_id);
  101. }
  102. $this->commit();
  103. } catch (\Exception $e) {
  104. $this->rollback();
  105. throw new BaseException(['msg' => $e->getMessage()]);
  106. }
  107. return $model['user_id'];
  108. }
  109. }