package com.github.ouyangbob.wechat.token;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.github.ouyangbob.http.HttpUtil;
import com.github.ouyangbob.wechat.WechatConstants;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.Maps;
/**
* wechat access_token
*
* @author ouyangbotao
*
*/
public class WechatAccessTokenUtil {
private static final String CACHE_KEY_ACCESS_TOKEN = "access_token";
private static final String CACHE_KEY_JSAPI_TICKET = "jsapi_ticket";
private static final Logger logger = LoggerFactory
.getLogger(WechatAccessTokenUtil.class);
private final static LoadingCache<String, String> cache = CacheBuilder
.newBuilder().expireAfterWrite(7000, TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
if (CACHE_KEY_ACCESS_TOKEN.equals(key)) {
return getAccessTokenFromWeixin();
} else if (CACHE_KEY_JSAPI_TICKET.equals(key)) {
return getJsapiTicketFromWeixin();
} else {
return null;
}
}
});
public static String getAccessToken() {
String accessToken;
try {
accessToken = cache.get(CACHE_KEY_ACCESS_TOKEN);
} catch (Exception e) {
logger.error("getAccessToken Exception:{}", e);
accessToken = getAccessTokenFromWeixin();
cache.put(CACHE_KEY_ACCESS_TOKEN, accessToken);
}
return accessToken;
}
public static String getJsapiTicket() {
String jsapiTicket;
try {
jsapiTicket = cache.get(CACHE_KEY_JSAPI_TICKET);
} catch (Exception e) {
logger.error("getJsapiTicket Exception:{}", e);
jsapiTicket = getJsapiTicketFromWeixin();
cache.put(CACHE_KEY_JSAPI_TICKET, jsapiTicket);
}
return jsapiTicket;
}
private static String getAccessTokenFromWeixin() {
Map<String, String> paramMap = Maps.newHashMap();
paramMap.put("appid", WechatConstants.APPID);
paramMap.put("secret", WechatConstants.APPSECRET);
paramMap.put("grant_type", "client_credential");
String body = HttpUtil.getRequest(WechatConstants.ACCESS_TOKEN,
paramMap);
logger.info("get access token:{}", body);
JSONObject json = JSONObject.parseObject(body);
String accessToken = json.getString("access_token");
// Integer expiresIn=json.getInteger("expires_in");
return accessToken;
}
private static String getJsapiTicketFromWeixin() {
Map<String, String> paramMap = Maps.newHashMap();
paramMap.put("access_token", getAccessToken());
paramMap.put("type", "jsapi");
String body = HttpUtil.getRequest(WechatConstants.JS_API_GET_TICKET,
paramMap);
logger.info("get jsapi ticket:{}", body);
JSONObject json = JSONObject.parseObject(body);
String jsapiTicket = json.getString("ticket");
int errcode = json.getIntValue("errcode");
if (errcode == 42001 || errcode == 40001) {
cache.invalidate(CACHE_KEY_ACCESS_TOKEN);
return getJsapiTicketFromWeixin();
}
return jsapiTicket;
}
}