diff --git a/templates/wechat/h5_jsapi_pay.html b/templates/wechat/h5_jsapi_pay.html index b55f322..1332b87 100644 --- a/templates/wechat/h5_jsapi_pay.html +++ b/templates/wechat/h5_jsapi_pay.html @@ -145,6 +145,8 @@ history.length > 1 ? history.back() : setTip('支付完成,请返回点单页'); } + var invokeAt = 0; + function invokePay() { dumpEnv('点击/自动调起前'); if (!pay || !pay.timeStamp || !pay.nonceStr || !pay.package || !pay.paySign) { @@ -181,10 +183,13 @@ }); setTip('正在调起微信支付…'); btn.disabled = true; + invokeAt = Date.now(); try { WeixinJSBridge.invoke('getBrandWCPayRequest', req, function (res) { btn.disabled = false; + var costMs = Date.now() - invokeAt; dumpEnv('微信回调时'); + push('调起到回调耗时ms', costMs); push('微信回调 res 完整对象', res); push('微信回调 JSON', (function () { try { return JSON.stringify(res); } catch (e) { return String(res); } @@ -193,7 +198,6 @@ var errDesc = (res && (res.err_desc || res.errMsg || res.err_msg)) || ''; push('err_msg', msg); push('err_desc/其它', errDesc); - // 把所有可枚举字段打出来 try { var keys = []; for (var k in res) { @@ -204,21 +208,49 @@ push('res 所有字段', keys.join(' | ')); } catch (e) {} + var checkUrl = String(location.href || '').split('#')[0]; + if (msg === 'get_brand_wcpay_request:ok') { setTip('支付成功,正在返回…'); setTimeout(goBack, 500); - } else if (msg.indexOf('cancel') >= 0) { - setTip('已取消,可点按钮重试'); - } else { - setTip('支付失败:' + (msg || '未知') + '
把下方绿色日志整段复制发给技术', true); - push('!!!! 支付失败,请把本页全部绿色日志复制发送 !!!!'); - push('若含「URL未注册」,对照:微信校验 URL 必须落在商户 JSAPI 授权目录前缀下'); - push('当前校验 URL', String(location.href || '').split('#')[0]); - push('调起用的 appId', appId); - try { - alert('支付失败诊断\n\n' + msg + '\n\nappId=' + appId + '\nURL=' + String(location.href || '').split('#')[0] + '\n\n完整日志在页面绿色区域,点「复制」'); - } catch (e) {} + return; } + + // cancel:真正取消,或微信秒关(常见于未注册等,却只回 cancel) + if (msg.indexOf('cancel') >= 0) { + var quick = costMs < 2500; + push('判定', quick ? '疑似秒关/失败(耗时<2.5s)' : '用户取消(耗时较长)'); + push('当前校验 URL', checkUrl); + push('调起用的 appId', appId); + if (quick) { + setTip('微信秒关并返回 cancel(常被误当成取消)
不是「支付成功取消」。URL/appId 见下方,点重试或复制日志', true); + try { + alert( + '支付未完成(微信返回 cancel,且秒关)\n\n' + + '这经常不是你手动取消,而是微信直接关掉收银台。\n' + + '若屏幕曾闪过「URL未注册」,就是目录/商户仍不对。\n\n' + + 'appId=' + appId + '\n' + + 'URL=' + checkUrl + '\n' + + '耗时=' + costMs + 'ms\n\n' + + '完整日志在绿字区,点「复制」发给技术' + ); + } catch (e) {} + } else { + setTip('已取消支付。可点「立即支付」重试'); + try { + alert('已取消支付\n\n若其实没点取消、只看到「未注册」,请把绿字日志复制发给技术\n\nappId=' + appId + '\nURL=' + checkUrl); + } catch (e) {} + } + return; + } + + setTip('支付失败:' + (msg || '未知') + '
把下方绿色日志整段复制发给技术', true); + push('!!!! 支付失败,请把本页全部绿色日志复制发送 !!!!'); + push('当前校验 URL', checkUrl); + push('调起用的 appId', appId); + try { + alert('支付失败诊断\n\n' + msg + '\n\nappId=' + appId + '\nURL=' + checkUrl + '\n\n完整日志在页面绿色区域,点「复制」'); + } catch (e) {} }); } catch (e) { btn.disabled = false;