一、在有效期內,動態的獲取釘釘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;
}
}
}