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;