我调用小程序的微信支付api,一直报签名验证错误,参与签名的参数有timeStamp、nonceStr、package、signType。使用微信支付签名校验工具生成的签名跟我自己服务器生成的签名是一样的,但还是报签名错误。

err_desc: “支付验证签名失败”, err_code: “-1”, errMsg: “requestPayment:fail”

wx.requestPayment({
         'nonceStr': res.data.nonce_str,
         'package': res.data.package,
         'signType': 'MD5',
         'timeStamp': res.data.timeStamp,
         'paySign': res.data.paySign,
          ……

timestamp也检查了,没问题。
看开发社区官网回复

Q:我调用小程序的微信支付api,一直报签名验证错误,参与签名的参数有timeStamp、nonceStr、package、signType。使用微信支付签名校验工具生成的签名跟我自己服务器生成的签名是一样的,但还是报签名错误。
A:appId不需要传入支付api,但是需要参与签名。

还有自己百度的

一,服务商模式下的支付参数说明

1.mch_id(微信支付分配的商户号)和appId(微信分配的公众账号ID)是成对出现的.

先在公众平台获取appId(微信分配的公众账号ID)和appSecret(appSecret在支付时可以不用)

其次在服务商支付平台获取mch_id(微信支付分配的商户号)以及signKey(在服务商模式下统一下单签名和小程序支付二次签名都是用该signKey,而不是拉起支付的小程序对应的signKey)

2.sub_appid可以时子商户主体下的小程序appid, 也可以是服务商主体下的小程序(服务商主体下的小程序绑定的mch_id可以不是服务商账户对应的mch_id但一定要求是其主体下, 但是该小程序id一定要在代理商户下绑定)

3.sub_openid必填,openid不再填写

二, 两次签名

1.调取统一下单接口需要签名,此处签名失败, 微信服务器会给服务商后台返错误信息.

2.统一下单获取到prepayid, 然后需要再次签名, 此时用到的签名字段中appid是当前调起微信支付的小程序appid, 而不是服务商对应的appid 具体见:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=7_7&index=3

二次签名用到的signkey还是服务商对应的, 而不是拉起微信支付小程序对应的signkey

3.第二次签名失败, 只会在前端拉起支付时报错, 后台不会报错, 而且只有ios端才会显示是签名错误, 而安卓小程序不会显示

三,appsecret

在统一下单接口, appsecret可以传null, 但是在通过jscode换取openid时, 该appsecret必须填写, 且与拉起支付的小程序的appid相对应的哪个appsecret

然而,都不行。。。

终极解决办法如下:

修改WXPay.java ,注意如果是正式环境也用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 = SignType.MD5; // 沙箱环境
        }
        else {
            this.signType = SignType.MD5;
        }
        this.wxPayRequest = new WXPayRequest(config);
    }

原因就是出在signType上,方法亲测可用!