微信支付在移动端调起失败怎么办?
我在做H5页面接入微信支付,后端返回了正确的prepay_id和签名,但在手机浏览器里调用微信JSAPI时总是提示“invalid signature”。
我用的是WeixinJSBridge.invoke('getBrandWCPayRequest', ...),参数也按文档拼接了,时间戳、nonceStr这些都确认没重复。本地测试没问题,上线后就不行,是不是域名或JS接口权限的问题?
这是我的调用代码:
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": res.appId,
"timeStamp": res.timeStamp.toString(),
"nonceStr": res.nonceStr,
"package": res.package,
"signType": res.signType,
"paySign": res.paySign
}, function(res) {
if (res.err_msg === "get_brand_wcpay_request:ok") {
// 支付成功
}
});
几个最容易出问题的地方:
1. appId必须一致
这是最常见的原因。你调起支付时传的appId,必须和后端签名时用的appId完全一致,而且这个appId必须是你用来调起微信JSAPI的那个公众号或小程序的appId。很多情况是后端返回的appId和实际页面用的不一致。
2. package参数格式
检查一下后端返回的package是不是
prepay_id=xxx这种格式,前面有prepay_id=前缀的,少了这个前缀就会报签名错误。3. 签名算法确认
微信JSAPI支付用的是SHA256签名,不是MD5。签名的时候参数顺序要按appId、timeStamp、nonceStr、package、signType这个顺序来,参数名要驼峰式命名。
4. 签名用的key
签名用的key是商户号的API密钥(apiKey),不是公众号的AppSecret,很多人搞混。
5. 调试方法
在微信开发者工具里可以用debug模式看具体返回什么,或者让后端直接打印出签名的原字符串,你两边对比一下。
你可以先让后端把用于签名的原始参数字符串打出来,看看和前端传的是否一致,这样能快速定位问题。