FlybookTokenUtil.java 3.18 KB
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;

/**
 *
 * <pre>
 * 描述:飞书accessToken工具类
 * 作者:欧阳高龙
 * 日期:2022-04-29 10:30
 * 版权:广州宏天软件有限公司
 * </pre>
 */
public class FlybookTokenUtil {
	protected static Logger log = LoggerFactory.getLogger(FlybookTokenUtil.class);
	/**
	 * H5微应用的token
	 */
	private static ConcurrentHashMap<String, TokenModel> modelList= new ConcurrentHashMap<>();

	/**
	 * 获取accessToken。
	 * <pre>
	 * 1.如果没有初始化则远程请求获取。
	 * 2.如果已经初始化并且未过期,直接获取。
	 * 1.如果已经过期则重新获取。
	 * </pre>
	 * @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失败:<br>"+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;
	}

}