package com.hotent.system.util; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; import com.hotent.base.util.StringUtil; import com.hotent.base.util.TenantUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.hotent.base.util.HttpUtil; import com.hotent.base.util.JsonUtil; import com.hotent.system.consts.DingTalkConsts; import com.hotent.system.model.TokenModel; /** * *
 * 描述:阿里钉钉accessToken工具类
 * 构建组:eip平台-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 ConcurrentHashMap modelList= new ConcurrentHashMap<>(); /** * 获取钉钉accessToken。 *
	 * 1.如果没有初始化则远程请求获取。
	 * 2.如果已经初始化并且未过期,直接获取。
	 * 1.如果已经过期则重新获取。
	 * 
* @return */ public static synchronized String getToken() throws IOException { //没有初始化直接获取。 TokenModel model = ExtUniUtil.getModel(modelList); 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(); TokenModel model = new TokenModel(); model.setCorpToken(token, expireIn); ExtUniUtil.putModel(model, modelList); return token; } //获取失败 else{ TokenModel model = new TokenModel(); model.setInit(false); ExtUniUtil.putModel(model, modelList); String errMsg=jsonObj.get("errmsg").asText(); log.error(errMsg); throw new RuntimeException("获取accessToken失败:
"+errMsg); } } /** * 清除缓存 * @return */ public static boolean clearToken() { String tenantId = TenantUtil.getCurrentTenantId(); if(StringUtil.isEmpty(tenantId)){ tenantId = "-1"; } try { modelList.put(tenantId, new TokenModel()); }catch(Exception ex) { ex.printStackTrace(); log.error(ex.getMessage()); return false; } return true; } }