getKeylogin(); Log::info('获取登录密钥', [ 'keylogin_length' => strlen($keylogin), 'keylogin_empty' => empty($keylogin) ]); if (empty($keylogin)) { Log::error('登录密钥验证失败', ['error' => '登录密钥不能为空']); throw new \Exception('登录密钥不能为空'); } // 2. 使用公共静态方法处理URS登录逻辑 $loginResult = self::processUrsLoginByUserKey($keylogin); // 3. 创建响应对象 $response = new ResponsePublicLogin4u(); $response->setToken($loginResult['sessionId']); // 设置用户状态(默认不封禁) $response->setIsProhibit(false); // 设置最后登录信息 $lastLoginInfo = new LastLoginInfo(); $lastLoginInfo->setLastLoginTimes(time()); $response->setLastLoginInfo($lastLoginInfo); return $response; } catch (\Exception $e) { Log::error('URS login4u登录失败', [ 'keylogin' => $keylogin ?? '', 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); throw new $e; } return $response; } /** * 通过UserKey处理URS登录的公共静态方法 * * @param string $userKey 用户密钥 * @return array 包含sessionId、farmUserId、ursUserId等信息 * @throws \Exception */ public static function processUrsLoginByUserKey(string $userKey): array { Log::info('开始处理URS UserKey登录', [ 'user_key_length' => strlen($userKey) ]); // 1. 使用URS获取用户信息 $ursUserInfo = self::getUrsUserInfoByUserKey($userKey); $ursUserId = $ursUserInfo['userId']; // 2. 获取或创建农场用户ID $farmUserId = UrsUserMappingService::getFarmUserIdByUserKeyWithAutoCreate($userKey, $ursUserId); if (!$farmUserId) { throw new \Exception('获取农场用户ID失败'); } // 3. 完成登录流程 return self::completeUrsLogin($ursUserId, $farmUserId, $userKey); } /** * 通过手机号密码处理URS登录的公共静态方法 * * @param string $mobile 手机号 * @param string $password 密码 * @return array 包含sessionId、farmUserId、ursUserId等信息 * @throws \Exception */ public static function processUrsLoginByMobilePassword(string $mobile, string $password): array { Log::info('开始处理URS手机号密码登录', [ 'mobile' => $mobile ]); // 1. 使用URS登录获取用户信息 $loginResult = \ThirdParty\Urs\Services\UrsService::login($mobile, $password); $ursUserId = $loginResult['userId']; $userKey = $loginResult['userKey']; // 2. 获取或创建农场用户ID $farmUserId = UrsUserMappingService::getFarmUserIdByUserKeyWithAutoCreate($userKey, $ursUserId); if (!$farmUserId) { throw new \Exception('获取农场用户ID失败'); } // 3. 完成登录流程 return self::completeUrsLogin($ursUserId, $farmUserId, $userKey); } /** * 完成URS登录的公共逻辑 * * @param int $ursUserId URS用户ID * @param int $farmUserId 农场用户ID * @param string $userKey 用户密钥 * @return array 包含sessionId、farmUserId、ursUserId等信息 * @throws \Exception */ public static function completeUrsLogin(int $ursUserId, int $farmUserId, string $userKey): array { // 1. 获取农场用户信息 $userDto = UserService::info($farmUserId); if (!$userDto) { throw new \Exception('农场用户不存在'); } // 2. 同步上下级关系 $isFirstEntry = self::syncReferralRelations($ursUserId, $farmUserId); // 3. 触发用户进入农场事件(在推荐关系同步完成后) if ($isFirstEntry) { self::triggerUserEnteredFarmEvent($ursUserId, $farmUserId, $userKey); } // 4. 设置用户登录状态 $user = \App\Module\User\Models\User::find($farmUserId); if (!$user) { throw new \Exception('用户模型获取失败'); } SessionApp::setLogin($user); $sessionId = SessionApp::getSessionId(); // 5. 触发登录成功事件 Event::dispatch(new LoginSuccessEvent($user, $sessionId)); // 6. 记录登录日志 Log::info('URS登录成功', [ 'urs_user_id' => $ursUserId, 'farm_user_id' => $farmUserId, 'username' => $user->username, 'session_id' => $sessionId ]); return [ 'sessionId' => $sessionId, 'farmUserId' => $farmUserId, 'ursUserId' => $ursUserId, 'user' => $user, 'userDto' => $userDto ]; } /** * 获取URS用户信息(通过UserKey) * * @param string $keylogin 登录密钥 * @return array URS用户信息 * @throws \Exception */ public static function getUrsUserInfoByUserKey(string $keylogin): array { Log::info('开始获取URS用户信息', [ 'keylogin_length' => strlen($keylogin), 'keylogin_prefix' => substr($keylogin, 0, 10) . '...' ]); try { $result = UrsService::getUserInfo($keylogin); Log::info('URS服务调用完成', [ 'result_keys' => array_keys($result), 'success' => $result['success'] ?? false, 'message' => $result['message'] ?? '', 'has_data' => isset($result['data']), 'data_keys' => isset($result['data']) ? array_keys($result['data']) : [] ]); if (!$result['success'] || empty($result['data']['userId'])) { Log::error('URS用户信息获取失败详情', [ 'result' => $result, 'success' => $result['success'] ?? false, 'has_userId' => isset($result['data']['userId']), 'userId_value' => $result['data']['userId'] ?? null ]); throw new \Exception('URS用户信息获取失败: ' . ($result['message'] ?? '未知错误')); } Log::info('URS用户信息获取成功', [ 'userId' => $result['data']['userId'], 'data_keys' => array_keys($result['data']) ]); return $result['data']; } catch (\Exception $e) { Log::error('获取URS用户信息异常', [ 'keylogin_length' => strlen($keylogin), 'error_message' => $e->getMessage(), 'error_file' => $e->getFile(), 'error_line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]); throw new \Exception('URS用户验证失败: ' . $e->getMessage()); } } /** * 同步上下级关系到UrsPromotion模块 * * @param int $ursUserId URS用户ID * @param int $farmUserId 农场用户ID * @return bool 是否为首次进入农场(新创建了推荐关系) */ public static function syncReferralRelations(int $ursUserId, int $farmUserId): bool { // 使用重构后的同步逻辑类 $syncLogic = new UrsReferralSyncLogic(); return $syncLogic->syncReferralRelations($ursUserId, $farmUserId); } /** * 触发用户进入农场事件 * * @param int $ursUserId URS用户ID * @param int $farmUserId 农场用户ID * @param string $userKey 用户密钥 * @return void */ public static function triggerUserEnteredFarmEvent(int $ursUserId, int $farmUserId, string $userKey): void { try { event(new \App\Module\UrsPromotion\Events\UrsUserEnteredFarmEvent($ursUserId, $farmUserId, $userKey, true)); Log::info('URS用户进入农场事件已触发', [ 'urs_user_id' => $ursUserId, 'farm_user_id' => $farmUserId, 'user_key_length' => strlen($userKey) ]); } catch (\Exception $e) { // 事件触发失败不影响登录流程,只记录日志 Log::error('URS用户进入农场事件触发异常', [ 'urs_user_id' => $ursUserId, 'farm_user_id' => $farmUserId, 'error' => $e->getMessage() ]); } } }