Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand Up@@ -165,6 +166,11 @@ public class WxPayConfig {


private CloseableHttpClient apiV3HttpClient;
/**
* 支持扩展httpClientBuilder
*/
private HttpClientBuilderCustomizer httpClientBuilderCustomizer;
private HttpClientBuilderCustomizer apiV3HttpClientBuilderCustomizer;
/**
* 私钥信息
*/
Expand DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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);
}

}