UrsRegisterFarmUserWebhook.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. namespace ThirdParty\Urs\Webhook;
  3. use App\Module\ThirdParty\Models\ThirdPartyService as ServiceModel;
  4. use App\Module\UrsPromotion\Services\UrsUserMappingService;
  5. use App\Module\User\Models\UserInfo;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\DB;
  8. use Illuminate\Support\Facades\Log;
  9. /**
  10. * URS注册农场用户Webhook处理器
  11. *
  12. * 专门处理URS用户注册农场用户的Webhook通知
  13. */
  14. class UrsRegisterFarmUserWebhook extends WebhookReceiver
  15. {
  16. /**
  17. * 构造函数
  18. *
  19. * @param string $serviceCode 服务代码
  20. * @param Request $request 请求对象
  21. * @param ServiceModel $service 服务配置对象
  22. */
  23. public function __construct(string $serviceCode, Request $request, ServiceModel $service)
  24. {
  25. parent::__construct($serviceCode, $request, $service);
  26. }
  27. /**
  28. * 处理注册农场用户通知
  29. *
  30. * @param string $action 操作类型(固定为register_farm_user)
  31. * @param Request $request 请求对象
  32. * @return array
  33. * @throws \Exception
  34. */
  35. protected function handler(string $action, Request $request): array
  36. {
  37. // 验证操作类型
  38. if ($action !== 'register_farm_user') {
  39. throw new \Exception("此处理器只能处理register_farm_user操作,当前操作: {$action}");
  40. }
  41. // 验证必需字段
  42. $this->validateRegisterRequest($request);
  43. // 处理注册农场用户通知
  44. return $this->processRegisterFarmUser(
  45. $request->get('user_id'),
  46. $request->get('user_key'),
  47. $request->get('nickname')
  48. );
  49. }
  50. /**
  51. * 验证注册请求
  52. *
  53. * @param Request $request 请求对象
  54. * @throws \Exception
  55. */
  56. protected function validateRegisterRequest(Request $request): void
  57. {
  58. $requiredFields = ['user_id', 'user_key'];
  59. foreach ($requiredFields as $field) {
  60. if (!$request->has($field)) {
  61. throw new \Exception("缺少必需字段: {$field}");
  62. }
  63. }
  64. // 验证用户ID
  65. $userId = $request->input('user_id');
  66. if (!is_numeric($userId) || $userId <= 0) {
  67. throw new \Exception('用户ID格式无效');
  68. }
  69. // 验证用户密钥
  70. $userKey = $request->input('user_key');
  71. if (empty($userKey)) {
  72. throw new \Exception('用户密钥不能为空');
  73. }
  74. // 验证用户昵称
  75. $nickname = $request->input('nickname');
  76. if (empty($nickname)) {
  77. throw new \Exception('用户昵称不能为空');
  78. }
  79. }
  80. /**
  81. * 处理注册农场用户
  82. *
  83. * @param int $ursUserId URS用户ID
  84. * @param string $userKey 用户密钥
  85. * @return array
  86. */
  87. protected function processRegisterFarmUser($ursUserId, $userKey,$nickname): array
  88. {
  89. // 记录处理日志
  90. Log::info("URS注册农场用户处理开始", [
  91. 'urs_user_id' => $ursUserId,
  92. 'user_key_length' => strlen($userKey),
  93. 'request_id' => $this->getRequestId(),
  94. ]);
  95. try {
  96. // 使用UrsUserMappingService的公共逻辑获取或创建农场用户ID
  97. $farmUserId = UrsUserMappingService::getFarmUserIdByUserKeyWithAutoCreate($userKey, $ursUserId);
  98. if (!$farmUserId) {
  99. Log::error("URS注册农场用户失败:无法获取或创建农场用户ID", [
  100. 'urs_user_id' => $ursUserId,
  101. 'user_key_length' => strlen($userKey),
  102. ]);
  103. throw new \Exception("无法获取或创建农场用户ID");
  104. }
  105. // 记录成功日志
  106. Log::info("URS注册农场用户成功", [
  107. 'urs_user_id' => $ursUserId,
  108. 'farm_user_id' => $farmUserId,
  109. 'user_key_length' => strlen($userKey),
  110. ]);
  111. // 登陆一次
  112. $logininfo = \App\Module\AppGame\Handler\Public\Login4uHandler::completeUrsLogin($ursUserId,$farmUserId,$userKey);
  113. // 设置昵称和头像(随机1-8),逻辑参考 app/Module/AppGame/Handler/User/EditinfoHandler.php
  114. $this->setUserNicknameAndAvatar($farmUserId, $nickname);
  115. // 返回成功响应
  116. return [
  117. 'farm_user_id' => $farmUserId,
  118. 'logininfo'=>$logininfo['userDto'],
  119. 'status' => 'success'
  120. ];
  121. } catch (\Exception $e) {
  122. // 记录异常日志
  123. Log::error("URS注册农场用户处理异常", [
  124. 'urs_user_id' => $ursUserId,
  125. 'user_key_length' => strlen($userKey),
  126. 'error' => $e->getMessage(),
  127. 'trace' => $e->getTraceAsString(),
  128. ]);
  129. // 重新抛出异常,让上层处理
  130. throw $e;
  131. }
  132. }
  133. /**
  134. * 设置用户昵称和头像
  135. *
  136. * @param int $farmUserId 农场用户ID
  137. * @param string $nickname 昵称
  138. * @throws \Exception
  139. */
  140. protected function setUserNicknameAndAvatar(int $farmUserId, string $nickname): void
  141. {
  142. try {
  143. // 开始事务
  144. DB::beginTransaction();
  145. // 获取用户信息
  146. $userInfo = UserInfo::where('user_id', $farmUserId)->first();
  147. if (!$userInfo) {
  148. // 如果用户信息不存在,创建一个新的
  149. $userInfo = new UserInfo();
  150. $userInfo->user_id = $farmUserId;
  151. }
  152. // 设置昵称
  153. $userInfo->nickname = $nickname;
  154. // 生成随机头像(1-8)
  155. $randomAvatar = (string) rand(1, 8);
  156. $userInfo->avatar = $randomAvatar;
  157. // 保存用户信息
  158. $userInfo->save();
  159. // 提交事务
  160. DB::commit();
  161. // 记录成功日志
  162. Log::info("URS用户设置昵称和头像成功", [
  163. 'farm_user_id' => $farmUserId,
  164. 'nickname' => $nickname,
  165. 'avatar' => $randomAvatar,
  166. ]);
  167. } catch (\Exception $e) {
  168. // 回滚事务
  169. DB::rollBack();
  170. // 记录错误日志
  171. Log::error("URS用户设置昵称和头像失败", [
  172. 'farm_user_id' => $farmUserId,
  173. 'nickname' => $nickname,
  174. 'error' => $e->getMessage(),
  175. 'trace' => $e->getTraceAsString(),
  176. ]);
  177. // 重新抛出异常
  178. throw $e;
  179. }
  180. }
  181. }