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