钉钉开发之动态获取access_token

一、在有效期内,动态的获取钉钉access_token

在钉钉开放平台下载最新的 sdk

将下好的sdk 导入项目中:

    <!--钉钉开发jar 包-->
        <dependency>
            <groupId>com.taobao.top</groupId>
            <artifactId>top-api-sdk-dev</artifactId>
            <version>dingtalk-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/lib/taobao-sdk-java-auto_1479188381469-20191126.jar</systemPath>
        </dependency>

编写在有效期内动态获取token的程序:

package cn.mesmile.springboot.learn.dingding;

import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.taobao.api.ApiException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zb
 * @date 2019/11/26 22:40
 * @Description:
 */
public class DingTalkToken {

    private static final Logger logger = LoggerFactory.getLogger(DingTalkToken.class);

    /**
     * 发动请求到钉钉获取 token 的url,get方式请求
     */
    private static final String GET_TOKEN_URL = "https://oapi.dingtalk.com/gettoken";

    /**
     * 钉钉成功返回的消息
     */
    private static final int SUCCESS_CODE = 0;

    /**
     *
     *  用于缓存获取的 access_token
     *  key 为 appkey
     *  注:appkey和appsecret在开发者后台创建应用的时候可见
     *  一个应用对应一个 appkey 和 appsecret
     */
    private static Map<String,TokenData> map = new HashMap<>();

    /**
     * 【注意】正常情况下access_token有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。
     * @param appkey
     * @param appsecret
     * @return
     */
    public String getToken(String appkey, String appsecret){
        // 当前时间 秒
        long currentTime = System.currentTimeMillis() / 1000;
        TokenData tokenData = map.get(appkey);
        if (tokenData == null) {
            return sendRequest(appkey,appsecret,currentTime);
            // 若缓存中的token过期,重新获取
        }else if (tokenData.expiresIn < currentTime) {
            return sendRequest(appkey,appsecret,currentTime);
        } else {
            return tokenData.accessToken;
        }
    }

    /**
     *  发送请求获得 token
     * @param appkey
     * @param appsecret
     * @param currentTime
     * @return
     */
    private String sendRequest(String appkey, String appsecret, long currentTime) {
        try {
            DefaultDingTalkClient client = new DefaultDingTalkClient(GET_TOKEN_URL);
            OapiGettokenRequest request = new OapiGettokenRequest();
            request.setAppkey(appkey);
            request.setAppsecret(appsecret);
            request.setHttpMethod("GET");
            OapiGettokenResponse response = client.execute(request);
            if (response.getErrcode().intValue() != SUCCESS_CODE) {
                logger.error("DingTalk error,errorCode:{}  , errmsg:{}",response.getErrcode(),response.getErrmsg());
            }
            String accessToken = response.getAccessToken();
            Long expiresIn = response.getExpiresIn();
            // 过期时间,提前一分钟失效
            TokenData tokenData = new TokenData(accessToken, currentTime + expiresIn - 60);
            // 存入缓存中
            map.put(appkey,tokenData);
            return accessToken;
        } catch (ApiException e) {
            e.printStackTrace();
            logger.error("DingTalk error,ApiException--->message: {}",e.getMessage());
        }
        return "";
    }

    // 内部类存取临时token
    class TokenData {
        // token
        private String accessToken;
        // 过期时间
        private Long expiresIn;
        TokenData(String accessToken,Long expiresIn){
            this.accessToken = accessToken;
            this.expiresIn = expiresIn;
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章