小程序调起支付时提示“签名错误”怎么办?

欧阳曦月 阅读 3

我在开发微信小程序的支付功能,后端返回了 prepay_id 和签名,但前端调用 wx.requestPayment 时一直报“签名错误”。

已经确认 appId、timeStamp、nonceStr、package、signType 都传了,也按文档做了大小写处理,可还是不行。是不是签名算法哪里出问题了?

后端给的签名参数是这样的:

{
  "appId": "wx1234567890",
  "timeStamp": "1712345678",
  "nonceStr": "abcdefg123456",
  "package": "prepay_id=wx1234567890abcdef",
  "signType": "RSA",
  "paySign": "a1b2c3d4e5f6..."
}

我前端直接把这些字段传给 wx.requestPayment,但就是过不去,急死了!

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
新利🍀
哎呀这个签名错误真的折磨人,我之前也被坑过好几次!可以试试这样:

首先确认下签名参数拼接顺序,微信要求严格按这个顺序拼接字符串:
appId、timeStamp、nonceStr、package、signType(注意大小写)

然后重点来了!现在用RSA签名的话,paySign要用后端给的整个字符串,不能自己拼接。你检查下是不是前端自己拼接参数生成了签名?如果是的话就错了,RSA签名必须完全用后端返回的paySign值。

前端调用应该长这样:
wx.requestPayment({
appId: 'wx1234567890',
timeStamp: '1712345678',
nonceStr: 'abcdefg123456',
package: 'prepay_id=wx1234567890abcdef',
signType: 'RSA',
paySign: 'a1b2c3d4e5f6...' // 这里必须用后端返回的完整签名
})


还有个坑就是时间戳,确认下是不是字符串类型传的?微信要求字符串格式的数字时间戳。

如果还是不行,让后端把签名的原始字符串和生成结果打印出来,两边对比下看哪里对不上。我上次就是发现后端把package值多包了一层引号...真的会谢!
点赞 1
2026-03-09 11:22