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); } }