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 | 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<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<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<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<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<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<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 | } | ... | ... |