统一下单正常返回了预支付id。进行二次签名。加密前的原文为:appId=wx0b****13&nonceStr=QxY****a&package=prepay_id=wx2117***00&signType=MD5&timeStamp=1587461482
返回给前端调起支付:
{ appId: 'wx****13',
nonceStr: 'Q****z8a',
package: 'prepay_id=wx2****00',
signType: 'MD5',
timeStamp: 1587461482,
paySign: 'D9*****31DB' }
前端直接用返回json串调起支付:
window.WeixinJSBridge.invoke('getBrandWCPayRequest', wxJson, function(res){}
终于成功了。
1.spbill_create_ip 一定要用终端用户的ip,不要用服务器ip;
2.二次签名:官方文档给的5个参数appId,nonceStr,package,signType,timeStamp按key排序拼串后一定要再拼上商户平台的key。
强烈建议微信官方文档再仔细一点,把细节标注一下。网上很多人趟雷,造成不必要的时间浪费。建议把大家普遍遇到的问题和最终的解决方案统一收集起来。修改官方文档,尽量明确细节。
一般这种报错,是你的调起支付时候的签名类型和之前统一下单的不一致造成的。仔细核对检查一下。
1.统一下单spbill_create_ip是用发起http请求的服务器ip还是终端用户的ip,而且这个参数我统一下单的时候没有传也成功返回了预支付id。
2.二次签名用的nonceStr既然只是为了让签名不容易破解,我直接用的统一下单返回的nonce_str。这会不会引起签名错误?也就是说贵方在调起支付的环节有没有判断这个nonce_str跟统一下单时传的是同一个。
3.二次签名时,参与签名的参数:appId,nonceStr,package,signType,timeStamp。以键排序再拼接成以&连接的url参数字符串用做明文进行md5加密前,要不要在这个字符串后面拼上 '&key=' + MCH_KEY再进行md5加密。
4.前端调起支付的时候可以直接将后端返回的json串直接作为参数发起支付吗?像这样:window.WeixinJSBridge.invoke(‘getBrandWCPayRequest’, wxJson, function(res){}
二次签名的签名方式要与统一下单的签名方式保持一致,你检查一下这个