package com.hotent.system.util; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.hotent.base.util.JsonUtil; import com.hotent.base.util.StringUtil; import com.hotent.base.util.TenantUtil; import com.hotent.system.consts.FlyBookConsts; import com.hotent.system.model.TokenModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; /** * *
 * 描述:飞书accessToken工具类
 * 作者:欧阳高龙
 * 日期:2022-04-29 10:30
 * 版权:广州宏天软件有限公司
 * 
*/ public class FlybookTokenUtil { protected static Logger log = LoggerFactory.getLogger(FlybookTokenUtil.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()){ return requestToken(); } else{ //如果token要过期则重新获取。 if(model.isExpire(model.getLastUpdTime(),model.getExprieIn())){ return requestToken(); } else{ //从缓存中获取。 return model.getToken(); } } } /** * https请求api获取token。 * @return */ private static String requestToken() throws IOException { String url= FlyBookConsts.getTenantTokenUrl(); ObjectNode objectNode = JsonUtil.getMapper().createObjectNode(); objectNode.put("app_id", FlyBookConsts.getUnite().getCorpId()); objectNode.put("app_secret", FlyBookConsts.getUnite().getCorpSecret()); String rtn= FlybookHttpUtil.sendHttpsRequest(url, JsonUtil.toJson(objectNode), FlyBookConsts.METHOD_POST); JsonNode jsonObj = JsonUtil.toJsonNode(rtn); //取到了 if(jsonObj.get("code").asInt()==0){ String token=jsonObj.get("tenant_access_token").asText(); int expireIn=jsonObj.get("expire").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("msg").asText(); log.error(errMsg); throw new RuntimeException("获取accessToken失败:
"+errMsg); } } private static TokenModel getModel(){ String tenantId = TenantUtil.getCurrentTenantId(); if(StringUtil.isEmpty(tenantId)){ tenantId = "-1"; } return modelList.containsKey(tenantId)?modelList.get(tenantId):new TokenModel(); } /** * 清除缓存 * @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; } }