From 04bb23b75c0b513b07d77618a28eaa88262e051c Mon Sep 17 00:00:00 2001 From: dagewang <15124178@qq.com> Date: Mon, 11 Sep 2023 10:06:01 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#3128=20=E3=80=90=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E3=80=91=E6=8F=90=E4=BE=9B=E6=89=A9=E5=B1=95?= =?UTF-8?q?httpclientbuilder=E7=9A=84=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/HttpClientBuilderCustomizer.java | 11 ++++ .../binarywang/wxpay/config/WxPayConfig.java | 10 +++ .../impl/WxPayServiceApacheHttpImpl.java | 7 +++ .../config/CustomizedWxPayConfigTest.java | 39 ++++++++++++ .../testbase/CustomizedApiTestModule.java | 61 +++++++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/HttpClientBuilderCustomizer.java create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/CustomizedWxPayConfigTest.java create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/CustomizedApiTestModule.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/HttpClientBuilderCustomizer.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/HttpClientBuilderCustomizer.java new file mode 100644 index 000000000..42f0003d0 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/HttpClientBuilderCustomizer.java @@ -0,0 +1,11 @@ +package com.github.binarywang.wxpay.config; + +import org.apache.http.impl.client.HttpClientBuilder; + +/** + * @author dagewang + */ +@FunctionalInterface +public interface HttpClientBuilderCustomizer { + void customize(HttpClientBuilder var1); +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java index 41ac7fcbf..f97421cb4 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java @@ -27,6 +27,7 @@ import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.Base64; +import java.util.Optional; /** * 微信支付配置 @@ -165,6 +166,11 @@ public class WxPayConfig { private CloseableHttpClient apiV3HttpClient; + /** + * 支持扩展httpClientBuilder + */ + private HttpClientBuilderCustomizer httpClientBuilderCustomizer; + private HttpClientBuilderCustomizer apiV3HttpClientBuilderCustomizer; /** * 私钥信息 */ @@ -283,6 +289,10 @@ public class WxPayConfig { //初始化V3接口正向代理设置 HttpProxyUtils.initHttpProxy(wxPayV3HttpClientBuilder, wxPayHttpProxy); + // 提供自定义wxPayV3HttpClientBuilder的能力 + Optional.ofNullable(apiV3HttpClientBuilderCustomizer).ifPresent(e -> { + e.customize(wxPayV3HttpClientBuilder); + }); CloseableHttpClient httpClient = wxPayV3HttpClientBuilder.build(); this.apiV3HttpClient = httpClient; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java index 8c5191fdb..e2b6d43fa 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java @@ -28,6 +28,7 @@ import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Objects; +import java.util.Optional; /** *
@@ -335,6 +336,12 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl { httpClientBuilder.setDefaultCredentialsProvider(provider) .setProxy(new HttpHost(this.getConfig().getHttpProxyHost(), this.getConfig().getHttpProxyPort())); } + + // 提供自定义httpClientBuilder的能力 + Optional.ofNullable(getConfig().getHttpClientBuilderCustomizer()).ifPresent(e -> { + e.customize(httpClientBuilder); + }); + return httpClientBuilder; } diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/CustomizedWxPayConfigTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/CustomizedWxPayConfigTest.java new file mode 100644 index 000000000..a42026e3e --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/CustomizedWxPayConfigTest.java @@ -0,0 +1,39 @@ +package com.github.binarywang.wxpay.config; + +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.testbase.CustomizedApiTestModule; +import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +/** + * @author dagewang + */ +@Slf4j +@Test +@Guice(modules = CustomizedApiTestModule.class) +public class CustomizedWxPayConfigTest { + + @Inject + private WxPayService wxPayService; + + public void testCustomizerHttpClient() { + try { + wxPayService.queryOrder("a", null); + } catch (WxPayException e) { + // ignore + e.printStackTrace(); + } + } + + public void testCustomizerV3HttpClient() { + try { + wxPayService.queryOrderV3("a", null); + } catch (WxPayException e) { + // ignore + e.printStackTrace(); + } + } +} diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/CustomizedApiTestModule.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/CustomizedApiTestModule.java new file mode 100644 index 000000000..a0cc399ea --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/CustomizedApiTestModule.java @@ -0,0 +1,61 @@ +package com.github.binarywang.wxpay.testbase; + +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.google.inject.Binder; +import com.google.inject.Module; +import com.thoughtworks.xstream.XStream; +import me.chanjar.weixin.common.error.WxRuntimeException; +import me.chanjar.weixin.common.util.xml.XStreamInitializer; +import org.apache.http.HttpRequestInterceptor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; + +/** + * The type Api test module. + */ +public class CustomizedApiTestModule implements Module { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + private static final String TEST_CONFIG_XML = "test-config.xml"; + + @Override + public void configure(Binder binder) { + try (InputStream inputStream = ClassLoader.getSystemResourceAsStream(TEST_CONFIG_XML)) { + if (inputStream == null) { + throw new WxRuntimeException("测试配置文件【" + TEST_CONFIG_XML + "】未找到,请参照test-config-sample.xml文件生成"); + } + + XmlWxPayConfig config = this.fromXml(XmlWxPayConfig.class, inputStream); + config.setIfSaveApiData(true); + + config.setApiV3HttpClientBuilderCustomizer((builder) -> { + builder.addInterceptorLast((HttpRequestInterceptor) (r, c) -> System.out.println("--------> V3 HttpRequestInterceptor ...")); + }); + + config.setHttpClientBuilderCustomizer((builder) -> { + builder.addInterceptorLast((HttpRequestInterceptor) (r, c) -> System.out.println("--------> HttpRequestInterceptor ...")); + }); + + WxPayService wxService = new WxPayServiceImpl(); + wxService.setConfig(config); + + binder.bind(WxPayService.class).toInstance(wxService); + binder.bind(WxPayConfig.class).toInstance(config); + } catch (IOException e) { + this.log.error(e.getMessage(), e); + } + } + + @SuppressWarnings("unchecked") + privateT fromXml(Class clazz, InputStream is) { + XStream xstream = XStreamInitializer.getInstance(); + xstream.alias("xml", clazz); + xstream.processAnnotations(clazz); + return (T) xstream.fromXML(is); + } + +}