背景
我们用uniapp开发过了app支付,这次接入微信小程序支付。uniapp的优点就是前端和后端的代码几乎不用做调整,只需要根据文档调整个别参数即可。
问题
第一步统一下单的接口没有做调整,第二部根据小程序再次签名的规则写好后,发现唤起支付时报“支付签名错误”,经过和官方文档大量核对发现根本没问题
uni.requestPayment({
provider: "wxpay",
nonceStr: e.nonceStr,
timeStamp:e.timeStamp,
package:e.package,
signType:'MD5',
paySign: e.paySign,
"appId": "wxb0e02258c4ceb6ce",
success() {
_this.$at.toast('支付成功')
console.log('success:' + JSON.stringify(e));
},
fail(e) {
console.log('fail:' + JSON.stringify(e));
if (e.errMsg.search("客户端未安装") > -1) {
_this.$at.toast('请先安装微信客户端')
} else {
_this.$at.toast('您取消了支付')
}
}
})
解决方案
修改前
由于默认采用的SHA256做的统一下单,第二部二次签名的时候用的MD5,两次签名方法不一致,导致支付唤起签名错误
public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
this.config = config;
this.notifyUrl = notifyUrl;
this.autoReport = autoReport;
this.useSandbox = useSandbox;
if (useSandbox) {
this.signType = WXPayConstants.SignType.MD5; // 沙箱环境
}
else {
this.signType = WXPayConstants.SignType.HMACSHA256;
}
this.wxPayRequest = new WXPayRequest(config);
}
修改后,设置默认值MD5
}
public WXPay(final WXPayConfig config, final boolean autoReport, final String notifyUrl, final String signType) throws Exception{
this.config = config;
this.notifyUrl = notifyUrl;
this.autoReport = autoReport;
this.useSandbox = false;
this.signType = "MD5".equals(signType)?WXPayConstants.SignType.MD5:WXPayConstants.SignType.HMACSHA256;
this.wxPayRequest = new WXPayRequest(config);
}
总结
微信官方文档有点乱,这么明显的错误也没有改过来。总之就是第一步统一下单和二次签名方法要保持一致,否则会出现“支付签名错误”。uniapp默认只支持md5,所以用uniapp的同学,尽量按照我的方法加密的时候直接采用MD5,避免节外生枝