Commit fd8567f0fae85cffc1aa8bc56900b8623531c9c3

Authored by YunaiV
1 parent 4d25e810

fix:【PAY 支付】wxjava v3 微信支付,connection pool shutdown 问题

yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java
... ... @@ -69,6 +69,8 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
69 69 } else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) {
70 70 payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath());
71 71 payConfig.setPublicKeyPath(FileUtils.createTempFile(config.getPublicKeyContent()).getPath());
  72 + // 特殊:强制使用微信公用模式,避免灰度期间的问题!!!
  73 + payConfig.setStrictlyNeedWechatPaySerial(true);
72 74 }
73 75  
74 76 // 创建 client 客户端
... ... @@ -85,12 +87,14 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
85 87 case API_VERSION_V2:
86 88 return doUnifiedOrderV2(reqDTO);
87 89 case API_VERSION_V3:
  90 + // TODO @芋艿:【可能是 wxjava 的 bug】参考 https://github.com/binarywang/WxJava/issues/1557
  91 + client.getConfig().setApiV3HttpClient(null);
88 92 return doUnifiedOrderV3(reqDTO);
89 93 default:
90 94 throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
91 95 }
92 96 } catch (WxPayException e) {
93   - log.error("[doUnifiedOrder][退款({}) 发起微信支付异常", reqDTO, e);
  97 + log.error("[doUnifiedOrder][支付({}) 发起微信支付异常", reqDTO, e);
94 98 String errorCode = getErrorCode(e);
95 99 String errorMessage = getErrorMessage(e);
96 100 return PayOrderRespDTO.closedOf(errorCode, errorMessage,
... ... @@ -176,8 +180,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
176 180  
177 181 private PayOrderRespDTO doParseOrderNotifyV3(String body, Map<String, String> headers) throws WxPayException {
178 182 // 1. 解析回调
179   -// SignatureHeader signatureHeader = getRequestHeader(headers);
180   - SignatureHeader signatureHeader = null;
  183 + SignatureHeader signatureHeader = getRequestHeader(headers);
181 184 WxPayNotifyV3Result response = client.parseOrderNotifyV3Result(body, signatureHeader);
182 185 WxPayNotifyV3Result.DecryptNotifyResult result = response.getResult();
183 186 // 2. 构建结果
... ... @@ -223,6 +226,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
223 226 }
224 227  
225 228 private PayOrderRespDTO doGetOrderV3(String outTradeNo) throws WxPayException {
  229 + fixV3HttpClientConnectionPoolShutDown();
226 230 // 构建 WxPayUnifiedOrderRequest 对象
227 231 WxPayOrderQueryV3Request request = new WxPayOrderQueryV3Request()
228 232 .setOutTradeNo(outTradeNo);
... ... @@ -295,6 +299,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
295 299 }
296 300  
297 301 private PayRefundRespDTO doUnifiedRefundV3(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
  302 + fixV3HttpClientConnectionPoolShutDown();
298 303 // 1. 构建 WxPayRefundRequest 请求
299 304 WxPayRefundV3Request request = new WxPayRefundV3Request()
300 305 .setOutTradeNo(reqDTO.getOutTradeNo())
... ... @@ -410,6 +415,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
410 415 }
411 416  
412 417 private PayRefundRespDTO doGetRefundV3(String outTradeNo, String outRefundNo) throws WxPayException {
  418 + fixV3HttpClientConnectionPoolShutDown();
413 419 // 1. 构建 WxPayRefundRequest 请求
414 420 WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request();
415 421 request.setOutRefundNo(outRefundNo);
... ... @@ -433,6 +439,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
433 439  
434 440 @Override
435 441 protected PayTransferRespDTO doUnifiedTransfer(PayTransferUnifiedReqDTO reqDTO) throws WxPayException {
  442 + fixV3HttpClientConnectionPoolShutDown();
436 443 // 1. 构建 TransferBillsRequest 请求
437 444 TransferBillsRequest request = TransferBillsRequest.newBuilder()
438 445 .appid(this.config.getAppId())
... ... @@ -478,6 +485,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
478 485  
479 486 @Override
480 487 protected PayTransferRespDTO doGetTransfer(String outTradeNo) throws WxPayException {
  488 + fixV3HttpClientConnectionPoolShutDown();
481 489 // 1. 执行请求
482 490 TransferBillsGetResult response = client.getTransferService().getBillsByOutBillNo(outTradeNo);
483 491  
... ... @@ -541,6 +549,11 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
541 549 .build();
542 550 }
543 551  
  552 + // TODO @芋艿:可能是 wxjava 的 bug:https://github.com/binarywang/WxJava/issues/1557
  553 + private void fixV3HttpClientConnectionPoolShutDown() {
  554 + client.getConfig().setApiV3HttpClient(null);
  555 + }
  556 +
544 557 static String formatDateV2(LocalDateTime time) {
545 558 return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), PURE_DATETIME_PATTERN);
546 559 }
... ...