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

司马永莲 阅读 118

我在做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") {
    // 支付成功
  }
});
我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
小晴文
小晴文 Lv1
从后端角度来看,这个问题大概率是签名生成环节出了问题。虽然你说本地测试正常,但上线环境和本地环境可能有差异。

首先检查你的服务器时间是否和标准时间一致,时间差超过5分钟可能会导致签名验证失败。再就是确认域名配置,线上环境需要在微信支付商户后台配置合法域名。

另外要注意的是,在生成签名时,参数排序要严格按照字典序来排,不能随便写。这里给你一个PHP示例代码:


$sign = [
'appId' => $appId,
'timeStamp' => $timeStamp,
'nonceStr' => $nonceStr,
'package' => $package,
'signType' => $signType
];
ksort($sign);
$stringA = http_build_query($sign) . '&key=' . $apiKey;
$paySign = strtoupper(md5($stringA));


最后建议你把完整的请求和返回都打印出来对比下,很多时候问题就出在细节上。说实话这种签名错误排查起来确实挺烦人的,慢慢来吧。
点赞
2026-03-25 23:23
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