ToB企服应用市场:ToB评测及商务社交产业平台

标题: 微信支付V3平台证书切换成公钥碰到的问题。【无可用的平台证书,请在商户平 [打印本页]

作者: 不到断气不罢休    时间: 2024-11-28 07:33
标题: 微信支付V3平台证书切换成公钥碰到的问题。【无可用的平台证书,请在商户平
第一个问题,使用正常的V3支付,返回无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。

报错如下
  1. httpResponseBody[{"code":"RESOURCE_NOT_EXISTS","message":"无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。可查看指引https://pay.weixin.qq.com/docs/merchant/products/platform-certificate/wxp-pub-key-guide.html"}]       
复制代码
办理办法:
起首由于由于我们使用了微信公钥调起支付,商户可使用微信支付的公钥验证应答和回调的署名,可使用微信支付公钥和公钥ID初始化。所以不能使用原来的RSAAutoCertificateConfig来创建支付配置,而要使用RSAPublicKeyConfig。支付的maven从0.2.12升级到0.2.14才有RSAPublicKeyConfig。
在微信支付Github也更新了最新的微信V3公钥支付的调用:wechatpay-java

  1. <dependency>
  2.       <groupId>com.github.wechatpay-apiv3</groupId>
  3.       <artifactId>wechatpay-java</artifactId>
  4.       <version>0.2.12</version>
  5. </dependency>
复制代码
代码
  1. Config config = new RSAAutoCertificateConfig.Builder()
  2.         .merchantId(merchantId)
  3.         .merchantSerialNumber(merchantSerialNumber)
  4.         .privateKeyFromPath(privateKeyPath)
  5.         .apiV3Key(apiV3Key)
  6.         .build();
复制代码

依赖
  1. <dependency>
  2.     <groupId>com.github.wechatpay-apiv3</groupId>
  3.     <artifactId>wechatpay-java</artifactId>
  4.     <version>0.2.14</version>
  5. </dependency>
复制代码
代码
  1. Config config =
  2.         new RSAPublicKeyConfig.Builder()
  3.                 .merchantId(merchantId)
  4.                 .privateKeyFromPath(privateKeyPath)
  5.                 .publicKeyFromPath(publicKeyPath)
  6.                 .publicKeyId(publicKeyId)
  7.                 .merchantSerialNumber(merchantSerialNumber)
  8.                 .apiV3Key(apiV3Key)
  9.                 .build();
复制代码
第二个问题,以上改好发送获取支付的链接,报错:java.lang.IllegalArgumentException: Illegal base64 character 2d

异常部分有用完整报文:
  1. java.lang.IllegalArgumentException: Illegal base64 character 2d
  2.         at java.util.Base64$Decoder.decode0(Base64.java:714)
  3.         at java.util.Base64$Decoder.decode(Base64.java:526)
  4.         at java.util.Base64$Decoder.decode(Base64.java:549)
  5.         at com.wechat.pay.java.core.util.PemUtil.loadPublicKeyFromString(PemUtil.java:90)
  6.         at com.wechat.pay.java.core.util.PemUtil.loadPublicKeyFromPath(PemUtil.java:128)
  7.         at com.wechat.pay.java.core.RSAPublicKeyConfig$Builder.publicKeyFromPath(RSAPublicKeyConfig.java:96)
  8.         at com.zhjs.service.impl.TestPay.nativePay(TestPay.java:75)
  9.         at com.zhjs.controller.TestController.test(TestController.java:32)
  10.         at com.zhjs.controller.TestController$$FastClassBySpringCGLIB$$f90b7656.invoke(<generated>)
  11.         at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
复制代码
报错缘故原由息争决办法
缘故原由是:.publicKeyFromPath(publicKeyPath)输入公钥路径的时间我输入是apiclient_cert.pem,所以导致报错,用错证书了。
办理办法:去下载V3的公钥pub_key.pem。

下载的步骤如下图:


原代码:
  1. /**
  2. * 公钥路径
  3. */
  4. private String publicKeyPath = "data/testPay/apiclient_cert.pem";
复制代码
新代码
  1. /**
  2. * 公钥路径
  3. */
  4. private String publicKeyPath = "data/testPay/pub_key.pem";
复制代码
换成新的公钥pub_key.pem的路径就可以正常吊起支付了
完整代码

次测试使用的是Native下单
代码做个参考
  1. public class TestPay {
  2.     /**
  3.      * 商户号
  4.      */
  5.     private String merchantId = "xxxxxxx";
  6.     /**
  7.      * 私钥路径
  8.      */
  9.     private String privateKeyPath = "data/testPay/apiclient_key.pem";
  10.     /**
  11.      * 公钥路径
  12.      */
  13.     private String publicKeyPath = "data/testPay/pub_key.pem";
  14.     /**
  15.      * 商户APIv3密钥公钥
  16.      */
  17.     private String publicKeyId = "xxxxxx";
  18.     /**
  19.      * 商户API证书序列号
  20.      */
  21.     private String merchantSerialNumber = "xxxxxxxx";
  22.     /**
  23.      * APIv3密钥
  24.      */
  25.     private String apiV3Key = "xxxxxxxxxx";
  26.     /**
  27.      * appid
  28.      */
  29.     private String appId = "xxxxxxxx";
  30.     /**
  31.      * Native下单
  32.      */
  33.     public Map<String, Object> nativePay() {
  34.         //创建支付配置
  35.         Config config =
  36.                 new RSAPublicKeyConfig.Builder()
  37.                         .merchantId(merchantId)
  38.                         .privateKeyFromPath(privateKeyPath)
  39.                         .publicKeyFromPath(publicKeyPath)
  40.                         .publicKeyId(publicKeyId)
  41.                         .merchantSerialNumber(merchantSerialNumber)
  42.                         .apiV3Key(apiV3Key)
  43.                         .build();
  44.         //1.0创建支付服务
  45.         NativePayService service = new NativePayService.Builder().config(config).build();
  46.         //2.0创建预支付请求体
  47.         PrepayRequest prepayRequest = new PrepayRequest();
  48.         prepayRequest.setAppid(appId); //appid
  49.         prepayRequest.setMchid(merchantId); //商户号
  50.         //2.1 商品描述
  51.         prepayRequest.setDescription("test");
  52.         //2.2 todo 商户订单号 随机生成Utility.generateRandomString(16)是随机生成的 换成你自己的
  53.         prepayRequest.setOutTradeNo(Utility.generateRandomString(16));
  54.         //2.3 支付超时时间
  55.         prepayRequest.setTimeExpire(Utility.getTimeFactory());
  56.         //2.4 todo 回调地址
  57.         prepayRequest.setNotifyUrl("https://www.baidu.com/xxxxxx");
  58.         //2.5 todo 附加信息 创建一个 JSON 对象 不需要可以删除
  59.         JSONObject jsonObjectAttach = new JSONObject();
  60.         jsonObjectAttach.put("orId", "xxx");
  61.         jsonObjectAttach.put("orStatus", "xxxx");
  62.         prepayRequest.setAttach(jsonObjectAttach.toJSONString());
  63.         //2.6订单金额
  64.         Amount amount = new Amount();
  65.         //金额 1=0.01
  66.         amount.setTotal(100);
  67.         amount.setCurrency("CNY");
  68.         prepayRequest.setAmount(amount);
  69.         //3.0 调用接口
  70.         PrepayResponse prepay = service.prepay(prepayRequest);
  71.         //打印支付结果
  72.         System.out.println(prepay);
  73.         Map<String, Object> map = new HashMap<>();
  74.         map.put("data",prepay.getCodeUrl());
  75.         return map;
  76.     }
  77. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4