中国红客联盟 首页 资讯 国内安全 查看内容

微信支付V3平台证书切换成公钥遇到的问题。【无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥】【 Illegal base64 character 2d】

2025-3-4 17:34| 发布者: Honkers| 查看: 581| 评论: 0

摘要: 第一个问题,使用正常的V3支付,返回无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。 报错如下 [code]httpResponseBody[{"code":"RESOURCE_NOT_EXISTS","me

第一个问题,使用正常的V3支付,返回无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。

报错如下

[code]httpResponseBody[{"code":"RESOURCE_NOT_EXISTS","message":"无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。可查看指引https://pay.weixin.qq.com/docs/merchant/products/platform-certificate/wxp-pub-key-guide.html"}] [/code]

解决办法:
首先因为因为我们使用了微信公钥调起支付,商户可使用微信支付的公钥验证应答和回调的签名,可使用微信支付公钥和公钥ID初始化。所以不能使用原来的RSAAutoCertificateConfig来创建支付配置,而要使用RSAPublicKeyConfig。支付的maven从0.2.12升级到0.2.14才有RSAPublicKeyConfig。
在微信支付Github也更新了最新的微信V3公钥支付的调用:wechatpay-java

  • 旧依赖和代码
    maven
[code] <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.12</version> </dependency> [/code]

代码

[code]Config config = new RSAAutoCertificateConfig.Builder() .merchantId(merchantId) .merchantSerialNumber(merchantSerialNumber) .privateKeyFromPath(privateKeyPath) .apiV3Key(apiV3Key) .build(); [/code]
  • 新的依赖和代码

依赖

[code]<dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.14</version> </dependency> [/code]

代码

[code]Config config = new RSAPublicKeyConfig.Builder() .merchantId(merchantId) .privateKeyFromPath(privateKeyPath) .publicKeyFromPath(publicKeyPath) .publicKeyId(publicKeyId) .merchantSerialNumber(merchantSerialNumber) .apiV3Key(apiV3Key) .build(); [/code]

第二个问题,以上改好发送获取支付的链接,报错:java.lang.IllegalArgumentException: Illegal base64 character 2d

异常部分有用完整报文:

[code]java.lang.IllegalArgumentException: Illegal base64 character 2d at java.util.Base64$Decoder.decode0(Base64.java:714) at java.util.Base64$Decoder.decode(Base64.java:526) at java.util.Base64$Decoder.decode(Base64.java:549) at com.wechat.pay.java.core.util.PemUtil.loadPublicKeyFromString(PemUtil.java:90) at com.wechat.pay.java.core.util.PemUtil.loadPublicKeyFromPath(PemUtil.java:128) at com.wechat.pay.java.core.RSAPublicKeyConfig$Builder.publicKeyFromPath(RSAPublicKeyConfig.java:96) at com.zhjs.service.impl.TestPay.nativePay(TestPay.java:75) at com.zhjs.controller.TestController.test(TestController.java:32) at com.zhjs.controller.TestController$$FastClassBySpringCGLIB$$f90b7656.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) [/code]

报错原因和解决办法
原因是:.publicKeyFromPath(publicKeyPath)输入公钥路径的时候我输入是apiclient_cert.pem,所以导致报错,用错证书了。
解决办法:去下载V3的公钥pub_key.pem。

下载的步骤如下图:

请添加图片描述

请添加图片描述

原代码:

[code]/** * 公钥路径 */ private String publicKeyPath = "data/testPay/apiclient_cert.pem"; [/code]

新代码

[code]/** * 公钥路径 */ private String publicKeyPath = "data/testPay/pub_key.pem"; [/code]

换成新的公钥pub_key.pem的路径就可以正常吊起支付了

完整代码

次测试使用的是Native下单
代码做个参考

[code]public class TestPay { /** * 商户号 */ private String merchantId = "xxxxxxx"; /** * 私钥路径 */ private String privateKeyPath = "data/testPay/apiclient_key.pem"; /** * 公钥路径 */ private String publicKeyPath = "data/testPay/pub_key.pem"; /** * 商户APIv3密钥公钥 */ private String publicKeyId = "xxxxxx"; /** * 商户API证书序列号 */ private String merchantSerialNumber = "xxxxxxxx"; /** * APIv3密钥 */ private String apiV3Key = "xxxxxxxxxx"; /** * appid */ private String appId = "xxxxxxxx"; /** * Native下单 */ public Map<String, Object> nativePay() { //创建支付配置 Config config = new RSAPublicKeyConfig.Builder() .merchantId(merchantId) .privateKeyFromPath(privateKeyPath) .publicKeyFromPath(publicKeyPath) .publicKeyId(publicKeyId) .merchantSerialNumber(merchantSerialNumber) .apiV3Key(apiV3Key) .build(); //1.0创建支付服务 NativePayService service = new NativePayService.Builder().config(config).build(); //2.0创建预支付请求体 PrepayRequest prepayRequest = new PrepayRequest(); prepayRequest.setAppid(appId); //appid prepayRequest.setMchid(merchantId); //商户号 //2.1 商品描述 prepayRequest.setDescription("test"); //2.2 todo 商户订单号 随机生成Utility.generateRandomString(16)是随机生成的 换成你自己的 prepayRequest.setOutTradeNo(Utility.generateRandomString(16)); //2.3 支付超时时间 prepayRequest.setTimeExpire(Utility.getTimeFactory()); //2.4 todo 回调地址 prepayRequest.setNotifyUrl("https://www.baidu.com/xxxxxx"); //2.5 todo 附加信息 创建一个 JSON 对象 不需要可以删除 JSONObject jsonObjectAttach = new JSONObject(); jsonObjectAttach.put("orId", "xxx"); jsonObjectAttach.put("orStatus", "xxxx"); prepayRequest.setAttach(jsonObjectAttach.toJSONString()); //2.6订单金额 Amount amount = new Amount(); //金额 1=0.01 amount.setTotal(100); amount.setCurrency("CNY"); prepayRequest.setAmount(amount); //3.0 调用接口 PrepayResponse prepay = service.prepay(prepayRequest); //打印支付结果 System.out.println(prepay); Map<String, Object> map = new HashMap<>(); map.put("data",prepay.getCodeUrl()); return map; } } [/code]

路过

雷人

握手

鲜花

鸡蛋

发表评论

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行