weixin-java-pay对接微信V3支付记录
2021-10-16 23:49:37 1648
https://github.com/binarywang/weixin-java-pay-demo
这个demo里, 没有v3版本的配置, 这里记录一下
v3支付, 相对之前的版本来说, 更为安全, 也相对繁琐一些, 而且请求和响应都使用了json格式的数据
1. 配置
发起支付所需的配置有三个证书文件, 在商户后台申请
apiclient_cert.p12
apiclient_key.pem
apiclient_cert.pem
完整配置
@Bean
@ConditionalOnMissingBean
public WxPayService wxService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
payConfig.setPrivateKeyPath(StringUtils.trimToNull(this.properties.getPrivateKeyPath()));
payConfig.setPrivateCertPath(StringUtils.trimToNull(this.properties.getPrivateCertPath()));
payConfig.setApiV3Key(StringUtils.trimToNull(this.properties.getApiV3Key()));
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
2. 发起支付
小程序端 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
WxPayUnifiedOrderV3Result.JsapiResult result = wxService.createOrderV3(TradeTypeEnum.JSAPI, request);
System.out.println(result);
3. 回调处理
文档 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_5.shtml
WxPayOrderNotifyV3Result result = wxService.parseOrderNotifyV3Result("notifyData", new SignatureHeader());
WxPayOrderNotifyV3Result.DecryptNotifyResult notifyResult = result.getResult();
WxPayNotifyResponse.success("成功");
SignatureHeader内的属性都可以在文档内找到获取方法
注意
支付通知http应答码为200或204才会当作正常接收,当回调处理异常时,应答的HTTP状态码应为500,或者4xx。
这个是官方文档原文, 如果应答报文code
为fail
, 但http状态码为200
, 微信也认为你是正常处理, 不会重试回调
没什么好说的, v3支付使用json进行数据交互, 但weixin-java-pay提供的应答方法是以xml格式返回的, 可以自定义对象返回json
注意微信回调并非100%可靠, 需要补偿机制