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; } }