微信支付的时候报商户签名错误

prepay_id已经获取成功,paySign签名的参数如下:

appid="+appid+"&nonceStr=" + noncestr + "&package=prepay_id=wx2015041419450958e073ca4a0071648005&signType=MD5&timeStamp=" + timestamp + "&key="+key

html调用

wx.chooseWXPay({
    appid:appid,
    nonceStr: nonceStr,
    package: 'prepay_id=wx2015041419450958e073ca4a0071648005',
    signType: 'MD5', // 注意:新版支付接口使用 MD5 加密
    timeStamp: 1429013035,
    paySign: '9522562E7050CA0104ECBF30ECEA33EB'
});

的时候就报错,商户签名错误,如何解决啊?

阅读 45.5k
6 个回答

我也是这个问题 用了各种方法 都是这样 不知道为啥
微信特么全是坑

我的已经搞定,是设置问题,通过设置就可以解决问题,

比如 有支付那块安全域名设置,
比如 你设置的 是 abc.com/wx/
你支付回调不能用 abc.com/wx/订单号/价格 这样的path方式
你只能使用 abc.com/wx/订单号?price=20 这样的querystring模式

这样就好了

这个帖子我也遇到一模一样的问题,刚刚解决掉,特意过来分享一下答案,以免还有人再被坑。

wx.chooseWXPay是新版微信支付的接口,具体使用可以查看官方文档,目前该文档写的还是很容易误解的,希望日后会改进。目前这个文档我摘抄一下(重点是加粗部分):

wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=...)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});
备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。

这里调用签名出问题的玄机都是在大小写和所需字段上。有以下几个问题千万注意:
1. appId是参与签名,但是不是函数调用的字段,注意这里的I是大写。
2. timestamp是在js中用小写,但是签名的时候S是大写的。(我就是这里给坑了一整天)

以题主的数据为例,所以调用的时候拼接规则是:

appId="+appId + "&nonceStr="+noncestr + "&package=prepay_id=wx2015041419450958e073ca4a0071648005&signType=MD5&timeStamp=" + timestamp + "&key="+key

然后把这个字符按MD5就能获取到对应的paySign。然后就可以直接取调用接口了,大概的格式如下:

`wx.chooseWXPay({
    nonceStr: nonceStr,
    package: 'prepay_id=wx2015041419450958e073ca4a0071648005',
    signType: 'MD5', // 注意:新版支付接口使用 MD5 加密
    timestamp: 1429013035,
    paySign: 'xxx' // 就是上面算出来的sign
});
新手上路,请多包涵

遇到同样问题,求解决方法

新手上路,请多包涵

和楼主遇到一样的问题,求解决

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