uniapp-微信小程序支付二次签名错误解决

背景

我们用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,避免节外生枝

你可能感兴趣的:(uni-app)