AI Assistant 6 ay önce
ebeveyn
işleme
5383beb68a

+ 20 - 1
ThirdParty/Urs/Services/UrsService.php

@@ -5,6 +5,7 @@ namespace ThirdParty\Urs\Services;
 use ThirdParty\Urs\Request\UrsGetUserInfoRequest;
 use ThirdParty\Urs\Request\UrsGetUserTeamRequest;
 use ThirdParty\Urs\Request\UrsGetUserLevelCountRequest;
+use ThirdParty\Urs\Request\UrsLoginRequest;
 
 /**
  * URS服务类
@@ -12,10 +13,28 @@ use ThirdParty\Urs\Request\UrsGetUserLevelCountRequest;
  * 统一管理所有URS相关的请求操作,提供简洁的API接口
  * 每个方法对应一个专用的Request类,遵循单一职责原则
  *
- * 注意:包含URS实际提供的3个业务接口
+ * 注意:包含URS实际提供的业务接口
  */
 class UrsService
 {
+    /**
+     * 用户登录
+     *
+     * 对应URS接口:POST /api/ecology/{ecology_id}/login
+     *
+     * @param string $mobile 手机号码
+     * @param string $password 登录密码
+     * @return array
+     * @throws \Exception
+     */
+    public static function login(string $mobile, string $password): array
+    {
+        $request = new UrsLoginRequest();
+        return $request->request([
+            'mobile' => $mobile,
+            'password' => $password
+        ]);
+    }
     /**
      * 获取用户信息
      *

+ 11 - 2
ThirdParty/Urs/readme.md

@@ -46,11 +46,17 @@ Urs/
 - **代码清晰**:每个类的职责明确,代码更易理解
 
 ### 重要说明
-**本包包含URS实际提供的3个业务接口对应的Request类,没有多余的虚构接口。**
+**本包包含URS实际提供的业务接口对应的Request类。**
 
 ## API接口说明
 
-### 1. 获取用户信息
+### 1. 用户登录
+- **类名**:`UrsLoginRequest`
+- **功能**:使用手机号和密码进行登录认证
+- **参数**:`mobile`(手机号码)、`password`(登录密码)
+- **返回**:用户ID和用户密钥
+
+### 2. 获取用户信息
 - **类名**:`UrsGetUserInfoRequest`
 - **功能**:根据用户密钥获取用户ID
 - **参数**:`userKey`(用户密钥)
@@ -84,6 +90,9 @@ $result = $request->request(['userKey' => 'user_key_here']);
 ```php
 use ThirdParty\Urs\Services\UrsService;
 
+// 用户登录
+$loginResult = UrsService::login('18600648353', 'a123123');
+
 // 获取用户信息
 $userInfo = UrsService::getUserInfo('user_key_here');
 

+ 116 - 77
app/Module/AppGame/Handler/Public/Login4uHandler.php

@@ -54,111 +54,150 @@ class Login4uHandler extends BaseHandler
                 throw new \Exception('登录密钥不能为空');
             }
 
-            // 2. 使用URS获取用户信息
-            Log::info('开始获取URS用户信息');
-            $ursUserInfo = $this->getUrsUserInfo($keylogin);
-            $ursUserId = $ursUserInfo['userId'];
+            // 2. 使用公共静态方法处理URS登录逻辑
+            $loginResult = self::processUrsLoginByUserKey($keylogin);
 
-            Log::info('URS用户信息获取成功', [
-                'urs_user_id' => $ursUserId,
-                'user_info_keys' => array_keys($ursUserInfo)
-            ]);
+            // 3. 创建响应对象
+            $response = new ResponsePublicLogin4u();
+            $response->setToken($loginResult['sessionId']);
 
-            // 3. 获取或创建农场用户ID(同时保存userKey)
-            Log::info('开始获取农场用户ID', [
-                'urs_user_id' => $ursUserId,
-                'user_key_length' => strlen($keylogin)
-            ]);
-            $farmUserId = UrsUserMappingService::getFarmUserIdByUserKeyWithAutoCreate($keylogin, $ursUserId);
-            if (!$farmUserId) {
-                Log::error('获取农场用户ID失败', [
-                    'urs_user_id' => $ursUserId,
-                    'farm_user_id' => $farmUserId,
-                    'user_key_length' => strlen($keylogin)
-                ]);
-                throw new \Exception('获取农场用户ID失败');
-            }
 
-            Log::info('农场用户ID获取成功', [
-                'urs_user_id' => $ursUserId,
-                'farm_user_id' => $farmUserId
-            ]);
 
-            // 4. 获取农场用户信息
-            Log::info('开始获取农场用户信息', ['farm_user_id' => $farmUserId]);
-            $userDto = UserService::info($farmUserId);
-            if (!$userDto) {
-                Log::error('农场用户不存在', [
-                    'farm_user_id' => $farmUserId,
-                    'user_dto' => $userDto
-                ]);
-                throw new \Exception('农场用户不存在');
-            }
 
-            Log::info('农场用户信息获取成功', [
-                'farm_user_id' => $farmUserId,
-                'user_name' => $userDto->name ?? 'unknown'
+
+            return $response;
+
+        } catch (\Exception $e) {
+            Log::error('URS login4u登录失败', [
+                'keylogin' => $keylogin ?? '',
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
             ]);
 
-            // 5. 同步上下级关系
-            $isFirstEntry = $this->syncReferralRelations($ursUserId, $farmUserId);
+            throw new $e;
+        }
+        return $response;
 
-            // 6. 触发用户进入农场事件(在推荐关系同步完成后)
-            if ($isFirstEntry) {
-                $this->triggerUserEnteredFarmEvent($ursUserId, $farmUserId, $keylogin);
-            }
+    }
 
-            // 8. 设置用户登录状态
-            $user = \App\Module\User\Models\User::find($farmUserId);
-            if (!$user) {
-                throw new \Exception('用户模型获取失败');
-            }
+    /**
+     * 通过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)
+        ]);
 
-            SessionApp::setLogin($user);
-            $sessionId = SessionApp::getSessionId();
+        // 1. 使用URS获取用户信息
+        $ursUserInfo = self::getUrsUserInfoByUserKey($userKey);
+        $ursUserId = $ursUserInfo['userId'];
 
-            // 9. 触发登录成功事件
-            Event::dispatch(new LoginSuccessEvent($user, $sessionId));
+        // 2. 获取或创建农场用户ID
+        $farmUserId = UrsUserMappingService::getFarmUserIdByUserKeyWithAutoCreate($userKey, $ursUserId);
+        if (!$farmUserId) {
+            throw new \Exception('获取农场用户ID失败');
+        }
 
-            // 10. 记录登录日志
-            Log::info('URS login4u登录成功', [
-                'urs_user_id' => $ursUserId,
-                'farm_user_id' => $farmUserId,
-                'username' => $user->username,
-                'session_id' => $sessionId
-            ]);
+        // 3. 完成登录流程
+        return self::completeUrsLogin($ursUserId, $farmUserId, $userKey);
+    }
 
-            // 11. 创建响应对象
-            $response = new ResponsePublicLogin4u();
-            $response->setToken($sessionId);
+    /**
+     * 通过手机号密码处理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('农场用户不存在');
+        }
 
-            return $response;
+        // 2. 同步上下级关系
+        $isFirstEntry = self::syncReferralRelations($ursUserId, $farmUserId);
 
-        } catch (\Exception $e) {
-            Log::error('URS login4u登录失败', [
-                'keylogin' => $keylogin ?? '',
-                'error' => $e->getMessage(),
-                'trace' => $e->getTraceAsString()
-            ]);
+        // 3. 触发用户进入农场事件(在推荐关系同步完成后)
+        if ($isFirstEntry) {
+            self::triggerUserEnteredFarmEvent($ursUserId, $farmUserId, $userKey);
+        }
 
-            throw new $e;
+        // 4. 设置用户登录状态
+        $user = \App\Module\User\Models\User::find($farmUserId);
+        if (!$user) {
+            throw new \Exception('用户模型获取失败');
         }
-        return $response;
 
+        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用户信息
+     * 获取URS用户信息(通过UserKey)
      *
      * @param string $keylogin 登录密钥
      * @return array URS用户信息
      * @throws \Exception
      */
-    private function getUrsUserInfo(string $keylogin): array
+    public static function getUrsUserInfoByUserKey(string $keylogin): array
     {
         Log::info('开始获取URS用户信息', [
             'keylogin_length' => strlen($keylogin),
@@ -212,7 +251,7 @@ class Login4uHandler extends BaseHandler
      * @param int $farmUserId 农场用户ID
      * @return bool 是否为首次进入农场(新创建了推荐关系)
      */
-    private function syncReferralRelations(int $ursUserId, int $farmUserId): bool
+    public static function syncReferralRelations(int $ursUserId, int $farmUserId): bool
     {
         try {
             Log::info('开始同步URS推荐关系', ['urs_user_id' => $ursUserId]);
@@ -298,7 +337,7 @@ class Login4uHandler extends BaseHandler
      * @param string $userKey 用户密钥
      * @return void
      */
-    private function triggerUserEnteredFarmEvent(int $ursUserId, int $farmUserId, string $userKey): void
+    public static function triggerUserEnteredFarmEvent(int $ursUserId, int $farmUserId, string $userKey): void
     {
         try {
             event(new \App\Module\UrsPromotion\Events\UrsUserEnteredFarmEvent($ursUserId, $farmUserId, $userKey, true));

+ 1 - 0
app/Module/AppGame/Handler/Public/LoginHandler.php

@@ -33,6 +33,7 @@ class LoginHandler extends BaseHandler
      */
     public function handle(Message $data): Message
     {
+        
         // 验证
         $validation = LoginValidation::makeByProrobuf($data);
         $validation->validated();

+ 1 - 0
app/Module/AppGame/Providers/AppGameServiceProvider.php

@@ -41,6 +41,7 @@ class AppGameServiceProvider extends ServiceProvider
         if ($this->app->runningInConsole()) {
             $this->commands([
                 \App\Module\AppGame\Commands\TestLogin4uCommand::class,
+                \App\Module\AppGame\Commands\TestLogin4ursCommand::class,
                 \App\Module\AppGame\Commands\TestPromotionHandlerCommand::class,
                 \App\Module\AppGame\Commands\TestPromotionInfoRefactorCommand::class,
             ]);

+ 1 - 0
app/Module/ThirdParty/Providers/ThirdPartyServiceProvider.php

@@ -150,6 +150,7 @@ class ThirdPartyServiceProvider extends ServiceProvider
                 \App\Module\ThirdParty\Commands\TestBaseArchitectureCommand::class,
                 \App\Module\ThirdParty\Commands\WebhookMappingCommand::class,
                 \App\Module\ThirdParty\Commands\TestUrsRequestCommand::class,
+                \App\Module\ThirdParty\Commands\TestUrsLoginCommand::class,
             ]);
         }
     }

+ 7 - 6
config/proto_route.php

@@ -73,11 +73,12 @@ return array (
       1 => 'device_info',
       2 => 'login',
       3 => 'login4u',
-      4 => 'player_data',
-      5 => 'register',
-      6 => 'reset_password',
-      7 => 'send_sms',
-      8 => 'token',
+      4 => 'login4urs',
+      5 => 'player_data',
+      6 => 'register',
+      7 => 'reset_password',
+      8 => 'send_sms',
+      9 => 'token',
     ),
     'shop' => 
     array (
@@ -105,7 +106,7 @@ return array (
       7 => 'query_data',
     ),
   ),
-  'generated_at' => '+08:00 2025-06-27 10:27:40',
+  'generated_at' => '+08:00 2025-06-28 18:20:14',
   'conventions' => 
   array (
     'handler_namespace' => 'App\\Module\\AppGame\\Handler',