From ffc77b4f3fea99d09abab60edc4cdaffe993fb2a Mon Sep 17 00:00:00 2001 From: testadmin Date: Thu, 16 Apr 2026 23:53:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(epay):=20=E8=A1=A5=E5=8F=91=20/pay/submit?= =?UTF-8?q?=20=E8=AF=B7=E6=B1=82=E8=A7=A6=E5=8F=91=E6=8F=92=E4=BB=B6=20sub?= =?UTF-8?q?mit()=20=E5=86=99=E5=85=A5=20usdtpro=20=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onlinechip/controller/traits/epayPay.php | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/application/onlinechip/controller/traits/epayPay.php b/application/onlinechip/controller/traits/epayPay.php index e51e38b..ced541f 100644 --- a/application/onlinechip/controller/traits/epayPay.php +++ b/application/onlinechip/controller/traits/epayPay.php @@ -175,19 +175,33 @@ trait epayPay 'uid:' . $user_id ); - if (!is_array($apiResult) || empty($apiResult['url'])) { + // mapi.php 返回格式: + // {code:0, trade_no, pay_type:'jump', pay_info:'/pay/submit/TRADE_NO/'} 或 + // {code:0, trade_no, payurl:'/pay/submit/TRADE_NO/'} (default 分支) + // {code:1, trade_no, payurl:'...'} (部分旧版) + $submitUrl = ''; + $trade_no = ''; + if (is_array($apiResult)) { + if (!empty($apiResult['trade_no'])) $trade_no = strval($apiResult['trade_no']); + if (!empty($apiResult['payurl'])) $submitUrl = $apiResult['payurl']; + elseif (!empty($apiResult['pay_info'])) $submitUrl = $apiResult['pay_info']; + elseif (!empty($apiResult['url'])) $submitUrl = $apiResult['url']; + } + + if (!$submitUrl || !$trade_no) { $errMsg = is_array($apiResult) ? (isset($apiResult['msg']) ? $apiResult['msg'] : json_encode($apiResult, JSON_UNESCAPED_UNICODE)) : 'mapi 无响应'; addLogToFile('epay mapi 下单失败:order=' . $pay_orderid . ' err=' . $errMsg, 'epay_error', 'epay'); $data = encrypt_data(['status' => 0, 'message' => 'Khởi tạo thanh toán thất bại: ' . $errMsg]); return json(['Success' => 1, 'Data' => $data]); } - // epay 的 jump url 形如 https://pay.g7g7.top/pay/leader/2026041623400011168/ - $payUrl = $apiResult['url']; - $trade_no = ''; - if (preg_match('#/pay/leader/(\d+)/?#', $payUrl, $m)) { - $trade_no = $m[1]; - } + // 触发 plugin::submit() 把 usdtpro 指纹金额写入 pre_order + // mapi 模式 Plugin::loadForSubmit 只调 mapi() 方法,usdtpro 插件没这个方法, + // 所以 usdtpro 不会被写入。必须再访问一次 /pay/submit/TRADE_NO/ 让插件 submit() 跑一次 + $this->epay_trigger_plugin_submit($submitUrl); + + // 跳转到用户看的页面(pay/leader/TRADE_NO/) + $payUrl = str_replace('/pay/submit/', '/pay/leader/', $submitUrl); // 默认返回结构(若后续读取 usdtpro 失败仍可回退跳转) $qrcode = null; @@ -238,6 +252,30 @@ trait epayPay } } + /** + * 触发 epay plugin::submit() 写入 usdtpro 指纹金额 + * 只请求不处理响应(epay 会返回 302 或 HTML,我们只要副作用) + */ + private function epay_trigger_plugin_submit($submitUrl) + { + try { + $ch = curl_init($submitUrl); + curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => false, + CURLOPT_CONNECTTIMEOUT => 3, + CURLOPT_TIMEOUT => 6, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_USERAGENT => 'OG-EpayInternal/1.0', + ]); + curl_exec($ch); + curl_close($ch); + } catch (\Exception $e) { + addLogToFile('epay_trigger_plugin_submit 异常:' . $e->getMessage(), 'epay_error', 'epay'); + } + } + /** * 易支付 - 订单状态轮询 *