231 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| namespace app\controller\api;
 | |
| 
 | |
| use app\exception\RepositoryException;
 | |
| use app\model\Account;
 | |
| use app\repository\AccountRepository;
 | |
| use app\service\File;
 | |
| use app\service\Jwt;
 | |
| use app\service\wx\WechatApplets;
 | |
| use app\validate\User as UserValidate;
 | |
| use EasyWeChat\Kernel\Exceptions\InvalidConfigException;
 | |
| use Exception;
 | |
| use think\response\Json;
 | |
| 
 | |
| class User extends Base
 | |
| {
 | |
|     protected $noNeedLogin = [
 | |
|         'login',
 | |
|     ];
 | |
| 
 | |
|     /**
 | |
|      * 登录  成功返回token及用户信息
 | |
|      *
 | |
|      * @return Json
 | |
|      * @throws InvalidConfigException
 | |
|      */
 | |
|     public function login(): Json
 | |
|     {
 | |
|         $params = $this->request->param();
 | |
| 
 | |
|         $validate = new UserValidate();
 | |
|         if (!$validate->scene('wx_applets')->check($params)) {
 | |
|             return $this->json(4000, $validate->getError());
 | |
|         }
 | |
|         $minApp = WechatApplets::getInstance();
 | |
|         $jsCode = $params['code'];
 | |
|         $wxUser = $minApp->auth->session($jsCode);
 | |
| 
 | |
|         if (isset($wxUser['errcode']) && $wxUser['errcode'] != 0) {
 | |
|             return $this->json(4001, $wxUser['errcode'].';'.$wxUser['errmsg'] ?? '登录失败');
 | |
|         }
 | |
|         // $wxUser success has [session_key, openid, unionid]
 | |
|         // 有效期2小时
 | |
|         $wxUser['expire_time'] = time() + 7200;
 | |
|         $wxUser['session_key'] = $wxUser['session_key'] ?? '';
 | |
|         $openID                = $wxUser['openid'];
 | |
| 
 | |
|         if (empty($openID)) {
 | |
|             return $this->json(4002, '登录失败');
 | |
|         }
 | |
|         $isActive    = $params['is_active'] ?? 0;
 | |
|         $isActive    = (is_numeric($isActive) && $isActive > 0) ? AccountRepository::BOOL_TRUE : AccountRepository::BOOL_FALSE;
 | |
|         $phoneActive = $params['phone_active'] ?? 0;
 | |
|         $phoneActive = (is_numeric($phoneActive) && $phoneActive > 0) ? AccountRepository::BOOL_TRUE : AccountRepository::BOOL_FALSE;
 | |
| 
 | |
|         try {
 | |
|             $repo         = AccountRepository::getInstance();
 | |
|             $account      = $repo->findByOpenID($openID);
 | |
|             $inviteCode   = $params['invite_code'] ?? '';
 | |
|             $inviteSource = $params['invite_source'] ?? AccountRepository::INVITE_SOURCE_DEF;
 | |
|             $channel      = $params['channel'] ?? '';
 | |
| 
 | |
|             if (!$account) {
 | |
|                 // 自动注册
 | |
|                 $inviterAid       = 0;
 | |
|                 $inviterParentAid = 0;
 | |
|                 $inviter          = null;
 | |
| 
 | |
|                 $customerService = 0;// 所属客服
 | |
|                 if (!empty($inviteCode)) {
 | |
|                     $inviter = $repo->findByInviteCode($inviteCode);
 | |
|                     if ($inviter) {
 | |
|                         $inviterAid       = $inviter['id'];
 | |
|                         $inviterParentAid = $inviter['inviter_account_id'];
 | |
|                         $channel          = (empty($channel) && $inviter['is_staff'] > 0) ? AccountRepository::CHANNEL_MEMBER : AccountRepository::CHANNEL_CUSTOMER;
 | |
|                         if ($inviter['is_staff'] > 0) {
 | |
|                             //若分享人是员工 自动绑定为客服
 | |
|                             $customerService = $inviter['id'];
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // 活码进入 绑定客服
 | |
|                 if (isset($params['source_code']) && !empty($params['source_code'])) {
 | |
|                     if ($sourceUser = Activity::findOne(['code' => $params['source_code']])) {
 | |
|                         $customerService = $sourceUser['account_id'] ?? 0;
 | |
|                     }
 | |
|                 }
 | |
|                 $inviteSource = in_array($inviteSource, array_keys(AccountRepository::inviteSourceList())) ? $inviteSource : AccountRepository::INVITE_SOURCE_DEF;
 | |
| 
 | |
|                 $channelList = $repo->channelList();
 | |
|                 $channel     = (empty($channel) || !in_array($channel, array_keys($channelList))) ? AccountRepository::CHANNEL_NORMAL : $channel;
 | |
| 
 | |
|                 $account = $repo->create([
 | |
|                     'unionid'            => $wxUser['unionid'] ?? '',
 | |
|                     'openid'             => $openID,
 | |
|                     'last_login'         => date('Y-m-d H:i:s'),
 | |
|                     'login_ip'           => $this->request->ip(),
 | |
|                     'created_at'         => date('Y-m-d H:i:s'),
 | |
|                     'created_year'       => date('Y'),
 | |
|                     'created_month'      => date('n'),
 | |
|                     'created_day'        => date('j'),
 | |
|                     'nickname'           => $params['nickname'] ?? '',
 | |
|                     'headimgurl'         => $params['headimgurl'] ?? '',
 | |
|                     'country'            => $params['country'] ?? '',
 | |
|                     'province'           => $params['province'] ?? '',
 | |
|                     'city'               => $params['city'] ?? '',
 | |
|                     'county'             => $params['county'] ?? '',
 | |
|                     'gender'             => $params['gender'] ?? 0,
 | |
|                     'language'           => $params['language'] ?? 'zh_CN',
 | |
|                     'mobile'             => $params['mobile'] ?? '',
 | |
|                     'status'             => AccountRepository::STATUS_NORMAL,
 | |
|                     'invite_source'      => $inviteSource,
 | |
|                     'inviter_account_id' => $inviterAid,
 | |
|                     'inviter_parent_id'  => $inviterParentAid,
 | |
|                     'channel'            => $channel,
 | |
|                     'is_staff'           => AccountRepository::BOOL_FALSE,
 | |
|                     'is_active'          => $isActive,
 | |
|                     'phone_active'       => $phoneActive,
 | |
|                     'customer_service'   => $customerService,
 | |
|                     'source_code'        => $params['source_code'] ?? '',
 | |
|                     'session_key'        => $wxUser['session_key'] ?? '',
 | |
|                 ]);
 | |
| 
 | |
|                 // 存在所属客服 添加绑定记录
 | |
|                 if ($customerService > 0) {
 | |
|                     CustomerReceive::firstBoundService($account['id'], $customerService);
 | |
|                 }
 | |
| 
 | |
|                 $regAccountId  = $account->id ?? 0;
 | |
|                 $accountActive = $phoneActive > 0;
 | |
| 
 | |
|                 if ($inviter) {
 | |
|                     $repo->addShareRegLog($regAccountId, $inviter['id'], AccountRepository::SHARE_GRADE_FIRST, $accountActive);
 | |
|                     if ($inviterParentAid > 0) {
 | |
|                         $repo->addShareRegLog($regAccountId, $inviterParentAid, AccountRepository::SHARE_GRADE_SECOND, $accountActive);
 | |
|                     }
 | |
| 
 | |
|                     // 邀请人绑定的客服可获得积分, 有效用户才关联
 | |
|                     if ($accountActive) {
 | |
|                         $boundServiceAid = $repo->getBoundServiceAId($inviter['id']);
 | |
|                         if ($boundServiceAid > 0) {
 | |
|                             $repo->addShareRegLog($regAccountId, $boundServiceAid, AccountRepository::SHARE_GRADE_SERVICE, true);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 AccountRecord::record($regAccountId, AccountRecord::TYPE_OTHER, AccountRecord::ACTION_REGISTER);
 | |
| 
 | |
|             } else {
 | |
|                 $updateData     = [
 | |
|                     'last_login'  => date('Y-m-d H:i:s'),
 | |
|                     'login_ip'    => $this->request->ip(),
 | |
|                     'session_key' => $wxUser['session_key'] ?? '',
 | |
|                     'language'    => $params['language'] ?? 'zh_CN',
 | |
|                 ];
 | |
|                 $phoneActiveOld = $account['phone_active'];
 | |
| 
 | |
|                 // 更新资料
 | |
|                 $modifyStringList = ['headimgurl', 'nickname', 'mobile', 'country', 'province', 'city', 'county'];
 | |
|                 foreach ($modifyStringList as $modifyKey) {
 | |
|                     if (isset($account[$modifyKey]) && empty($account[$modifyKey])) {
 | |
|                         $updateData[$modifyKey] = $params[$modifyKey] ?? '';
 | |
|                     }
 | |
|                 }
 | |
|                 if (empty($account['gender'])) {
 | |
|                     $updateData['gender'] = $params['gender'] ?? 0;
 | |
|                 }
 | |
|                 if (isset($account['is_active']) && $account['is_active'] == AccountRepository::BOOL_FALSE) {
 | |
|                     $updateData['is_active'] = $isActive;
 | |
|                 }
 | |
|                 if (isset($account['phone_active']) && $account['phone_active'] == AccountRepository::BOOL_FALSE) {
 | |
|                     $updateData['phone_active'] = $phoneActive;
 | |
|                 }
 | |
| 
 | |
|                 $repo->update($updateData, ['id' => $account['id']]);
 | |
| 
 | |
|                 $account = $repo->findById($account['id']);
 | |
| 
 | |
|                 // 授权手机号后才能算有效激活用户,并更新相关业务数据
 | |
|                 if ($phoneActiveOld == AccountRepository::BOOL_FALSE && $account['phone_active'] == AccountRepository::BOOL_TRUE) {
 | |
|                     if ($account['inviter_account_id'] > 0) {
 | |
|                         $repo->addShareRegLog($account['id'], $account['inviter_account_id'], AccountRepository::SHARE_GRADE_FIRST, true);
 | |
| 
 | |
|                         // 邀请人绑定的客服可获得积分
 | |
|                         $boundServiceAid = $repo->getBoundServiceAId($account['inviter_account_id']);
 | |
|                         if ($boundServiceAid > 0) {
 | |
|                             $repo->addShareRegLog($account['id'], $boundServiceAid, AccountRepository::SHARE_GRADE_SERVICE, true);
 | |
|                         }
 | |
|                     }
 | |
|                     if ($account['inviter_parent_id'] > 0) {
 | |
|                         $repo->addShareRegLog($account['id'], $account['inviter_parent_id'], AccountRepository::SHARE_GRADE_SECOND, true);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|         } catch (RepositoryException | Exception $e) {
 | |
|             return $this->json(4003, '登录失败!'.$e->getMessage());
 | |
|         }
 | |
| 
 | |
|         $account = $account->toArray();
 | |
|         $jwtData = [
 | |
|             'user_id'     => $account['id'],
 | |
|             'open_id'     => $openID,
 | |
|             'session_key' => $wxUser['session_key'],
 | |
|             'expire_time' => $wxUser['expire_time'],
 | |
|         ];
 | |
| 
 | |
|         $account['headimgurl'] = File::convertCompleteFileUrl($account['headimgurl']);
 | |
|         $fields                = [
 | |
|             'coding', 'real_name', 'nickname', 'headimgurl', 'gender', 'mobile',
 | |
|             'province', 'city', 'county', 'country', 'birthday',
 | |
|             'score', 'status', 'position', 'invite_code', 'channel',
 | |
|             'is_staff', 'is_active', 'phone_active'
 | |
|         ];
 | |
| 
 | |
|         $accountData          = arrayKeysFilter($account, $fields);
 | |
|         $account['is_active'] = ($account['is_active'] == Account::COMMON_ON && $account['phone_active'] == Account::COMMON_ON);
 | |
|         $data                 = [
 | |
|             'account_id' => $account['id'],
 | |
|             'token'      => Jwt::generate($jwtData),
 | |
|             'expire'     => $wxUser['expire_time'],
 | |
|             'openid'     => $openID,
 | |
|         ];
 | |
|         $data                 = array_merge($data, $accountData);
 | |
| 
 | |
|         return $this->json(0, 'success', $data);
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |