|
@@ -37,7 +37,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
|
protected final Logger log = LoggerFactory.getLogger(this.getClass()); |
|
|
protected final Logger log = LoggerFactory.getLogger(this.getClass()); |
|
|
protected WxSessionManager sessionManager = new StandardSessionManager(); |
|
|
protected WxSessionManager sessionManager = new StandardSessionManager(); |
|
|
private WxMpConfigStorage configStorage; |
|
|
|
|
|
|
|
|
private WxMpConfigStorage wxMpConfigStorage; |
|
|
private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this); |
|
|
private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this); |
|
|
private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); |
|
|
private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); |
|
|
private WxMpMenuService menuService = new WxMpMenuServiceImpl(this); |
|
|
private WxMpMenuService menuService = new WxMpMenuServiceImpl(this); |
|
@@ -59,7 +59,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
@Override |
|
|
@Override |
|
|
public boolean checkSignature(String timestamp, String nonce, String signature) { |
|
|
public boolean checkSignature(String timestamp, String nonce, String signature) { |
|
|
try { |
|
|
try { |
|
|
return SHA1.gen(this.configStorage.getToken(), timestamp, nonce) |
|
|
|
|
|
|
|
|
return SHA1.gen(this.wxMpConfigStorage.getToken(), timestamp, nonce) |
|
|
.equals(signature); |
|
|
.equals(signature); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
return false; |
|
|
return false; |
|
@@ -73,18 +73,18 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public String getAccessToken(boolean forceRefresh) throws WxErrorException { |
|
|
public String getAccessToken(boolean forceRefresh) throws WxErrorException { |
|
|
Lock lock = this.configStorage.getAccessTokenLock(); |
|
|
|
|
|
|
|
|
Lock lock = this.wxMpConfigStorage.getAccessTokenLock(); |
|
|
try { |
|
|
try { |
|
|
lock.lock(); |
|
|
lock.lock(); |
|
|
|
|
|
|
|
|
if (forceRefresh) { |
|
|
if (forceRefresh) { |
|
|
this.configStorage.expireAccessToken(); |
|
|
|
|
|
|
|
|
this.wxMpConfigStorage.expireAccessToken(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (this.configStorage.isAccessTokenExpired()) { |
|
|
|
|
|
|
|
|
if (this.wxMpConfigStorage.isAccessTokenExpired()) { |
|
|
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" + |
|
|
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" + |
|
|
"&appid=" + this.configStorage.getAppId() + "&secret=" |
|
|
|
|
|
+ this.configStorage.getSecret(); |
|
|
|
|
|
|
|
|
"&appid=" + this.wxMpConfigStorage.getAppId() + "&secret=" |
|
|
|
|
|
+ this.wxMpConfigStorage.getSecret(); |
|
|
try { |
|
|
try { |
|
|
HttpGet httpGet = new HttpGet(url); |
|
|
HttpGet httpGet = new HttpGet(url); |
|
|
if (this.httpProxy != null) { |
|
|
if (this.httpProxy != null) { |
|
@@ -98,7 +98,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
throw new WxErrorException(error); |
|
|
throw new WxErrorException(error); |
|
|
} |
|
|
} |
|
|
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent); |
|
|
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent); |
|
|
this.configStorage.updateAccessToken(accessToken.getAccessToken(), |
|
|
|
|
|
|
|
|
this.wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), |
|
|
accessToken.getExpiresIn()); |
|
|
accessToken.getExpiresIn()); |
|
|
} finally { |
|
|
} finally { |
|
|
httpGet.releaseConnection(); |
|
|
httpGet.releaseConnection(); |
|
@@ -110,7 +110,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
} finally { |
|
|
} finally { |
|
|
lock.unlock(); |
|
|
lock.unlock(); |
|
|
} |
|
|
} |
|
|
return this.configStorage.getAccessToken(); |
|
|
|
|
|
|
|
|
return this.wxMpConfigStorage.getAccessToken(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
@@ -120,27 +120,27 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { |
|
|
public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { |
|
|
Lock lock = this.configStorage.getJsapiTicketLock(); |
|
|
|
|
|
|
|
|
Lock lock = this.wxMpConfigStorage.getJsapiTicketLock(); |
|
|
try { |
|
|
try { |
|
|
lock.lock(); |
|
|
lock.lock(); |
|
|
|
|
|
|
|
|
if (forceRefresh) { |
|
|
if (forceRefresh) { |
|
|
this.configStorage.expireJsapiTicket(); |
|
|
|
|
|
|
|
|
this.wxMpConfigStorage.expireJsapiTicket(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (this.configStorage.isJsapiTicketExpired()) { |
|
|
|
|
|
|
|
|
if (this.wxMpConfigStorage.isJsapiTicketExpired()) { |
|
|
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi"; |
|
|
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi"; |
|
|
String responseContent = execute(new SimpleGetRequestExecutor(), url, null); |
|
|
String responseContent = execute(new SimpleGetRequestExecutor(), url, null); |
|
|
JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); |
|
|
JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); |
|
|
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); |
|
|
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); |
|
|
String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); |
|
|
String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); |
|
|
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); |
|
|
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); |
|
|
this.configStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds); |
|
|
|
|
|
|
|
|
this.wxMpConfigStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds); |
|
|
} |
|
|
} |
|
|
} finally { |
|
|
} finally { |
|
|
lock.unlock(); |
|
|
lock.unlock(); |
|
|
} |
|
|
} |
|
|
return this.configStorage.getJsapiTicket(); |
|
|
|
|
|
|
|
|
return this.wxMpConfigStorage.getJsapiTicket(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
@@ -151,7 +151,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
String signature = SHA1.genWithAmple("jsapi_ticket=" + jsapiTicket, |
|
|
String signature = SHA1.genWithAmple("jsapi_ticket=" + jsapiTicket, |
|
|
"noncestr=" + noncestr, "timestamp=" + timestamp, "url=" + url); |
|
|
"noncestr=" + noncestr, "timestamp=" + timestamp, "url=" + url); |
|
|
WxJsapiSignature jsapiSignature = new WxJsapiSignature(); |
|
|
WxJsapiSignature jsapiSignature = new WxJsapiSignature(); |
|
|
jsapiSignature.setAppid(this.configStorage.getAppId()); |
|
|
|
|
|
|
|
|
jsapiSignature.setAppid(this.wxMpConfigStorage.getAppId()); |
|
|
jsapiSignature.setTimestamp(timestamp); |
|
|
jsapiSignature.setTimestamp(timestamp); |
|
|
jsapiSignature.setNoncestr(noncestr); |
|
|
jsapiSignature.setNoncestr(noncestr); |
|
|
jsapiSignature.setUrl(url); |
|
|
jsapiSignature.setUrl(url); |
|
@@ -216,7 +216,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) { |
|
|
public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) { |
|
|
StringBuilder url = new StringBuilder(); |
|
|
StringBuilder url = new StringBuilder(); |
|
|
url.append("https://open.weixin.qq.com/connect/oauth2/authorize?"); |
|
|
url.append("https://open.weixin.qq.com/connect/oauth2/authorize?"); |
|
|
url.append("appid=").append(this.configStorage.getAppId()); |
|
|
|
|
|
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI)); |
|
|
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI)); |
|
|
url.append("&response_type=code"); |
|
|
url.append("&response_type=code"); |
|
|
url.append("&scope=").append(scope); |
|
|
url.append("&scope=").append(scope); |
|
@@ -232,7 +232,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
String state) { |
|
|
String state) { |
|
|
StringBuilder url = new StringBuilder(); |
|
|
StringBuilder url = new StringBuilder(); |
|
|
url.append("https://open.weixin.qq.com/connect/qrconnect?"); |
|
|
url.append("https://open.weixin.qq.com/connect/qrconnect?"); |
|
|
url.append("appid=").append(this.configStorage.getAppId()); |
|
|
|
|
|
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI)); |
|
|
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI)); |
|
|
url.append("&response_type=code"); |
|
|
url.append("&response_type=code"); |
|
|
url.append("&scope=").append(scope); |
|
|
url.append("&scope=").append(scope); |
|
@@ -258,8 +258,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { |
|
|
public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { |
|
|
StringBuilder url = new StringBuilder(); |
|
|
StringBuilder url = new StringBuilder(); |
|
|
url.append("https://api.weixin.qq.com/sns/oauth2/access_token?"); |
|
|
url.append("https://api.weixin.qq.com/sns/oauth2/access_token?"); |
|
|
url.append("appid=").append(this.configStorage.getAppId()); |
|
|
|
|
|
url.append("&secret=").append(this.configStorage.getSecret()); |
|
|
|
|
|
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
|
|
|
url.append("&secret=").append(this.wxMpConfigStorage.getSecret()); |
|
|
url.append("&code=").append(code); |
|
|
url.append("&code=").append(code); |
|
|
url.append("&grant_type=authorization_code"); |
|
|
url.append("&grant_type=authorization_code"); |
|
|
|
|
|
|
|
@@ -270,7 +270,7 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { |
|
|
public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { |
|
|
StringBuilder url = new StringBuilder(); |
|
|
StringBuilder url = new StringBuilder(); |
|
|
url.append("https://api.weixin.qq.com/sns/oauth2/refresh_token?"); |
|
|
url.append("https://api.weixin.qq.com/sns/oauth2/refresh_token?"); |
|
|
url.append("appid=").append(this.configStorage.getAppId()); |
|
|
|
|
|
|
|
|
url.append("appid=").append(this.wxMpConfigStorage.getAppId()); |
|
|
url.append("&grant_type=refresh_token"); |
|
|
url.append("&grant_type=refresh_token"); |
|
|
url.append("&refresh_token=").append(refreshToken); |
|
|
url.append("&refresh_token=").append(refreshToken); |
|
|
|
|
|
|
|
@@ -397,8 +397,8 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
*/ |
|
|
*/ |
|
|
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) { |
|
|
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) { |
|
|
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token |
|
|
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token |
|
|
this.configStorage.expireAccessToken(); |
|
|
|
|
|
if (this.configStorage.autoRefreshToken()) { |
|
|
|
|
|
|
|
|
this.wxMpConfigStorage.expireAccessToken(); |
|
|
|
|
|
if (this.wxMpConfigStorage.autoRefreshToken()) { |
|
|
return this.execute(executor, uri, data); |
|
|
return this.execute(executor, uri, data); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@@ -424,26 +424,26 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void initHttpClient() { |
|
|
private void initHttpClient() { |
|
|
ApacheHttpClientBuilder apacheHttpClientBuilder = this.configStorage |
|
|
|
|
|
|
|
|
ApacheHttpClientBuilder apacheHttpClientBuilder = this.wxMpConfigStorage |
|
|
.getApacheHttpClientBuilder(); |
|
|
.getApacheHttpClientBuilder(); |
|
|
if (null == apacheHttpClientBuilder) { |
|
|
if (null == apacheHttpClientBuilder) { |
|
|
apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get(); |
|
|
apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
apacheHttpClientBuilder.httpProxyHost(this.configStorage.getHttpProxyHost()) |
|
|
|
|
|
.httpProxyPort(this.configStorage.getHttpProxyPort()) |
|
|
|
|
|
.httpProxyUsername(this.configStorage.getHttpProxyUsername()) |
|
|
|
|
|
.httpProxyPassword(this.configStorage.getHttpProxyPassword()); |
|
|
|
|
|
|
|
|
apacheHttpClientBuilder.httpProxyHost(this.wxMpConfigStorage.getHttpProxyHost()) |
|
|
|
|
|
.httpProxyPort(this.wxMpConfigStorage.getHttpProxyPort()) |
|
|
|
|
|
.httpProxyUsername(this.wxMpConfigStorage.getHttpProxyUsername()) |
|
|
|
|
|
.httpProxyPassword(this.wxMpConfigStorage.getHttpProxyPassword()); |
|
|
|
|
|
|
|
|
// if (this.configStorage.getSSLContext() != null) { |
|
|
|
|
|
|
|
|
// if (this.wxMpConfigStorage.getSSLContext() != null) { |
|
|
// SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( |
|
|
// SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( |
|
|
// this.configStorage.getSSLContext(), new String[] { "TLSv1" }, null, |
|
|
|
|
|
|
|
|
// this.wxMpConfigStorage.getSSLContext(), new String[] { "TLSv1" }, null, |
|
|
// new DefaultHostnameVerifier()); |
|
|
// new DefaultHostnameVerifier()); |
|
|
// apacheHttpClientBuilder.sslConnectionSocketFactory(sslsf); |
|
|
// apacheHttpClientBuilder.sslConnectionSocketFactory(sslsf); |
|
|
// } |
|
|
// } |
|
|
|
|
|
|
|
|
if (this.configStorage.getHttpProxyHost() != null && this.configStorage.getHttpProxyPort() > 0) { |
|
|
|
|
|
this.httpProxy = new HttpHost(this.configStorage.getHttpProxyHost(), this.configStorage.getHttpProxyPort()); |
|
|
|
|
|
|
|
|
if (this.wxMpConfigStorage.getHttpProxyHost() != null && this.wxMpConfigStorage.getHttpProxyPort() > 0) { |
|
|
|
|
|
this.httpProxy = new HttpHost(this.wxMpConfigStorage.getHttpProxyHost(), this.wxMpConfigStorage.getHttpProxyPort()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
this.httpClient = apacheHttpClientBuilder.build(); |
|
|
this.httpClient = apacheHttpClientBuilder.build(); |
|
@@ -451,12 +451,12 @@ public class WxMpServiceImpl implements WxMpService { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public WxMpConfigStorage getWxMpConfigStorage() { |
|
|
public WxMpConfigStorage getWxMpConfigStorage() { |
|
|
return this.configStorage; |
|
|
|
|
|
|
|
|
return this.wxMpConfigStorage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) { |
|
|
public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) { |
|
|
this.configStorage = wxConfigProvider; |
|
|
|
|
|
|
|
|
this.wxMpConfigStorage = wxConfigProvider; |
|
|
this.initHttpClient(); |
|
|
this.initHttpClient(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|