微信支付在移动端H5页面调起失败怎么办?
我在做移动端H5商城,用微信官方的JSAPI接入微信支付,本地测试时一切正常,但部署到线上后,在安卓和iOS微信内置浏览器里点击支付按钮完全没反应,控制台也没报错。我确认了后端返回的prepay_id是有效的,也按文档配置了timestamp、nonceStr这些参数。
是不是我的调用方式有问题?下面是我前端调用微信支付的HTML结构:
<button id="wxPayBtn">立即支付</button>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
document.getElementById('wxPayBtn').addEventListener('click', () => {
wx.chooseWXPay({
timestamp: res.timestamp,
nonceStr: res.nonceStr,
package: res.package,
signType: res.signType,
paySign: res.paySign,
success: (r) => console.log('success', r),
fail: (e) => console.error('fail', e)
});
});
</script>
1. 微信支付现在都用新版API了,
wx.chooseWXPay已经废弃了,得用WeixinJSBridge.invoke。代码放这了:2. 检查下你引用的JS文件版本,现在推荐用1.6.0以上版本:
3. 最坑爹的是安卓微信有时候缓存旧版JS文件,建议加个随机参数强制刷新:
4. 记得所有参数名大小写要严格匹配,比如
timeStamp的'S'必须大写,微信文档写得跟屎一样,大小写错了就直接不报错也不执行。先说最关键的:你用的
wx.chooseWXPay是老版本 JSAPI 的调起方式,从微信 7.0 开始官方已经废弃了,现在应该用wx.requestPayment。你本地可能测的是旧版微信,线上用户基本都是新版本,所以点按钮没反应,控制台还不报错——因为这个方法根本就不存在了,静默失败。另外你代码里直接用
res.xxx,但没看到你发请求拿数据的部分,容易漏掉异步时机问题,得确保在点击时数据已经拿到。试试这个写法:
还有几个常见雷区你自查一下:
- 确认你公众号或小程序的「支付授权目录」配对了,比如支付页是
https://yourdomain.com/pay/,那目录必须配到https://yourdomain.com/pay/(带斜杠),不能只配到域名根- 看下 H5 页面是不是在微信外打开的?比如通过浏览器直接访问,不是微信里点链接进来的——微信支付只认微信环境
- 有些安卓机对 HTTPS 要求贼严,如果你用了自签名证书或者 SSL 配置不标准(比如没配 SHA256WithRSA),也会静默失败,建议用
https://myssl.com之类的工具扫下最后提醒一句:微信支付参数里的
package字段必须是prepay_id=xxxxxx这种格式,别手抖写成 JSON 或别的,这个错我也踩过,调一天才发现是字符串少了前缀。