diff --git a/.env-example b/.env-example index 02008c4..8121fc9 100644 --- a/.env-example +++ b/.env-example @@ -46,6 +46,10 @@ AUTH_TOKEN_SECRET = # 示例:H5_WEBSOCKET_URL = wss://zihua-api.h55555game.top/ws/ H5_WEBSOCKET_URL = wss://zihua-api.h55555game.top/ws/ +# H5 前端游戏页地址(模拟充值完成后「返回游戏」在当前窗口跳转;无尾斜杠) +# 示例:H5_GAME_URL = http://127.0.0.1:5173 +H5_GAME_URL = https://zihua-game.h55555game.top/ + # 充值支付渠道:在代码注册表之外追加渠道(JSON 数组,每项含 code / name / name_en / sort) # 当前代码注册表仅内置 ddpay;一般无需再追加。示例:DEPOSIT_CHANNELS_REGISTRY_JSON = DEPOSIT_CHANNELS_REGISTRY_JSON = diff --git a/app/api/controller/Finance.php b/app/api/controller/Finance.php index 5b6d6af..3de7e28 100644 --- a/app/api/controller/Finance.php +++ b/app/api/controller/Finance.php @@ -462,7 +462,7 @@ class Finance extends MobileBase $remaining = $expireAt > $now ? ($expireAt - $now) : 0; $canPay = $statusCode === 0 && DepositOrderExpireService::isPendingPaymentValid($row) && $remaining > 0; - return $this->mobileSuccess([ + return $this->mobileSuccess($this->attachMockDepositReturnGameUrl([ 'order_no' => $orderNo, 'amount' => $this->amountNumber($amount), 'bonus_amount' => $this->amountNumber($bonus), @@ -475,7 +475,7 @@ class Finance extends MobileBase 'reject_reason' => is_string($row['reject_reason'] ?? null) && trim($row['reject_reason']) !== '' ? trim($row['reject_reason']) : null, - ]); + ])); } /** @@ -563,13 +563,13 @@ class Finance extends MobileBase $status = is_numeric($row['status'] ?? null) ? intval($row['status']) : -1; if ($status === 1) { $order = DepositOrder::where('order_no', $orderNo)->find(); - $payload = $this->buildDepositResponse($order, null); + $payload = $this->attachMockDepositReturnGameUrl($this->buildDepositResponse($order, null)); $payload['review_required'] = false; return ['error' => null, 'payload' => $payload]; } if ($status === MockPay::DEPOSIT_STATUS_PENDING_REVIEW) { $order = DepositOrder::where('order_no', $orderNo)->find(); - $payload = $this->buildDepositResponse($order, null); + $payload = $this->attachMockDepositReturnGameUrl($this->buildDepositResponse($order, null)); $payload['review_required'] = true; return ['error' => null, 'payload' => $payload]; } @@ -608,7 +608,7 @@ class Finance extends MobileBase ]); $order = DepositOrder::where('id', $orderId)->find(); - $payload = $this->buildDepositResponse($order, null); + $payload = $this->attachMockDepositReturnGameUrl($this->buildDepositResponse($order, null)); $payload['review_required'] = true; $payload['mock_pay_success'] = true; $payload['mock_pay_message'] = 'Payment submitted. Pending admin review.'; @@ -616,6 +616,21 @@ class Finance extends MobileBase return ['error' => null, 'payload' => $payload]; } + /** + * @param array $payload + * + * @return array + */ + private function attachMockDepositReturnGameUrl(array $payload): array + { + $returnGameUrl = MockPay::resolveGameReturnUrl(); + if ($returnGameUrl !== '') { + $payload['return_game_url'] = $returnGameUrl; + } + + return $payload; + } + /** * @param \app\common\model\DepositOrder|object $order */ @@ -676,6 +691,8 @@ class Finance extends MobileBase $expireEsc = htmlspecialchars($expireText, ENT_QUOTES, 'UTF-8'); $orderNoJs = json_encode($orderNo, JSON_UNESCAPED_UNICODE); $confirmUrlJs = json_encode($confirmUrl, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + $returnGameUrl = MockPay::resolveGameReturnUrl(); + $returnGameUrlJs = json_encode($returnGameUrl, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); return '' . '模拟充值' @@ -695,11 +713,14 @@ class Finance extends MobileBase . '

