@@ -8,10 +8,13 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; | |||||
import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; | import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.apache.http.Header; | import org.apache.http.Header; | ||||
import org.apache.http.HttpHost; | |||||
import org.apache.http.client.ClientProtocolException; | 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.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | import org.apache.http.client.methods.HttpGet; | ||||
import org.apache.http.entity.ContentType; | import org.apache.http.entity.ContentType; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
@@ -27,7 +30,7 @@ import java.util.regex.Pattern; | |||||
public class MediaDownloadRequestExecutor implements RequestExecutor<File, String> { | public class MediaDownloadRequestExecutor implements RequestExecutor<File, String> { | ||||
@Override | @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 (queryParam != null) { | ||||
if (uri.indexOf('?') == -1) { | if (uri.indexOf('?') == -1) { | ||||
uri += '?'; | uri += '?'; | ||||
@@ -36,6 +39,11 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin | |||||
} | } | ||||
HttpGet httpGet = new HttpGet(uri); | HttpGet httpGet = new HttpGet(uri); | ||||
if (httpProxy != null) { | |||||
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||||
httpGet.setConfig(config); | |||||
} | |||||
CloseableHttpResponse response = httpclient.execute(httpGet); | CloseableHttpResponse response = httpclient.execute(httpGet); | ||||
Header[] contentTypeHeader = response.getHeaders("Content-Type"); | Header[] contentTypeHeader = response.getHeaders("Content-Type"); | ||||
@@ -5,7 +5,9 @@ import java.io.IOException; | |||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
import org.apache.http.HttpEntity; | import org.apache.http.HttpEntity; | ||||
import org.apache.http.HttpHost; | |||||
import org.apache.http.client.ClientProtocolException; | 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.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpPost; | import org.apache.http.client.methods.HttpPost; | ||||
import org.apache.http.entity.ContentType; | 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.bean.result.WxError; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
/** | /** | ||||
* 上传媒体文件请求执行器,请求的参数是File, 返回的结果是String | * 上传媒体文件请求执行器,请求的参数是File, 返回的结果是String | ||||
@@ -22,8 +25,12 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||||
public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, File> { | public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, File> { | ||||
@Override | @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); | HttpPost httpPost = new HttpPost(uri); | ||||
if (httpProxy != null) { | |||||
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||||
httpPost.setConfig(config); | |||||
} | |||||
if (file != null) { | if (file != null) { | ||||
HttpEntity entity = MultipartEntityBuilder | HttpEntity entity = MultipartEntityBuilder | ||||
.create() | .create() | ||||
@@ -2,6 +2,7 @@ package me.chanjar.weixin.common.util.http; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import org.apache.http.HttpHost; | |||||
import org.apache.http.client.ClientProtocolException; | import org.apache.http.client.ClientProtocolException; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | import org.apache.http.impl.client.CloseableHttpClient; | ||||
import org.apache.http.impl.client.HttpClients; | import org.apache.http.impl.client.HttpClients; | ||||
@@ -17,8 +18,6 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||||
*/ | */ | ||||
public interface RequestExecutor<T, E> { | 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 java.io.IOException; | ||||
import org.apache.http.HttpHost; | |||||
import org.apache.http.client.ClientProtocolException; | 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.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | import org.apache.http.client.methods.HttpGet; | ||||
import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
/** | /** | ||||
* 简单的GET请求执行器,请求的参数是String, 返回的结果也是String | * 简单的GET请求执行器,请求的参数是String, 返回的结果也是String | ||||
@@ -17,7 +20,7 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||||
public class SimpleGetRequestExecutor implements RequestExecutor<String, String> { | public class SimpleGetRequestExecutor implements RequestExecutor<String, String> { | ||||
@Override | @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 (queryParam != null) { | ||||
if (uri.indexOf('?') == -1) { | if (uri.indexOf('?') == -1) { | ||||
uri += '?'; | uri += '?'; | ||||
@@ -25,6 +28,11 @@ public class SimpleGetRequestExecutor implements RequestExecutor<String, String> | |||||
uri += uri.endsWith("?") ? queryParam : '&' + queryParam; | uri += uri.endsWith("?") ? queryParam : '&' + queryParam; | ||||
} | } | ||||
HttpGet httpGet = new HttpGet(uri); | HttpGet httpGet = new HttpGet(uri); | ||||
if (httpProxy != null) { | |||||
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||||
httpGet.setConfig(config); | |||||
} | |||||
CloseableHttpResponse response = httpclient.execute(httpGet); | CloseableHttpResponse response = httpclient.execute(httpGet); | ||||
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | ||||
WxError error = WxError.fromJson(responseContent); | 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.bean.result.WxError; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import org.apache.http.Consts; | 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.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.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | |||||
import org.apache.http.client.methods.HttpPost; | import org.apache.http.client.methods.HttpPost; | ||||
import org.apache.http.entity.StringEntity; | 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 | * 简单的POST请求执行器,请求的参数是String, 返回的结果也是String | ||||
@@ -18,12 +28,18 @@ import org.apache.http.entity.StringEntity; | |||||
public class SimplePostRequestExecutor implements RequestExecutor<String, String> { | public class SimplePostRequestExecutor implements RequestExecutor<String, String> { | ||||
@Override | @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); | HttpPost httpPost = new HttpPost(uri); | ||||
if (httpProxy != null) { | |||||
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||||
httpPost.setConfig(config); | |||||
} | |||||
if (postEntity != null) { | if (postEntity != null) { | ||||
StringEntity entity = new StringEntity(postEntity, Consts.UTF_8); | StringEntity entity = new StringEntity(postEntity, Consts.UTF_8); | ||||
httpPost.setEntity(entity); | httpPost.setEntity(entity); | ||||
} | } | ||||
CloseableHttpResponse response = httpclient.execute(httpPost); | CloseableHttpResponse response = httpclient.execute(httpPost); | ||||
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | ||||
WxError error = WxError.fromJson(responseContent); | WxError error = WxError.fromJson(responseContent); | ||||
@@ -27,4 +27,12 @@ public interface WxCpConfigStorage { | |||||
public int getExpiresIn(); | 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 String agentId; | ||||
protected int expiresIn; | 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) { | public void updateAccessToken(WxAccessToken accessToken) { | ||||
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); | updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); | ||||
} | } | ||||
@@ -83,16 +88,53 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { | |||||
this.agentId = agentId; | 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 | @Override | ||||
public String toString() { | public String toString() { | ||||
return "WxInMemoryCpConfigStorage{" + | |||||
"appidOrCorpid='" + corpId + '\'' + | |||||
return "WxCpInMemoryConfigStorage{" + | |||||
"corpId='" + corpId + '\'' + | |||||
", corpSecret='" + corpSecret + '\'' + | ", corpSecret='" + corpSecret + '\'' + | ||||
", token='" + token + '\'' + | ", token='" + token + '\'' + | ||||
", accessToken='" + accessToken + '\'' + | ", accessToken='" + accessToken + '\'' + | ||||
", aesKey='" + aesKey + '\'' + | ", aesKey='" + aesKey + '\'' + | ||||
", agentId='" + agentId + '\'' + | ", agentId='" + agentId + '\'' + | ||||
", expiresIn=" + expiresIn + | ", 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.common.util.crypto.SHA1; | ||||
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | ||||
import org.apache.commons.lang3.StringUtils; | 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.ClientProtocolException; | ||||
import org.apache.http.client.CredentialsProvider; | |||||
import org.apache.http.client.methods.CloseableHttpResponse; | import org.apache.http.client.methods.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | 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.BasicResponseHandler; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | import org.apache.http.impl.client.CloseableHttpClient; | ||||
import org.apache.http.impl.client.HttpClients; | 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 AtomicBoolean GLOBAL_ACCESS_TOKEN_REFRESH_FLAG = new AtomicBoolean(false); | ||||
protected static final CloseableHttpClient httpclient = HttpClients.createDefault(); | |||||
protected WxCpConfigStorage wxCpConfigStorage; | protected WxCpConfigStorage wxCpConfigStorage; | ||||
protected final ThreadLocal<Integer> retryTimes = new ThreadLocal<Integer>(); | 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) { | public boolean checkSignature(String msgSignature, String timestamp, String nonce, String data) { | ||||
try { | try { | ||||
return SHA1.gen(wxCpConfigStorage.getToken(), timestamp, nonce, data).equals(msgSignature); | return SHA1.gen(wxCpConfigStorage.getToken(), timestamp, nonce, data).equals(msgSignature); | ||||
@@ -78,6 +85,7 @@ public class WxCpServiceImpl implements WxCpService { | |||||
+ "&corpsecret=" + wxCpConfigStorage.getCorpSecret(); | + "&corpsecret=" + wxCpConfigStorage.getCorpSecret(); | ||||
try { | try { | ||||
HttpGet httpGet = new HttpGet(url); | HttpGet httpGet = new HttpGet(url); | ||||
CloseableHttpClient httpclient = getHttpclient(); | |||||
CloseableHttpResponse response = httpclient.execute(httpGet); | CloseableHttpResponse response = httpclient.execute(httpGet); | ||||
String resultContent = new BasicResponseHandler().handleResponse(response); | String resultContent = new BasicResponseHandler().handleResponse(response); | ||||
WxError error = WxError.fromJson(resultContent); | WxError error = WxError.fromJson(resultContent); | ||||
@@ -335,7 +343,7 @@ public class WxCpServiceImpl implements WxCpService { | |||||
uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; | uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; | ||||
try { | try { | ||||
return executor.execute(uriWithAccessToken, data); | |||||
return executor.execute(getHttpclient(), httpProxy, uriWithAccessToken, data); | |||||
} catch (WxErrorException e) { | } catch (WxErrorException e) { | ||||
WxError error = e.getError(); | WxError error = e.getError(); | ||||
/* | /* | ||||
@@ -379,8 +387,38 @@ public class WxCpServiceImpl implements WxCpService { | |||||
} | } | ||||
} | } | ||||
protected CloseableHttpClient getHttpclient() { | |||||
return httpClient; | |||||
} | |||||
public void setWxCpConfigStorage(WxCpConfigStorage wxConfigProvider) { | public void setWxCpConfigStorage(WxCpConfigStorage wxConfigProvider) { | ||||
this.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.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import me.chanjar.weixin.common.api.WxConsts; | |||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
import org.testng.Assert; | import org.testng.Assert; | ||||
import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
@@ -1,5 +1,6 @@ | |||||
package me.chanjar.weixin.cp.api; | package me.chanjar.weixin.cp.api; | ||||
import me.chanjar.weixin.common.api.WxConsts; | |||||
import me.chanjar.weixin.cp.bean.WxCpMessage; | import me.chanjar.weixin.cp.bean.WxCpMessage; | ||||
import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
@@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.api; | |||||
import java.util.Map; | import java.util.Map; | ||||
import me.chanjar.weixin.common.api.WxConsts; | |||||
import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | ||||
import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; | import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; | ||||
import org.testng.Assert; | import org.testng.Assert; | ||||
@@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.api; | |||||
import javax.xml.bind.JAXBException; | import javax.xml.bind.JAXBException; | ||||
import me.chanjar.weixin.common.api.WxConsts; | |||||
import me.chanjar.weixin.common.bean.WxMenu; | import me.chanjar.weixin.common.bean.WxMenu; | ||||
import org.testng.Assert; | import org.testng.Assert; | ||||
import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
@@ -25,4 +25,12 @@ public interface WxMpConfigStorage { | |||||
public int getExpiresIn(); | 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 String aesKey; | ||||
protected int expiresIn; | 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) { | public void updateAccessToken(WxAccessToken accessToken) { | ||||
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); | updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); | ||||
} | } | ||||
@@ -73,5 +78,52 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { | |||||
this.expiresIn = expiresIn; | 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.http.QrCodeRequestExecutor; | ||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | ||||
import org.apache.commons.lang3.StringUtils; | 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.ClientProtocolException; | ||||
import org.apache.http.client.CredentialsProvider; | |||||
import org.apache.http.client.methods.CloseableHttpResponse; | import org.apache.http.client.methods.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | 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.BasicResponseHandler; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | import org.apache.http.impl.client.CloseableHttpClient; | ||||
import org.apache.http.impl.client.HttpClients; | 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 AtomicBoolean GLOBAL_ACCESS_TOKEN_REFRESH_FLAG = new AtomicBoolean(false); | ||||
protected static final CloseableHttpClient httpclient = HttpClients.createDefault(); | |||||
protected WxMpConfigStorage wxMpConfigStorage; | protected WxMpConfigStorage wxMpConfigStorage; | ||||
protected final ThreadLocal<Integer> retryTimes = new ThreadLocal<Integer>(); | protected final ThreadLocal<Integer> retryTimes = new ThreadLocal<Integer>(); | ||||
protected CloseableHttpClient httpClient; | |||||
protected HttpHost httpProxy; | |||||
public boolean checkSignature(String timestamp, String nonce, String signature) { | public boolean checkSignature(String timestamp, String nonce, String signature) { | ||||
try { | try { | ||||
return SHA1.gen(wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature); | return SHA1.gen(wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature); | ||||
@@ -67,6 +75,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
; | ; | ||||
try { | try { | ||||
HttpGet httpGet = new HttpGet(url); | HttpGet httpGet = new HttpGet(url); | ||||
CloseableHttpClient httpclient = getHttpclient(); | |||||
CloseableHttpResponse response = httpclient.execute(httpGet); | CloseableHttpResponse response = httpclient.execute(httpGet); | ||||
String resultContent = new BasicResponseHandler().handleResponse(response); | String resultContent = new BasicResponseHandler().handleResponse(response); | ||||
WxError error = WxError.fromJson(resultContent); | WxError error = WxError.fromJson(resultContent); | ||||
@@ -305,7 +314,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; | uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken; | ||||
try { | try { | ||||
return executor.execute(uriWithAccessToken, data); | |||||
return executor.execute(getHttpclient(), httpProxy, uriWithAccessToken, data); | |||||
} catch (WxErrorException e) { | } catch (WxErrorException e) { | ||||
WxError error = e.getError(); | WxError error = e.getError(); | ||||
/* | /* | ||||
@@ -348,9 +357,39 @@ public class WxMpServiceImpl implements WxMpService { | |||||
throw new RuntimeException(e); | throw new RuntimeException(e); | ||||
} | } | ||||
} | } | ||||
protected CloseableHttpClient getHttpclient() { | |||||
return httpClient; | |||||
} | |||||
public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) { | public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) { | ||||
this.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.mp.bean.result.WxMpQrCodeTicket; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import org.apache.http.Header; | import org.apache.http.Header; | ||||
import org.apache.http.HttpHost; | |||||
import org.apache.http.client.ClientProtocolException; | 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.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | import org.apache.http.client.methods.HttpGet; | ||||
import org.apache.http.entity.ContentType; | import org.apache.http.entity.ContentType; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
@@ -27,7 +30,7 @@ import java.util.UUID; | |||||
public class QrCodeRequestExecutor implements RequestExecutor<File, WxMpQrCodeTicket> { | public class QrCodeRequestExecutor implements RequestExecutor<File, WxMpQrCodeTicket> { | ||||
@Override | @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 (ticket != null) { | ||||
if (uri.indexOf('?') == -1) { | if (uri.indexOf('?') == -1) { | ||||
uri += '?'; | uri += '?'; | ||||
@@ -39,6 +42,11 @@ public class QrCodeRequestExecutor implements RequestExecutor<File, WxMpQrCodeTi | |||||
} | } | ||||
HttpGet httpGet = new HttpGet(uri); | HttpGet httpGet = new HttpGet(uri); | ||||
if (httpProxy != null) { | |||||
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||||
httpGet.setConfig(config); | |||||
} | |||||
CloseableHttpResponse response = httpclient.execute(httpGet); | CloseableHttpResponse response = httpclient.execute(httpGet); | ||||
Header[] contentTypeHeader = response.getHeaders("Content-Type"); | Header[] contentTypeHeader = response.getHeaders("Content-Type"); | ||||