JSAPI支付踩坑“支付验证签名失败”
大佬请绕道!
最开始图方便,使用了PHP的http_build_query来将数组转为字符串,此处会将prepay_id=123456789的等号进行转换成%3D导致签名验证失败。
此处建议使用官方的例子,使用字符串将参数拼接,避免出错。
特别注意timestamp的s后端在签名的时候是大写S,而微信的js-sdk里面wx.chooseWXPay接口调用时是小写。
微信js-sdk文档里面还有一个坑。
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});
调用这个接口居然没有用appId这个参数,不管你怎么调,最后都报支付验证签名失败。
最终在微信支付官方的文档里面看到调用接口有appId,果断加上试了一下。成功了。