diff --git a/orders/views/payment.py b/orders/views/payment.py
index 0bcbc88..806d975 100644
--- a/orders/views/payment.py
+++ b/orders/views/payment.py
@@ -1318,13 +1318,20 @@ class CreateOrderView(APIView):
pay_sign = hashlib.md5(pay_sign_string.encode('utf-8')).hexdigest().upper()
# 返回支付参数(H5 JSAPI 必须带 appId;小程序可忽略)
+ # _diag 仅给 H5 诊断页展示商户号,调起支付时前端不会传给微信
result = {
'appId': APPID,
'timeStamp': timestamp,
'nonceStr': nonce_str,
'package': package,
'signType': 'MD5',
- 'paySign': pay_sign
+ 'paySign': pay_sign,
+ '_diag': {
+ 'mch_id': str(MCHID or ''),
+ 'club_id': str(club_id or ''),
+ 'appid': str(APPID or ''),
+ 'app_source': str(source or ''),
+ },
}
return result
diff --git a/templates/wechat/h5_jsapi_pay.html b/templates/wechat/h5_jsapi_pay.html
index 1332b87..e7d1813 100644
--- a/templates/wechat/h5_jsapi_pay.html
+++ b/templates/wechat/h5_jsapi_pay.html
@@ -24,11 +24,17 @@
}
.ok { color: #07c160; }
.err { color: #ff5a5a; }
+ .banner {
+ margin: 0 0 16px; padding: 14px 12px; border-radius: 10px;
+ background: #3a0000; border: 2px solid #ff2d2d; color: #ffe0e0;
+ font-size: 15px; font-weight: 700; line-height: 1.5; word-break: break-all;
+ }
微信支付(诊断模式)
+
收款商户号加载中…
初始化…
@@ -41,10 +47,23 @@
var btn = document.getElementById('payBtn');
var copyBtn = document.getElementById('copyBtn');
var logEl = document.getElementById('log');
+ var banner = document.getElementById('banner');
var lines = [];
var payload = null;
var pay = null;
var returnUrl = '';
+ var diag = {};
+
+ function setBanner() {
+ var mch = (diag && diag.mch_id) || '(未知,请看下方日志 payload.debug)';
+ var app = (pay && (pay.appId || pay.appid)) || (diag && diag.backendAppId) || '(未知)';
+ var club = (diag && diag.club_id) || '(未知)';
+ banner.innerHTML =
+ '【必须看】收款商户号 mch_id =
' + mch + '' +
+ 'appId = ' + app + '
' +
+ 'club_id = ' + club + '
' +
+ '请到
这个商户号的后台配 JSAPI 目录:https://www.abas.asia/hqhd/dingdan/';
+ }
function now() {
try { return new Date().toISOString(); } catch (e) { return String(Date.now()); }
@@ -118,6 +137,10 @@
pay = payload && payload.pay ? payload.pay : null;
returnUrl = (payload && payload.returnUrl) || '';
+ diag = (payload && payload.debug) || {};
+ setBanner();
+ push('!!!! 收款商户号 mch_id', diag.mch_id || '(空——后端未返回 _diag,请先部署后端)');
+ push('payload.debug 完整', diag);
dumpEnv('页面加载');
push('payload.orderId', payload && payload.orderId);
@@ -223,22 +246,19 @@
push('当前校验 URL', checkUrl);
push('调起用的 appId', appId);
if (quick) {
- setTip('
微信秒关并返回 cancel(常被误当成取消)不是「支付成功取消」。URL/appId 见下方,点重试或复制日志', true);
+ setTip('
微信秒关并返回 cancel顶部红框的 mch_id 才是要配目录的商户号', true);
try {
alert(
- '支付未完成(微信返回 cancel,且秒关)\n\n' +
- '这经常不是你手动取消,而是微信直接关掉收银台。\n' +
- '若屏幕曾闪过「URL未注册」,就是目录/商户仍不对。\n\n' +
- 'appId=' + appId + '\n' +
- 'URL=' + checkUrl + '\n' +
- '耗时=' + costMs + 'ms\n\n' +
- '完整日志在绿字区,点「复制」发给技术'
+ '支付未完成(cancel 秒关)\n\n' +
+ '【收款商户号 mch_id】\n' + ((diag && diag.mch_id) || '(未知,先部署后端)') + '\n\n' +
+ '必须在这个商户后台配:\nhttps://www.abas.asia/hqhd/dingdan/\n\n' +
+ 'appId=' + appId + '\nURL=' + checkUrl + '\nms=' + costMs
);
} catch (e) {}
} else {
setTip('已取消支付。可点「立即支付」重试');
try {
- alert('已取消支付\n\n若其实没点取消、只看到「未注册」,请把绿字日志复制发给技术\n\nappId=' + appId + '\nURL=' + checkUrl);
+ alert('已取消\nmch_id=' + ((diag && diag.mch_id) || '(未知)') + '\nappId=' + appId + '\nURL=' + checkUrl);
} catch (e) {}
}
return;