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")
+  private  T fromXml(Class clazz, InputStream is) {
+    XStream xstream = XStreamInitializer.getInstance();
+    xstream.alias("xml", clazz);
+    xstream.processAnnotations(clazz);
+    return (T) xstream.fromXML(is);
+  }
+
+}