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

This commit is contained in:
YunaiV 2025-05-11 08:52:52 +08:00
parent 4d25e810e3
commit fd8567f0fa
1 changed files with 16 additions and 3 deletions

View File

@ -69,6 +69,8 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
} else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) { } else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) {
payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath()); payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath());
payConfig.setPublicKeyPath(FileUtils.createTempFile(config.getPublicKeyContent()).getPath()); payConfig.setPublicKeyPath(FileUtils.createTempFile(config.getPublicKeyContent()).getPath());
// 特殊强制使用微信公用模式避免灰度期间的问题
payConfig.setStrictlyNeedWechatPaySerial(true);
} }
// 创建 client 客户端 // 创建 client 客户端
@ -85,12 +87,14 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
case API_VERSION_V2: case API_VERSION_V2:
return doUnifiedOrderV2(reqDTO); return doUnifiedOrderV2(reqDTO);
case API_VERSION_V3: case API_VERSION_V3:
// TODO @芋艿可能是 wxjava bug参考 https://github.com/binarywang/WxJava/issues/1557
client.getConfig().setApiV3HttpClient(null);
return doUnifiedOrderV3(reqDTO); return doUnifiedOrderV3(reqDTO);
default: default:
throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
} }
} catch (WxPayException e) { } catch (WxPayException e) {
log.error("[doUnifiedOrder][退款({}) 发起微信支付异常", reqDTO, e); log.error("[doUnifiedOrder][支付({}) 发起微信支付异常", reqDTO, e);
String errorCode = getErrorCode(e); String errorCode = getErrorCode(e);
String errorMessage = getErrorMessage(e); String errorMessage = getErrorMessage(e);
return PayOrderRespDTO.closedOf(errorCode, errorMessage, return PayOrderRespDTO.closedOf(errorCode, errorMessage,
@ -176,8 +180,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
private PayOrderRespDTO doParseOrderNotifyV3(String body, Map<String, String> headers) throws WxPayException { private PayOrderRespDTO doParseOrderNotifyV3(String body, Map<String, String> headers) throws WxPayException {
// 1. 解析回调 // 1. 解析回调
// SignatureHeader signatureHeader = getRequestHeader(headers); SignatureHeader signatureHeader = getRequestHeader(headers);
SignatureHeader signatureHeader = null;
WxPayNotifyV3Result response = client.parseOrderNotifyV3Result(body, signatureHeader); WxPayNotifyV3Result response = client.parseOrderNotifyV3Result(body, signatureHeader);
WxPayNotifyV3Result.DecryptNotifyResult result = response.getResult(); WxPayNotifyV3Result.DecryptNotifyResult result = response.getResult();
// 2. 构建结果 // 2. 构建结果
@ -223,6 +226,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
} }
private PayOrderRespDTO doGetOrderV3(String outTradeNo) throws WxPayException { private PayOrderRespDTO doGetOrderV3(String outTradeNo) throws WxPayException {
fixV3HttpClientConnectionPoolShutDown();
// 构建 WxPayUnifiedOrderRequest 对象 // 构建 WxPayUnifiedOrderRequest 对象
WxPayOrderQueryV3Request request = new WxPayOrderQueryV3Request() WxPayOrderQueryV3Request request = new WxPayOrderQueryV3Request()
.setOutTradeNo(outTradeNo); .setOutTradeNo(outTradeNo);
@ -295,6 +299,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
} }
private PayRefundRespDTO doUnifiedRefundV3(PayRefundUnifiedReqDTO reqDTO) throws Throwable { private PayRefundRespDTO doUnifiedRefundV3(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
fixV3HttpClientConnectionPoolShutDown();
// 1. 构建 WxPayRefundRequest 请求 // 1. 构建 WxPayRefundRequest 请求
WxPayRefundV3Request request = new WxPayRefundV3Request() WxPayRefundV3Request request = new WxPayRefundV3Request()
.setOutTradeNo(reqDTO.getOutTradeNo()) .setOutTradeNo(reqDTO.getOutTradeNo())
@ -410,6 +415,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
} }
private PayRefundRespDTO doGetRefundV3(String outTradeNo, String outRefundNo) throws WxPayException { private PayRefundRespDTO doGetRefundV3(String outTradeNo, String outRefundNo) throws WxPayException {
fixV3HttpClientConnectionPoolShutDown();
// 1. 构建 WxPayRefundRequest 请求 // 1. 构建 WxPayRefundRequest 请求
WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request(); WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request();
request.setOutRefundNo(outRefundNo); request.setOutRefundNo(outRefundNo);
@ -433,6 +439,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
@Override @Override
protected PayTransferRespDTO doUnifiedTransfer(PayTransferUnifiedReqDTO reqDTO) throws WxPayException { protected PayTransferRespDTO doUnifiedTransfer(PayTransferUnifiedReqDTO reqDTO) throws WxPayException {
fixV3HttpClientConnectionPoolShutDown();
// 1. 构建 TransferBillsRequest 请求 // 1. 构建 TransferBillsRequest 请求
TransferBillsRequest request = TransferBillsRequest.newBuilder() TransferBillsRequest request = TransferBillsRequest.newBuilder()
.appid(this.config.getAppId()) .appid(this.config.getAppId())
@ -478,6 +485,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
@Override @Override
protected PayTransferRespDTO doGetTransfer(String outTradeNo) throws WxPayException { protected PayTransferRespDTO doGetTransfer(String outTradeNo) throws WxPayException {
fixV3HttpClientConnectionPoolShutDown();
// 1. 执行请求 // 1. 执行请求
TransferBillsGetResult response = client.getTransferService().getBillsByOutBillNo(outTradeNo); TransferBillsGetResult response = client.getTransferService().getBillsByOutBillNo(outTradeNo);
@ -541,6 +549,11 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
.build(); .build();
} }
// TODO @芋艿可能是 wxjava bughttps://github.com/binarywang/WxJava/issues/1557
private void fixV3HttpClientConnectionPoolShutDown() {
client.getConfig().setApiV3HttpClient(null);
}
static String formatDateV2(LocalDateTime time) { static String formatDateV2(LocalDateTime time) {
return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), PURE_DATETIME_PATTERN); return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), PURE_DATETIME_PATTERN);
} }