任务时间: 2025年06月15日 19:27-19:40
任务类型: 功能开发
模块: AppGame、ThirdParty、UrsPromotion
根据ThirdParty/Urs/Docs/urs.md文档要求,实现login4u对接功能,使用URS的userKey进行登录,自动创建用户并同步推荐关系。
文件: app/Module/AppGame/Handler/Public/Login4uHandler.php
核心功能:
登录流程:
public function handle(Message $data): Message
{
// 1. 验证登录密钥
$keylogin = $data->getKeylogin();
// 2. 使用URS获取用户信息
$ursUserInfo = $this->getUrsUserInfo($keylogin);
$ursUserId = $ursUserInfo['userId'];
// 3. 获取或创建农场用户ID
$farmUserId = UrsUserMappingService::getFarmUserId($ursUserId);
// 4. 获取农场用户信息
$userDto = UserService::info($farmUserId);
// 5. 同步上下级关系
$this->syncReferralRelations($ursUserId);
// 6. 设置用户登录状态
SessionApp::setLogin($user);
$sessionId = SessionApp::getSessionId();
// 7. 触发登录成功事件
Event::dispatch(new LoginSuccessEvent($user, $sessionId));
// 8. 返回响应
$response = new ResponsePublicLogin4u();
$response->setToken($sessionId);
return $response;
}
方法: getUrsUserInfo(string $keylogin)
private function getUrsUserInfo(string $keylogin): array
{
$result = UrsService::getUserInfo($keylogin);
if (!$result['success'] || empty($result['data']['userId'])) {
throw new \Exception('URS用户信息获取失败');
}
return $result['data'];
}
方法: syncReferralRelations(int $ursUserId)
private function syncReferralRelations(int $ursUserId): void
{
// 获取用户的上级关系链
$teamResult = UrsService::getUserTeam($ursUserId);
if (!$teamResult['success'] || empty($teamResult['data'])) {
return; // 无上级关系
}
// 检查是否已存在推荐关系
$existingReferral = UrsUserReferral::where('urs_user_id', $ursUserId)->first();
if ($existingReferral) {
return; // 已存在关系
}
// 获取直接推荐人(一级上级)
$directReferrerId = $teamData['level1'] ?? null;
if ($directReferrerId) {
// 创建推荐关系
UrsReferralService::createReferral($ursUserId, $directReferrerId);
}
}
文件: app/Module/AppGame/Commands/TestLogin4uCommand.php
功能:
使用方式:
php artisan test:login4u [keylogin]
问题: app/Module/ThirdParty/Services/BaseRequest.php中存在抽象方法和具体实现的重复定义
修复:
getConfig和getCredential的定义问题: ThirdParty/Urs/Request/BaseRequest.php中的方法签名与父类不兼容
修复:
getUrsConfig()和getUrsCredential()login4u功能已自动集成到现有的protobuf路由系统中:
路由配置: config/proto_route.php
'public' => [
// ...
'login4u', // 已存在
// ...
]
Handler映射:
RequestPublicLogin4uApp\Module\AppGame\Handler\Public\Login4uHandlerResponsePublicLogin4ugetFarmUserId方法'urs-' + ursUserIdcreateReferral方法建立推荐关系setLogin方法设置登录状态php artisan test:login4u test_key_123
测试结果:
预期错误: "服务 urs 没有可用的认证凭证" 说明: 这是正常的,因为还未配置真实的URS服务凭证
成功日志:
URS login4u登录成功: urs_user_id, farm_user_id, username, session_id
自动创建URS用户映射成功: urs_user_id, farm_user_id, username, mapping_id
URS推荐关系同步成功: urs_user_id, urs_referrer_id, referral_id
失败日志:
URS login4u登录失败: keylogin, error, trace
获取URS用户信息失败: keylogin, error
URS推荐关系同步失败: urs_user_id, error
需要在ThirdParty模块中配置URS服务:
urs配置完URS服务后,可使用真实的userKey进行测试:
php artisan test:login4u [real_user_key]
成功实现了URS login4u对接功能,包括:
该功能为URS系统与农场系统的深度集成奠定了基础,用户可以使用URS的userKey无缝登录农场系统,享受统一的用户体验。