Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

提供扩展httpclientbuilder的能力 #3128

Merged
merged 9 commits into from
Sep 11, 2023
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.github.binarywang.wxpay.config;

import org.apache.http.impl.client.HttpClientBuilder;

/**
* @author <a href="https://github.com/ifcute">dagewang</a>
*/
@FunctionalInterface
public interface HttpClientBuilderCustomizer {
void customize(HttpClientBuilder var1);
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.Optional;

/**
* 微信支付配置
Expand Down Expand Up @@ -165,6 +166,11 @@ public class WxPayConfig {


private CloseableHttpClient apiV3HttpClient;
/**
* 支持扩展httpClientBuilder
*/
private HttpClientBuilderCustomizer httpClientBuilderCustomizer;
private HttpClientBuilderCustomizer apiV3HttpClientBuilderCustomizer;
/**
* 私钥信息
*/
Expand Down Expand Up @@ -283,6 +289,10 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
//初始化V3接口正向代理设置
HttpProxyUtils.initHttpProxy(wxPayV3HttpClientBuilder, wxPayHttpProxy);

// 提供自定义wxPayV3HttpClientBuilder的能力
Optional.ofNullable(apiV3HttpClientBuilderCustomizer).ifPresent(e -> {
e.customize(wxPayV3HttpClientBuilder);
});
CloseableHttpClient httpClient = wxPayV3HttpClientBuilder.build();

this.apiV3HttpClient = httpClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Objects;
import java.util.Optional;

/**
* <pre>
Expand Down Expand Up @@ -335,6 +336,12 @@ private HttpClientBuilder createHttpClientBuilder(boolean useKey) throws WxPayEx
httpClientBuilder.setDefaultCredentialsProvider(provider)
.setProxy(new HttpHost(this.getConfig().getHttpProxyHost(), this.getConfig().getHttpProxyPort()));
}

// 提供自定义httpClientBuilder的能力
Optional.ofNullable(getConfig().getHttpClientBuilderCustomizer()).ifPresent(e -> {
e.customize(httpClientBuilder);
});

return httpClientBuilder;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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 <a href="https://github.com/ifcute">dagewang</a>
*/
@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();
}
}
}
Original file line number Diff line number Diff line change
@@ -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> T fromXml(Class<T> clazz, InputStream is) {
XStream xstream = XStreamInitializer.getInstance();
xstream.alias("xml", clazz);
xstream.processAnnotations(clazz);
return (T) xstream.fromXML(is);
}

}