一、在有效期内,动态的获取钉钉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;
}
}
}