大佬请绕道!
最开始图方便,使用了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,果断加上试了一下。成功了。
微信这个jsapi就是个垃圾,,调了几天了,还是签名错误
我按照你说的加了后不行啊
遇到同样的问题,有两种可能,一种就是参数大小写的问题,另一种就是版本问题
遇到了同样的问题,解决过程是 前后端1个1个对比统一参数。小程序后端的加密字段和App的不一致特别注意这几个 appid和appId的区别 payMap.put("appId",); payMap.put("timeStamp",); payMap.put("nonceStr",); payMap.put("signType",); payMap.put("package","prepay_id="+prepayId);
牛啊牛啊,狗样的大小写
就是大小写s问题卡了一天
统一下单完成后,需要返回给前端的参数中的签名paySign ,一定要再次生成!!!!
网页端接口请求参数列表(参数需要重新进行签名计算,参与签名的参数为:appId、timeStamp、nonceStr、package、signType,参数区分大小写。)
详情参考手册
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
合单 支付 返回前端 接口 的 paySign 怎么计算呀?大哥 求助 我用的php 有demo吗