| @@ -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<File, String> { | |||
| @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<File, Strin | |||
| } | |||
| HttpGet httpGet = new HttpGet(uri); | |||
| if (httpProxy != null) { | |||
| RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||
| httpGet.setConfig(config); | |||
| } | |||
| CloseableHttpResponse response = httpclient.execute(httpGet); | |||
| Header[] contentTypeHeader = response.getHeaders("Content-Type"); | |||
| @@ -5,7 +5,9 @@ import java.io.IOException; | |||
| import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||
| import org.apache.http.HttpEntity; | |||
| 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.HttpPost; | |||
| import org.apache.http.entity.ContentType; | |||
| @@ -13,6 +15,7 @@ import org.apache.http.entity.mime.MultipartEntityBuilder; | |||
| import me.chanjar.weixin.common.bean.result.WxError; | |||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||
| import org.apache.http.impl.client.CloseableHttpClient; | |||
| /** | |||
| * 上传媒体文件请求执行器,请求的参数是File, 返回的结果是String | |||
| @@ -22,8 +25,12 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||
| public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, File> { | |||
| @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() | |||
| @@ -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<T, E> { | |||
| 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; | |||
| } | |||
| @@ -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<String, String> { | |||
| @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<String, String> | |||
| 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); | |||
| @@ -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<String, String> { | |||
| @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); | |||
| @@ -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(); | |||
| } | |||
| @@ -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 + '\'' + | |||
| '}'; | |||
| } | |||
| } | |||
| @@ -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<Integer> retryTimes = new ThreadLocal<Integer>(); | |||
| 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(); | |||
| } | |||
| } | |||
| } | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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(); | |||
| } | |||
| @@ -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 + '\'' + | |||
| '}'; | |||
| } | |||
| } | |||
| @@ -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<Integer> retryTimes = new ThreadLocal<Integer>(); | |||
| 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(); | |||
| } | |||
| } | |||
| } | |||
| @@ -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<File, WxMpQrCodeTicket> { | |||
| @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<File, WxMpQrCodeTi | |||
| } | |||
| HttpGet httpGet = new HttpGet(uri); | |||
| if (httpProxy != null) { | |||
| RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||
| httpGet.setConfig(config); | |||
| } | |||
| CloseableHttpResponse response = httpclient.execute(httpGet); | |||
| Header[] contentTypeHeader = response.getHeaders("Content-Type"); | |||