validateDepositRequest($request); // 处理充值通知 return $this->processDepositNotification($request->get('user_id'), $request->get('amount'), $request->get('order_id')); } /** * 验证充值请求 * * @param Request $request 请求对象 * @throws \Exception */ protected function validateDepositRequest(Request $request): void { $requiredFields = [ 'user_id', 'amount', 'order_id' ]; foreach ($requiredFields as $field) { if (!$request->has($field)) { throw new \Exception("缺少必需字段: {$field}"); } } // 验证用户ID $userId = $request->input('user_id'); if (!is_numeric($userId) || $userId <= 0) { throw new \Exception('用户ID格式无效'); } // 验证金额 $amount = $request->input('amount'); if (!is_numeric($amount) || $amount <= 0) { throw new \Exception('充值金额必须大于0'); } // 验证订单ID $orderId = $request->input('order_id'); if (empty($orderId)) { throw new \Exception('订单ID不能为空'); } } /** * 处理充值通知 * * @param int $user_id URS用户ID * @param string $amount 充值金额 * @param string $order_id URS订单ID * @return array */ protected function processDepositNotification($user_id, $amount, $order_id): array { // 记录处理日志 Log::info("URS充值通知处理开始", [ 'urs_user_id' => $user_id, 'amount' => $amount, 'order_id' => $order_id, 'request_id' => $this->getRequestId(), ]); try { /** * 三方应用ID * @var int $thirdPartyAppId */ $thirdPartyAppId = $this->service->id; // 1. 根据URS用户ID获取农场用户ID $farmUserId = \App\Module\UrsPromotion\Services\UrsUserMappingService::getFarmUserId($user_id); if (!$farmUserId) { Log::error("URS充值失败:未找到用户映射关系", [ 'urs_user_id' => $user_id, 'order_id' => $order_id, ]); throw new \Exception("用户未进入农场系统,无法完成充值"); } // 2. 开启数据库事务并使用Transfer模块完成充值钻石操作 $result = DB::transaction(function () use ($thirdPartyAppId, $farmUserId, $user_id, $amount, $order_id) { return \App\Module\Transfer\Services\TransferThirdPartyService::createRechargeOrder( thirdPartyAppId: $thirdPartyAppId, farmUserId: $farmUserId, thirdPartyUserId: (string)$user_id, thirdPartyAmount: $amount, order_id: $order_id, remark: "URS充值 - 订单号: {$order_id}", callbackData: [ 'urs_order_id' => $order_id, 'urs_user_id' => $user_id, 'source' => 'urs_deposit_webhook' ] ); }); // 3. 检查充值结果 if (is_string($result)) { // 充值失败 Log::error("URS充值失败", [ 'urs_user_id' => $user_id, 'farm_user_id' => $farmUserId, 'third_party_app_id' => $thirdPartyAppId, 'amount' => $amount, 'order_id' => $order_id, 'error' => $result, ]); throw new \Exception("充值失败: {$result}"); } // 4. 充值成功,记录成功日志 Log::info("URS充值成功", [ 'urs_user_id' => $user_id, 'farm_user_id' => $farmUserId, 'third_party_app_id' => $thirdPartyAppId, 'amount' => $amount, 'order_id' => $order_id, 'transfer_order_id' => $result->id, 'business_id' => $result->out_order_id, 'actual_amount' => $result->out_amount, ]); // 5. 返回成功响应 return [ 'rorder_id' => $result->out_order_id, // 返回Transfer模块生成的业务订单ID 'transfer_order_id' => $result->id, // Transfer模块的内部订单ID 'actual_amount' => $result->out_amount, // 实际到账金额 'status' => 'success' ]; } catch (\Exception $e) { // 记录异常日志 Log::error("URS充值处理异常", [ 'urs_user_id' => $user_id, 'amount' => $amount, 'order_id' => $order_id, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); // 重新抛出异常,让上层处理 throw $e; } } }