首页 小程序 微信支付V3 微信小程序签名失败问题

微信支付V3 微信小程序签名失败问题

微信支付的V3版本使用的是RSA加密,从前的V2版本使用的是MD5加密。今天在调试微信小程序的时候,始终无法调起微信支付,提示“支付签名验证失败”

问题排查思路:

1. 先调起其它接口,如统一下单、订单查询、关单接口等,如果调起其它接口正常,则代表各种参数都正常,如证书、商户号、密钥等都正确。

统一下单接、关单、查单接口可以参考【Java教程】微信支付V3版本_哔哩哔哩_bilibili

同一商户的微信小程序的appId和APP应用的appId不同,但商户号和证书密钥等参数都相同

2.签名串需要严格区分大小写,注意字符串最后还要拼接“\n”

不同API的下单地址不同,参数有少量差别

APP下单地址:https://api.mch.weixin.qq.com/v3/pay/transactions/app

小程序下单地址:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi

两种API的最后一级不同。

另外小程序获取预支付id需要用户登录的openId,且下单付款的用户必须和登录的用户是一个

APP签名串

  1. wx8888888888888888
  2. 1414561699
  3. 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
  4. WX1217752501201407033233368018

JSAPI签名串

  1. wx8888888888888888
  2. 1414561699
  3. 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
  4. prepay_id=wx201410272009395522657a690389285100

两种API的前三个串都是appId、时间戳、随机字符串

不同的是,app的第四个串是预支付id,而小程序的签名串需要在预支付id前写一个prepay_id=

注意能获取到预支付信息prepay_id不代表能调起应用成功

3.签名方法不同

我在调起app的时候一次就成功付款了,以至于没有怀疑过签名算法有问题,卡了四个多小时就是不知道为什么,最后终于让我发现了这个坑

在微信的官方demo里

com.wechat.pay.contrib.apache.httpclient.util.RsaCryptoUtil.encryptOAEP(String message, X509Certificate certificate)

第一次就是用这个方法给app做签名串的,没有任何问题,后来迁移到小程序就不行了,

小程序不能用这个方法,要用

  1. String sign(byte[] message) {
  2. Signature sign = Signature.getInstance("SHA256withRSA");
  3. sign.initSign(你的私钥privateKey);
  4. sign.update(message);
  5. return Base64.getEncoder().encodeToString(sign.sign());
  6. }
特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。