第一个问题,使用正常的V3支付,返回无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。
报错如下
- 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
- <dependency>
- <groupId>com.github.wechatpay-apiv3</groupId>
- <artifactId>wechatpay-java</artifactId>
- <version>0.2.12</version>
- </dependency>
复制代码 代码
- Config config = new RSAAutoCertificateConfig.Builder()
- .merchantId(merchantId)
- .merchantSerialNumber(merchantSerialNumber)
- .privateKeyFromPath(privateKeyPath)
- .apiV3Key(apiV3Key)
- .build();
复制代码
依赖
- <dependency>
- <groupId>com.github.wechatpay-apiv3</groupId>
- <artifactId>wechatpay-java</artifactId>
- <version>0.2.14</version>
- </dependency>
复制代码 代码
- Config config =
- new RSAPublicKeyConfig.Builder()
- .merchantId(merchantId)
- .privateKeyFromPath(privateKeyPath)
- .publicKeyFromPath(publicKeyPath)
- .publicKeyId(publicKeyId)
- .merchantSerialNumber(merchantSerialNumber)
- .apiV3Key(apiV3Key)
- .build();
复制代码 第二个问题,以上改好发送获取支付的链接,报错:java.lang.IllegalArgumentException: Illegal base64 character 2d
异常部分有用完整报文:
- 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)
复制代码 报错缘故原由息争决办法
缘故原由是:.publicKeyFromPath(publicKeyPath)输入公钥路径的时间我输入是apiclient_cert.pem,所以导致报错,用错证书了。
办理办法:去下载V3的公钥pub_key.pem。
下载的步骤如下图:
原代码:
- /**
- * 公钥路径
- */
- private String publicKeyPath = "data/testPay/apiclient_cert.pem";
复制代码 新代码
- /**
- * 公钥路径
- */
- private String publicKeyPath = "data/testPay/pub_key.pem";
复制代码 换成新的公钥pub_key.pem的路径就可以正常吊起支付了
完整代码
次测试使用的是Native下单
代码做个参考
- 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;
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |