微信支付在移动端调起失败怎么办?

司马永莲 阅读 4

我在做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") {
    // 支付成功
  }
});
我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
Top丶篷璐
这个"invalid signature"错误我之前也踩过坑,说白了就是签名验证不通过,微信那边校验你发过去的参数和它算出来的签名对不上。

几个最容易出问题的地方:

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模式看具体返回什么,或者让后端直接打印出签名的原字符串,你两边对比一下。

你可以先让后端把用于签名的原始参数字符串打出来,看看和前端传的是否一致,这样能快速定位问题。
点赞
2026-03-13 22:00