|
|
|
@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON; |
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
|
import com.ynxbd.push.config.EhCacheConfig; |
|
|
|
|
import com.ynxbd.push.config.IniConfig; |
|
|
|
|
import com.ynxbd.push.entity.xbd.wx.RespAccessToken; |
|
|
|
|
import com.ynxbd.push.entity.xbd.wx.AccessToken; |
|
|
|
|
import com.ynxbd.push.helper.DateHelper; |
|
|
|
|
import com.ynxbd.push.helper.DesEncryptHelper; |
|
|
|
|
import com.ynxbd.push.helper.RequestHelper; |
|
|
|
@ -14,18 +14,17 @@ import org.ehcache.Cache; |
|
|
|
|
@Slf4j |
|
|
|
|
public class WxCacheRequest { |
|
|
|
|
private static final String SERVICE_URL = "http://127.0.0.1:8080/wx/api/getWxAccessToken.do"; |
|
|
|
|
private static final String LOCALHOST_URL = "http://wx.mzsrmyy.net/wx/api/getWxAccessToken.do"; |
|
|
|
|
private static final String LOCALHOST_URL = "http://wx.hhzyy.com/wx/api/getWxAccessToken.do"; |
|
|
|
|
|
|
|
|
|
private static final int MAX_RETRY = 3; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static { |
|
|
|
|
createAccessTokenCache(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 缓存
|
|
|
|
|
|
|
|
|
|
private static Cache<String, RespAccessToken> ACCESS_TOKEN_CACHE; |
|
|
|
|
private static Cache<String, AccessToken> ACCESS_TOKEN_CACHE; |
|
|
|
|
|
|
|
|
|
private static final String CACHE_NAME = "access_token"; |
|
|
|
|
private static final long CACHE_TIME = 7100; |
|
|
|
@ -33,39 +32,51 @@ public class WxCacheRequest { |
|
|
|
|
|
|
|
|
|
private synchronized static void createAccessTokenCache() { |
|
|
|
|
if (ACCESS_TOKEN_CACHE == null) { |
|
|
|
|
ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, RespAccessToken.class, "wx_access_token_cache", (CACHE_TIME)); // 一个半小时
|
|
|
|
|
ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, AccessToken.class, "wx_access_token_cache", (CACHE_TIME)); // 一个半小时
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static String getAccessToken() { |
|
|
|
|
RespAccessToken respAccessToken = getWxAccessToken(); |
|
|
|
|
if (respAccessToken == null) { |
|
|
|
|
AccessToken accessToken = getWxAccessToken(); |
|
|
|
|
if (accessToken == null) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
return respAccessToken.getAccessToken(); |
|
|
|
|
return accessToken.getAccessToken(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取微信token |
|
|
|
|
*/ |
|
|
|
|
private synchronized static RespAccessToken getWxAccessToken() { |
|
|
|
|
private synchronized static AccessToken getWxAccessToken() { |
|
|
|
|
if (ACCESS_TOKEN_CACHE == null) { |
|
|
|
|
createAccessTokenCache(); |
|
|
|
|
} |
|
|
|
|
log.info("启动医院为:{}", IniConfig.getInstance("name")); |
|
|
|
|
try { |
|
|
|
|
RespAccessToken respAccessToken = ACCESS_TOKEN_CACHE.get(CACHE_NAME); |
|
|
|
|
if (respAccessToken == null) { |
|
|
|
|
respAccessToken = againGetWxAccessToken(); |
|
|
|
|
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respAccessToken); |
|
|
|
|
return respAccessToken; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (7200 > DateHelper.differCurSecond(respAccessToken.getCreateTime())) { // 允许100s的旧token存在(5分钟内可以继续使用佬)
|
|
|
|
|
respAccessToken = againGetWxAccessToken(); |
|
|
|
|
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respAccessToken); |
|
|
|
|
return respAccessToken; |
|
|
|
|
} |
|
|
|
|
AccessToken token = new AccessToken(); |
|
|
|
|
AccessToken cacheToken = ACCESS_TOKEN_CACHE.get(CACHE_NAME); |
|
|
|
|
if (cacheToken != null) { |
|
|
|
|
if (7200 > DateHelper.differCurSecond(cacheToken.getCreateTime())) { // 允许100s的旧token存在(5分钟内可以继续使用佬)
|
|
|
|
|
AccessToken respToken = againGetWxAccessToken(); |
|
|
|
|
if (respToken != null) { |
|
|
|
|
token.setAccessToken(respToken.getAccessToken()); |
|
|
|
|
token.setCreateTime(respToken.getCreateTime()); |
|
|
|
|
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respToken); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
token.setAccessToken(cacheToken.getAccessToken()); |
|
|
|
|
token.setCreateTime(cacheToken.getCreateTime()); |
|
|
|
|
} |
|
|
|
|
return token; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AccessToken respToken = againGetWxAccessToken(); |
|
|
|
|
if (respToken != null) { |
|
|
|
|
token.setAccessToken(respToken.getAccessToken()); |
|
|
|
|
token.setCreateTime(respToken.getCreateTime()); |
|
|
|
|
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respToken); |
|
|
|
|
} |
|
|
|
|
return token; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("请求微信获取Token错误:{}", e.getMessage()); |
|
|
|
|
} |
|
|
|
@ -75,15 +86,15 @@ public class WxCacheRequest { |
|
|
|
|
/** |
|
|
|
|
* 根据次数循环获取 |
|
|
|
|
*/ |
|
|
|
|
private static RespAccessToken againGetWxAccessToken() { |
|
|
|
|
RespAccessToken respAccessToken = null; |
|
|
|
|
private static AccessToken againGetWxAccessToken() { |
|
|
|
|
AccessToken accessToken; |
|
|
|
|
for (int i = 0; i < MAX_RETRY; i++) { |
|
|
|
|
respAccessToken = requestWxAccessToken(); |
|
|
|
|
accessToken = requestWxAccessToken(); |
|
|
|
|
if (i != 0) { |
|
|
|
|
log.error("重试请求第{}次", (i + 1)); |
|
|
|
|
} |
|
|
|
|
if (respAccessToken != null) { |
|
|
|
|
return respAccessToken; |
|
|
|
|
if (accessToken != null) { |
|
|
|
|
return accessToken; |
|
|
|
|
} |
|
|
|
|
if ((i + 1) == MAX_RETRY) { |
|
|
|
|
log.error("{} 次请求后未获取到正确token", MAX_RETRY); |
|
|
|
@ -96,9 +107,10 @@ public class WxCacheRequest { |
|
|
|
|
/** |
|
|
|
|
* 请求微信token |
|
|
|
|
*/ |
|
|
|
|
private static RespAccessToken requestWxAccessToken() { |
|
|
|
|
private static AccessToken requestWxAccessToken() { |
|
|
|
|
try { |
|
|
|
|
JSONObject respJson = RequestHelper.getJsonObj(SERVICE_URL, null); |
|
|
|
|
JSONObject respJson = RequestHelper.getJsonObj(LOCALHOST_URL, null); |
|
|
|
|
log.info("[token请求]resp={}", respJson); |
|
|
|
|
String code = respJson.getString("code"); |
|
|
|
|
if (!"200".equals(code)) { |
|
|
|
|
log.info("请求token失败 code={}, message={}", code, respJson.getString("message")); |
|
|
|
@ -108,7 +120,8 @@ public class WxCacheRequest { |
|
|
|
|
if (data == null || "".equals(data)) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
RespAccessToken resp = JSON.parseObject(data, RespAccessToken.class); |
|
|
|
|
AccessToken resp = JSON.parseObject(data, AccessToken.class); |
|
|
|
|
System.out.println(resp); |
|
|
|
|
if (resp == null) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|