package com.artfess.integrate.util; import com.fasterxml.jackson.databind.JsonNode; import com.artfess.base.util.HttpUtil; import com.artfess.base.util.JsonUtil; import com.artfess.integrate.consts.DingTalkConsts; import com.artfess.integrate.model.TokenModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; /** *
 * 描述:阿里钉钉accessToken工具类
 * 构建组:x5-bpmx-platform
 * 作者:PangQuan
 * 邮箱:PangQuan@jee-soft.cn
 * 日期:2019-12-03 10:30
 * 版权:广州宏天软件有限公司
 * 
*/ public class DingTalkTokenUtil { protected static Logger log = LoggerFactory.getLogger(DingTalkTokenUtil.class); /** * H5微应用的token */ private static TokenModel model = new TokenModel(); /** * 获取钉钉accessToken。 *
     * 1.如果没有初始化则远程请求获取。
     * 2.如果已经初始化并且未过期,直接获取。
     * 1.如果已经过期则重新获取。
     * 
* * @return */ public static synchronized String getToken() throws IOException { //没有初始化直接获取。 if (!model.isInit()) { String token = requestToken(); return token; } else { //如果token要过期则重新获取。 if (model.isExpire(model.getLastUpdTime(), model.getExprieIn())) { String token = requestToken(); return token; } else { //从缓存中获取。 return model.getToken(); } } } /** * https请求钉钉api获取token。 * * @return */ private static String requestToken() throws IOException { String url = DingTalkConsts.getTokenUrl(); String rtn = HttpUtil.sendHttpsRequest(url, "", "GET"); JsonNode jsonObj = JsonUtil.toJsonNode(rtn); //取到了 if (jsonObj.get("errcode").asInt() == 0) { String token = jsonObj.get("access_token").asText(); int expireIn = jsonObj.get("expires_in").asInt(); model.setCorpToken(token, expireIn); return token; } //获取失败 else { model.setInit(false); String errMsg = jsonObj.get("errmsg").asText(); log.error(errMsg); throw new RuntimeException("获取accessToken失败:
" + errMsg); } } }