weixin-java-pay对接微信V3支付记录

kyaa111 2年前 ⋅ 1495 阅读

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。

这个是官方文档原文, 如果应答报文codefail, 但http状态码为200, 微信也认为你是正常处理, 不会重试回调

没什么好说的, v3支付使用json进行数据交互, 但weixin-java-pay提供的应答方法是以xml格式返回的, 可以自定义对象返回json

注意微信回调并非100%可靠, 需要补偿机制