登录钉钉开放平台,并创建钉钉应用用于授权
https://open-dev.dingtalk.com/fe/app#/corp/app
可设置多个,一般为了方便调试,除了测试环境主机IP、线上环境主机IP,还要加上用于开发的电脑的公网IP,直接百度“IP”可查看本机公网IP。
其他什么应用首页地址之类的随便填写即可
一般需要设置OA审批和通讯录管理中的一些权限,可根据实际开发目标开通权限,不知道如何抉择,可以都申请。
1、应用的appKey,appSecret
2、出差流程code、外出流程code
这两个code最好是主管理员,子管理员不知道能否获取。
<dependency>
<groupId>com.aliyungroupId>
<artifactId>alibaba-dingtalk-service-sdkartifactId>
<version>2.0.0version>
dependency>
package com.yuantu.marketing.util;
import com.alibaba.fastjson.JSON;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.taobao.api.ApiException;
import com.yuantu.marketing.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 钉钉工具类
*/
@Slf4j
@Component
public class DingDingUtil {
//应用的appKey
private final static String APPKEY ="XXXXXXXXXXXXXX";
//应用的appSecret
private final static String APPSECRET="XXXXXXXXXXXXXX";
//出差流程code
public final static String TRAVELWORK_PROCESS_CODE = "PROC-XXXXXXXXX";
//外出流程code
public final static String PUBLIC_PROCESS_CODE = "PROC-XXXXXXXXX";
/**
* 获取access_token
* @return token
*/
public static String getToken (){
Object object = LocalCacheClient.get("access_token");
if(object != null){
return object.toString();
}
DefaultDingTalkClient client = new
DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey(DingDingUtil.APPKEY);
request.setAppsecret(DingDingUtil.APPSECRET);
request.setHttpMethod("GET");
try {
OapiGettokenResponse response = client.execute(request);
LocalCacheClient.set("access_token", response.getAccessToken(),7200*1000);
if(!response.isSuccess()) {
log.error("调用钉钉接口失败:"+response.getMessage());
}
return response.getAccessToken();
} catch (ApiException e) {
log.error(DingDingUtil.SYSTEM_ERROR, e);
}
return null;
}
/**
* 获取审批实例ID列表
* @param processCode 进程code
* @param startTime 开始时间
* @param endTime 结束时间
* @param cursor 第几批
* @param size 每批多少个
* @return 钉钉返回结果
*/
public static OapiProcessinstanceListidsResponse.PageResult getProcessIds(String processCode, Long startTime, Long endTime, long cursor, long size) throws ApiException {
String url = "https://oapi.dingtalk.com/topapi/processinstance/listids";
DingTalkClient client = new DefaultDingTalkClient(url);
OapiProcessinstanceListidsRequest request = new OapiProcessinstanceListidsRequest();
request.setProcessCode(processCode);
request.setStartTime(startTime);
request.setEndTime(endTime);
request.setSize(size);
request.setCursor(cursor);
OapiProcessinstanceListidsResponse response = client.execute(request, DingDingUtil.getToken());
if(!response.isSuccess()) {
log.error("调用钉钉接口失败:"+response.getMessage());
}
return response.isSuccess()?response.getResult():null;
}
/**
* 获取规定时间内的所有审批id列表
*
* @param processCode 审批类型code(出差 or 外出)
* @return 审批实例列表
*/
public static List<String> getAllProcessIdList(String processCode, long startTime, long endTime) throws ApiException {
List<String> processIds = new ArrayList<>();
long cursor = 0L;
long size = 10L;
//获取审批单ID集合
OapiProcessinstanceListidsResponse.PageResult result = getProcessIds(processCode, startTime, endTime, cursor, size);
while (result != null && result.getNextCursor() != null) {
processIds.addAll(result.getList());
cursor = result.getNextCursor();
result = DingDingUtil.getProcessIds(processCode, startTime, endTime, cursor, size);
}
if (result != null && result.getList() != null && result.getList().size() > 0) {
processIds.addAll(result.getList());
}
return processIds;
}
/**
* 获取审批实例详情
* @param processInstanceId 审批实例ID
* @param index 用于重试机制的计数器
* @return 审批实例详情
*/
public static OapiProcessinstanceGetResponse.ProcessInstanceTopVo getProcessInfo(String processInstanceId) {
try {
//重试机制
String url = "https://oapi.dingtalk.com/topapi/processinstance/get";
DingTalkClient client = new DefaultDingTalkClient(url);
OapiProcessinstanceGetRequest request = new OapiProcessinstanceGetRequest();
request.setProcessInstanceId(processInstanceId);
OapiProcessinstanceGetResponse response = client.execute(request, DingDingUtil.getToken());
if(Objects.isNull(response) || !response.isSuccess()) {
log.error("调用钉钉接口失败:"+response.getMessage());
}
return response.isSuccess()?response.getProcessInstance():null;
} catch (ApiException e) {
log.error(DingDingUtil.SYSTEM_ERROR, e);
}
return null;
}
具体的调用方法以及解析方法,就不拿出来了,基本只要在服务器出口IP中,配置本地公网IP,防止出现不在白名单中的类似报错,就可以顺利调用。
–我是“三七有脾气”,一个在互联网"苟且偷生"的Java程序员
“如果感觉博客对你有用,麻烦给个点赞、评论、收藏,谢谢”