链接有效期至 ' . $expireEsc . '(约 3 分钟,过期后订单将自动失效)

' . '' . '
支付成功(模拟)
订单已提交,需管理员在后台审核通过后才会入账。
' - . '' . ''; diff --git a/app/common/library/finance/MockPay.php b/app/common/library/finance/MockPay.php index fa31407..fb425c4 100644 --- a/app/common/library/finance/MockPay.php +++ b/app/common/library/finance/MockPay.php @@ -248,6 +248,14 @@ final class MockPay } + $returnGameUrl = self::resolveGameReturnUrl(); + + if ($returnGameUrl !== '') { + + $query['return_game_url'] = $returnGameUrl; + + } + return $htmlBase . '/mock-deposit.html?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986); @@ -332,6 +340,42 @@ final class MockPay + /** + + * 模拟充值完成后「返回游戏」跳转地址(H5_GAME_URL) + + */ + + public static function resolveGameReturnUrl(): string + + { + + $raw = getenv('H5_GAME_URL'); + + if (is_string($raw) && trim($raw) !== '') { + + return trim($raw); + + } + + + + $cfg = config('app.h5_game_url', ''); + + if (is_string($cfg) && trim($cfg) !== '') { + + return trim($cfg); + + } + + + + return ''; + + } + + + private static function linkSecret(): string { diff --git a/config/app.php b/config/app.php index dcce090..1fc2fb2 100644 --- a/config/app.php +++ b/config/app.php @@ -25,6 +25,9 @@ return [ */ 'ddpay_public_base_url' => is_string(getenv('DDPAY_PUBLIC_BASE_URL')) ? trim(getenv('DDPAY_PUBLIC_BASE_URL')) : '', + /** H5 前端游戏页地址:模拟充值收银台「返回游戏」在当前窗口跳转至此(无尾斜杠) */ + 'h5_game_url' => is_string(getenv('H5_GAME_URL')) ? trim(getenv('H5_GAME_URL')) : '', + 'ddpay_client_id' => is_string(getenv('DDPAY_CLIENT_ID')) ? trim(getenv('DDPAY_CLIENT_ID')) : '', 'ddpay_identifier' => is_string(getenv('DDPAY_IDENTIFIER')) ? trim(getenv('DDPAY_IDENTIFIER')) : '', 'ddpay_api_secret' => is_string(getenv('DDPAY_API_SECRET')) ? trim(getenv('DDPAY_API_SECRET')) : '', diff --git a/public/mock-deposit.html b/public/mock-deposit.html index 35f1c60..6b5f1ba 100644 --- a/public/mock-deposit.html +++ b/public/mock-deposit.html @@ -14,6 +14,7 @@ .countdown.expired { color: #cf1322; } button { width: 100%; padding: 14px; font-size: 16px; border: 0; border-radius: 8px; background: #1677ff; color: #fff; cursor: pointer; margin-top: 12px; } button:disabled { background: #ccc; cursor: not-allowed; } + .btn-back { display: none; background: #fff; color: #cf1322; border: 1px solid #d9d9d9; } .hint { font-size: 13px; color: #999; } .ok { display: none; margin-top: 16px; padding: 12px; background: #f6ffed; border: 1px solid #b7eb8f; border-radius: 8px; color: #389e0d; line-height: 1.6; } .info { margin-top: 12px; padding: 12px; background: #e6f4ff; border: 1px solid #91caff; border-radius: 8px; color: #0958d9; font-size: 14px; line-height: 1.6; } @@ -32,6 +33,7 @@

支付成功(模拟)
订单已提交,需管理员在后台审核通过后才会入账。
+