Commit fd8567f0fae85cffc1aa8bc56900b8623531c9c3
1 parent
4d25e810
fix:【PAY 支付】wxjava v3 微信支付,connection pool shutdown 问题
Showing
1 changed file
with
16 additions
and
3 deletions
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<WxPayClientC | @@ -223,6 +226,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<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<WxPayClientC | @@ -295,6 +299,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<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<WxPayClientC | @@ -410,6 +415,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<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<WxPayClientC | @@ -433,6 +439,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<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<WxPayClientC | @@ -478,6 +485,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<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<WxPayClientC | @@ -541,6 +549,11 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<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 | } |