釘釘開發之動態獲取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;
        }
    }
}



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