diff --git a/service/src/main/java/com/hzya/frame/cbs8/util/CbsAccessToken.java b/service/src/main/java/com/hzya/frame/cbs8/util/CbsAccessToken.java new file mode 100644 index 00000000..080e58fc --- /dev/null +++ b/service/src/main/java/com/hzya/frame/cbs8/util/CbsAccessToken.java @@ -0,0 +1,140 @@ +package com.hzya.frame.cbs8.util; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.hzya.frame.web.action.ApplicationContextUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.relational.core.sql.In; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description cbs token + * @Author xiangerlin + * @Date 2024/6/7 15:56 + **/ +@Component +public class CbsAccessToken { + + private static final Logger logger = LoggerFactory.getLogger(CbsAccessToken.class); + @Value("${cbs8.appId}") + private String app_id; + @Value("${cbs8.appSecret}") + private String app_secret; + @Value("${cbs8.url}") + private String app_url; + + private static String appId; + private static String appSecret; + private static String url; + @PostConstruct + public void init() { + appId = app_id; + appSecret = app_secret; + url = app_url; + } + //刷新token用 + private static final String BEARER = "Bearer "; + /** + * 过期时间 + */ + private Long expiryTime ; + private String token; + + private CbsAccessToken(){ + + } + private static CbsAccessToken cbsAccessToken = new CbsAccessToken(); + + + public static CbsAccessToken getInstance() { + if (null == cbsAccessToken.token){ + initToken(); + }else { + //判断token有没有过期 + if (System.currentTimeMillis() >= cbsAccessToken.expiryTime){ + initToken(); + }else { + refreshToken(); + } + } + return cbsAccessToken; + } + + public static String getToken(){ + return getInstance().token; + } + /** + * 获取token + */ + private static void initToken(){ + CbsAccessToken ct = (CbsAccessToken) ApplicationContextUtil.getBeanByName("cbsAccessToken"); + logger.info("开始获取cbstoken"); + Map param = new HashMap<>(); + param.put("app_id",ct.appId); + param.put("app_secret",ct.appSecret); + param.put("grant_type","client_credentials"); + String res = HttpRequest.post(ct.url+"/openapi/app/v1/app/token").body(JSONObject.toJSONString(param)).execute().body(); + logger.info("获取cbstoken结果",res); + if (StrUtil.isNotEmpty(res) && JSONUtil.isTypeJSON(res)){ + JSONObject tokenObject = JSONObject.parseObject(res); + String code = tokenObject.getString("code");//0表示成功 + if ("0".equals(code)){ + JSONObject dataObj = tokenObject.getJSONObject("data"); + if (null != dataObj){ + String token = dataObj.getString("token"); + //过期时间 单位是秒 30分钟有效 + Integer expires = dataObj.getInteger("expires"); + cbsAccessToken.token = token; + //提前5分钟让token失效 所以这里设置成过期时间为当前时间+25分钟 + cbsAccessToken.expiryTime = System.currentTimeMillis()+1000*60*25L; + } + } + } + } + + /** + * 刷新token + */ + private static void refreshToken(){ + CbsAccessToken ct = (CbsAccessToken) ApplicationContextUtil.getBeanByName("cbsAccessToken"); + //token不为空,并且没过期 刷新token + if (null != cbsAccessToken.token && System.currentTimeMillis() < cbsAccessToken.expiryTime ){ + String res = HttpRequest.get(ct.url + "/openapi/app/v1/app/refresh-token").header("Authorization", BEARER + cbsAccessToken.token).execute().body(); + logger.info("刷新cbstoken结果",res); + if (StrUtil.isNotEmpty(res) && JSONUtil.isTypeJSON(res)){ + JSONObject tokenObject = JSONObject.parseObject(res); + String code = tokenObject.getString("code");//0表示成功 + if ("0".equals(code)){ + JSONObject dataObj = tokenObject.getJSONObject("data"); + if (null != dataObj){ + //续期的token + String token = dataObj.getString("token"); + //新token过期时间 单位是秒 30分钟有效 + Integer expires = dataObj.getInteger("expires"); + cbsAccessToken.token = token; + //提前5分钟让token失效 所以这里设置成过期时间为当前时间+25分钟 + cbsAccessToken.expiryTime = System.currentTimeMillis()+1000*60*25L; + } + }else { + initToken(); + } + } + }else { + initToken(); + } + } + + public static void main(String[] args) { + System.out.println("第1次取token:"+getToken()); + System.out.println("第2次取token:"+getToken()); + System.out.println("第3次取token:"+getToken()); + } +}