From 3067468f7157b77f13f8ac5c0d36031e202e375a Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Mon, 3 Nov 2014 15:56:31 +0800 Subject: [PATCH] =?UTF-8?q?issue=20#29=20http=E4=BB=A3=E7=90=86=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/MediaDownloadRequestExecutor.java | 10 +++- .../util/http/MediaUploadRequestExecutor.java | 9 +++- .../common/util/http/RequestExecutor.java | 5 +- .../util/http/SimpleGetRequestExecutor.java | 10 +++- .../util/http/SimplePostRequestExecutor.java | 18 ++++++- .../weixin/cp/api/WxCpConfigStorage.java | 8 +++ .../cp/api/WxCpInMemoryConfigStorage.java | 46 +++++++++++++++- .../weixin/cp/api/WxCpServiceImpl.java | 44 ++++++++++++++-- .../weixin/cp/api/WxCpMediaAPITest.java | 1 + .../weixin/cp/api/WxCpMessageAPITest.java | 1 + .../weixin/cp/api/WxCpMessageRouterTest.java | 1 + .../chanjar/weixin/cp/api/WxMenuAPITest.java | 1 + .../weixin/mp/api/WxMpConfigStorage.java | 8 +++ .../mp/api/WxMpInMemoryConfigStorage.java | 52 +++++++++++++++++++ .../weixin/mp/api/WxMpServiceImpl.java | 47 +++++++++++++++-- .../mp/util/http/QrCodeRequestExecutor.java | 10 +++- 16 files changed, 254 insertions(+), 17 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java index caa8e03b..7fc05d94 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java @@ -8,10 +8,13 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; +import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.ContentType; +import org.apache.http.impl.client.CloseableHttpClient; import java.io.File; import java.io.IOException; @@ -27,7 +30,7 @@ import java.util.regex.Pattern; public class MediaDownloadRequestExecutor implements RequestExecutor { @Override - public File execute(String uri, String queryParam) throws WxErrorException, ClientProtocolException, IOException { + public File execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String queryParam) throws WxErrorException, ClientProtocolException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -36,6 +39,11 @@ public class MediaDownloadRequestExecutor implements RequestExecutor { @Override - public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, ClientProtocolException, IOException { + public WxMediaUploadResult execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, File file) throws WxErrorException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost(uri); + if (httpProxy != null) { + RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); + httpPost.setConfig(config); + } if (file != null) { HttpEntity entity = MultipartEntityBuilder .create() diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java index e7959dca..84de1b6d 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.common.util.http; import java.io.IOException; +import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; @@ -17,8 +18,6 @@ import me.chanjar.weixin.common.exception.WxErrorException; */ public interface RequestExecutor { - public static final CloseableHttpClient httpclient = HttpClients.createDefault(); + public T execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, E data) throws WxErrorException, ClientProtocolException, IOException; - public T execute(String uri, E data) throws WxErrorException, ClientProtocolException, IOException; - } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java index 4d5ea024..5ad0f0b8 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java @@ -2,12 +2,15 @@ package me.chanjar.weixin.common.util.http; import java.io.IOException; +import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; +import org.apache.http.impl.client.CloseableHttpClient; /** * 简单的GET请求执行器,请求的参数是String, 返回的结果也是String @@ -17,7 +20,7 @@ import me.chanjar.weixin.common.exception.WxErrorException; public class SimpleGetRequestExecutor implements RequestExecutor { @Override - public String execute(String uri, String queryParam) throws WxErrorException, ClientProtocolException, IOException { + public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String queryParam) throws WxErrorException, ClientProtocolException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -25,6 +28,11 @@ public class SimpleGetRequestExecutor implements RequestExecutor uri += uri.endsWith("?") ? queryParam : '&' + queryParam; } HttpGet httpGet = new HttpGet(uri); + if (httpProxy != null) { + RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); + httpGet.setConfig(config); + } + CloseableHttpResponse response = httpclient.execute(httpGet); String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); WxError error = WxError.fromJson(responseContent); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java index 8025d6dc..d50fe251 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java @@ -5,10 +5,20 @@ import java.io.IOException; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import org.apache.http.Consts; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; /** * 简单的POST请求执行器,请求的参数是String, 返回的结果也是String @@ -18,12 +28,18 @@ import org.apache.http.entity.StringEntity; public class SimplePostRequestExecutor implements RequestExecutor { @Override - public String execute(String uri, String postEntity) throws WxErrorException, ClientProtocolException, IOException { + public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String postEntity) throws WxErrorException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost(uri); + if (httpProxy != null) { + RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); + httpPost.setConfig(config); + } + if (postEntity != null) { StringEntity entity = new StringEntity(postEntity, Consts.UTF_8); httpPost.setEntity(entity); } + CloseableHttpResponse response = httpclient.execute(httpPost); String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); WxError error = WxError.fromJson(responseContent); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java index d61b0035..7837a6f4 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java @@ -27,4 +27,12 @@ public interface WxCpConfigStorage { public int getExpiresIn(); + public String getHttp_proxy_host(); + + public int getHttp_proxy_port(); + + public String getHttp_proxy_username(); + + public String getHttp_proxy_password(); + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java index 26d15f4b..49e5f392 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java @@ -18,6 +18,11 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { protected String agentId; protected int expiresIn; + protected String http_proxy_host; + protected int http_proxy_port; + protected String http_proxy_username; + protected String http_proxy_password; + public void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } @@ -83,16 +88,53 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { this.agentId = agentId; } + public String getHttp_proxy_host() { + return http_proxy_host; + } + + public void setHttp_proxy_host(String http_proxy_host) { + this.http_proxy_host = http_proxy_host; + } + + public int getHttp_proxy_port() { + return http_proxy_port; + } + + public void setHttp_proxy_port(int http_proxy_port) { + this.http_proxy_port = http_proxy_port; + } + + public String getHttp_proxy_username() { + return http_proxy_username; + } + + public void setHttp_proxy_username(String http_proxy_username) { + this.http_proxy_username = http_proxy_username; + } + + public String getHttp_proxy_password() { + return http_proxy_password; + } + + public void setHttp_proxy_password(String http_proxy_password) { + this.http_proxy_password = http_proxy_password; + } + @Override public String toString() { - return "WxInMemoryCpConfigStorage{" + - "appidOrCorpid='" + corpId + '\'' + + return "WxCpInMemoryConfigStorage{" + + "corpId='" + corpId + '\'' + ", corpSecret='" + corpSecret + '\'' + ", token='" + token + '\'' + ", accessToken='" + accessToken + '\'' + ", aesKey='" + aesKey + '\'' + ", agentId='" + agentId + '\'' + ", expiresIn=" + expiresIn + + ", http_proxy_host='" + http_proxy_host + '\'' + + ", http_proxy_port=" + http_proxy_port + + ", http_proxy_username='" + http_proxy_username + '\'' + + ", http_proxy_password='" + http_proxy_password + '\'' + '}'; } + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java index 279ac6b2..89a66c52 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java @@ -20,9 +20,14 @@ import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.common.util.crypto.SHA1; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; @@ -51,12 +56,14 @@ public class WxCpServiceImpl implements WxCpService { */ protected static final AtomicBoolean GLOBAL_ACCESS_TOKEN_REFRESH_FLAG = new AtomicBoolean(false); - protected static final CloseableHttpClient httpclient = HttpClients.createDefault(); - protected WxCpConfigStorage wxCpConfigStorage; protected final ThreadLocal retryTimes = new ThreadLocal(); + protected CloseableHttpClient httpClient; + + protected HttpHost httpProxy; + public boolean checkSignature(String msgSignature, String timestamp, String nonce, String data) { try { return SHA1.gen(wxCpConfigStorage.getToken(), timestamp, nonce, data).equals(msgSignature); @@ -78,6 +85,7 @@ public class WxCpServiceImpl implements WxCpService { + "&corpsecret=" + wxCpConfigStorage.getCorpSecret(); try { HttpGet httpGet = new HttpGet(url); + CloseableHttpClient httpclient = getHttpclient(); CloseableHttpResponse response = httpclient.execute(httpGet); String resultContent = new BasicResponseHandler().handleResponse(response); WxError error = WxError.fromJson(resultContent); @@ -335,7 +343,7 @@ public class WxCpServiceImpl implements WxCpService { uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; try { - return executor.execute(uriWithAccessToken, data); + return executor.execute(getHttpclient(), httpProxy, uriWithAccessToken, data); } catch (WxErrorException e) { WxError error = e.getError(); /* @@ -379,8 +387,38 @@ public class WxCpServiceImpl implements WxCpService { } } + protected CloseableHttpClient getHttpclient() { + return httpClient; + } + public void setWxCpConfigStorage(WxCpConfigStorage wxConfigProvider) { this.wxCpConfigStorage = wxConfigProvider; + + String http_proxy_host = wxCpConfigStorage.getHttp_proxy_host(); + int http_proxy_port = wxCpConfigStorage.getHttp_proxy_port(); + String http_proxy_username = wxCpConfigStorage.getHttp_proxy_username(); + String http_proxy_password = wxCpConfigStorage.getHttp_proxy_password(); + + if(StringUtils.isNotBlank(http_proxy_host)) { + // 使用代理服务器 + if(StringUtils.isNotBlank(http_proxy_username)) { + // 需要用户认证的代理服务器 + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(http_proxy_host, http_proxy_port), + new UsernamePasswordCredentials(http_proxy_username, http_proxy_password)); + httpClient = HttpClients + .custom() + .setDefaultCredentialsProvider(credsProvider) + .build(); + } else { + // 无需用户认证的代理服务器 + httpClient = HttpClients.createDefault(); + } + httpProxy = new HttpHost(http_proxy_host, http_proxy_port); + } else { + httpClient = HttpClients.createDefault(); + } } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java index 7c47ee2f..f04b1fd4 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java @@ -5,6 +5,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import org.testng.Assert; import org.testng.annotations.DataProvider; diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java index 08966280..1672faaa 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.cp.api; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.cp.bean.WxCpMessage; import org.testng.annotations.Guice; import org.testng.annotations.Test; diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java index 7542a951..59962c6f 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.api; import java.util.Map; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; import org.testng.Assert; diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java index 7ed9caa8..c00d73e2 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.api; import javax.xml.bind.JAXBException; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.WxMenu; import org.testng.Assert; import org.testng.annotations.DataProvider; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java index e90013ff..e7ee779c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java @@ -25,4 +25,12 @@ public interface WxMpConfigStorage { public int getExpiresIn(); + public String getHttp_proxy_host(); + + public int getHttp_proxy_port(); + + public String getHttp_proxy_username(); + + public String getHttp_proxy_password(); + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java index 0218067b..d0f9c33d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java @@ -16,6 +16,11 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { protected String aesKey; protected int expiresIn; + protected String http_proxy_host; + protected int http_proxy_port; + protected String http_proxy_username; + protected String http_proxy_password; + public void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } @@ -73,5 +78,52 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { this.expiresIn = expiresIn; } + public String getHttp_proxy_host() { + return http_proxy_host; + } + + public void setHttp_proxy_host(String http_proxy_host) { + this.http_proxy_host = http_proxy_host; + } + + public int getHttp_proxy_port() { + return http_proxy_port; + } + + public void setHttp_proxy_port(int http_proxy_port) { + this.http_proxy_port = http_proxy_port; + } + + public String getHttp_proxy_username() { + return http_proxy_username; + } + + public void setHttp_proxy_username(String http_proxy_username) { + this.http_proxy_username = http_proxy_username; + } + + public String getHttp_proxy_password() { + return http_proxy_password; + } + + public void setHttp_proxy_password(String http_proxy_password) { + this.http_proxy_password = http_proxy_password; + } + + @Override + public String toString() { + return "WxMpInMemoryConfigStorage{" + + "appId='" + appId + '\'' + + ", secret='" + secret + '\'' + + ", token='" + token + '\'' + + ", accessToken='" + accessToken + '\'' + + ", aesKey='" + aesKey + '\'' + + ", expiresIn=" + expiresIn + + ", http_proxy_host='" + http_proxy_host + '\'' + + ", http_proxy_port=" + http_proxy_port + + ", http_proxy_username='" + http_proxy_username + '\'' + + ", http_proxy_password='" + http_proxy_password + '\'' + + '}'; + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java index 95a49889..1e43f62c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java @@ -19,9 +19,15 @@ import me.chanjar.weixin.mp.bean.result.*; import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; @@ -44,12 +50,14 @@ public class WxMpServiceImpl implements WxMpService { */ protected static final AtomicBoolean GLOBAL_ACCESS_TOKEN_REFRESH_FLAG = new AtomicBoolean(false); - protected static final CloseableHttpClient httpclient = HttpClients.createDefault(); - protected WxMpConfigStorage wxMpConfigStorage; protected final ThreadLocal retryTimes = new ThreadLocal(); + protected CloseableHttpClient httpClient; + + protected HttpHost httpProxy; + public boolean checkSignature(String timestamp, String nonce, String signature) { try { return SHA1.gen(wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature); @@ -67,6 +75,7 @@ public class WxMpServiceImpl implements WxMpService { ; try { HttpGet httpGet = new HttpGet(url); + CloseableHttpClient httpclient = getHttpclient(); CloseableHttpResponse response = httpclient.execute(httpGet); String resultContent = new BasicResponseHandler().handleResponse(response); WxError error = WxError.fromJson(resultContent); @@ -305,7 +314,7 @@ public class WxMpServiceImpl implements WxMpService { uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; try { - return executor.execute(uriWithAccessToken, data); + return executor.execute(getHttpclient(), httpProxy, uriWithAccessToken, data); } catch (WxErrorException e) { WxError error = e.getError(); /* @@ -348,9 +357,39 @@ public class WxMpServiceImpl implements WxMpService { throw new RuntimeException(e); } } - + + protected CloseableHttpClient getHttpclient() { + return httpClient; + } + public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) { this.wxMpConfigStorage = wxConfigProvider; + + String http_proxy_host = wxMpConfigStorage.getHttp_proxy_host(); + int http_proxy_port = wxMpConfigStorage.getHttp_proxy_port(); + String http_proxy_username = wxMpConfigStorage.getHttp_proxy_username(); + String http_proxy_password = wxMpConfigStorage.getHttp_proxy_password(); + + if(StringUtils.isNotBlank(http_proxy_host)) { + // 使用代理服务器 + if(StringUtils.isNotBlank(http_proxy_username)) { + // 需要用户认证的代理服务器 + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(http_proxy_host, http_proxy_port), + new UsernamePasswordCredentials(http_proxy_username, http_proxy_password)); + httpClient = HttpClients + .custom() + .setDefaultCredentialsProvider(credsProvider) + .build(); + } else { + // 无需用户认证的代理服务器 + httpClient = HttpClients.createDefault(); + } + httpProxy = new HttpHost(http_proxy_host, http_proxy_port); + } else { + httpClient = HttpClients.createDefault(); + } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java index 554c9b8f..593bdb05 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java @@ -8,10 +8,13 @@ import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; import me.chanjar.weixin.common.exception.WxErrorException; import org.apache.http.Header; +import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.ContentType; +import org.apache.http.impl.client.CloseableHttpClient; import java.io.File; import java.io.IOException; @@ -27,7 +30,7 @@ import java.util.UUID; public class QrCodeRequestExecutor implements RequestExecutor { @Override - public File execute(String uri, WxMpQrCodeTicket ticket) throws WxErrorException, ClientProtocolException, IOException { + public File execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, WxMpQrCodeTicket ticket) throws WxErrorException, ClientProtocolException, IOException { if (ticket != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -39,6 +42,11 @@ public class QrCodeRequestExecutor implements RequestExecutor