Java后端获取钉钉企业打卡信息


前言

企业需要同步钉钉考勤打卡的数据进行加工处理,该如何去获取考勤信息。


一、钉钉企业注册

企业注册后默认为标准版服务,标准版服务可满足日常打卡,考勤数据Excel导出功能。不可设置上下级组织。

标准版与其他版不同的内容为:

1、即时通讯:电话&短信DING消息、聊天记录云端搜索

2、视频会议:单场会议时长、同时开启摄像头人数、电话入会等

3、办公协同:OA审批专业版、考勤专业版(

​ a、支持考勤报表专家模式,支持定制化设计考勤报表字段,满足企业各类统计需求;

​ b、支持统计自定义(团队统计、员工统计);

​ c、支持【考勤封账】能力,帮助企业对考勤的数据进行冻结;

​ d、支持创建年度报表,跨多个月和年度考勤数据的汇总计算和导出,方便企业进行年度或是半年度的考勤汇总统计。)

4、直播:时长、清晰度、三方推流、智能章节、屏幕水印

5、业务应用打造:工作台模板、企业工作台自定义

6、组织文化打造:企业专享身份标识、高管保护模式

7、安全合规能力:企业数据审计、企业行为安全管控等

8、存储能力:存储空间

9、开放能力:付费API调用量、API请求并发量、连接流节点执行量、专享OpenAPI等
在这里插入图片描述

标准版应用开发与连接流资源

付费 API 调用量:5000 (次/自然月)

API 请求并发量:20(次/秒)

连接流节点执行量:500(次/自然月)

Webhook 和 Stream 用量:3000(次/自然月)
在这里插入图片描述

钉钉登录后我们可以看到对应的后台界面,可以设置对应功能信息。

在这里插入图片描述

我们点击开发者服务下的连接平台,可以进入到开发者平台

在这里插入图片描述

进入开发者平台后创建应用

在这里插入图片描述

二、接下来去查询服务端API找需要的接口

获取考勤信息接口参见:https://open.dingtalk.com/document/orgapp/api-overview

注:该接口调用需要使用到旧版的SDK,该获取打卡结果接口调用量说明中的**“钉钉标准版接口累计可调用次数为1万次/月”**有误,因为该接口文档更新于 2023-01-18日,但是在2024年12月标准版接口累计调用次数改为了5千次/月。

在这里插入图片描述

旧版SDK下载使用页面为:https://open.dingtalk.com/document/resourcedownload/download-server-sdk

在这里插入图片描述

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");
OapiUserGetRequest req = new OapiUserGetRequest();
req.setUserid("userid1");
req.setHttpMethod("GET");
OapiUserGetResponse rsp = client.execute(req, accessToken);

请求示例说明

  1. 定义Client对象,设置接口地址URI。一般情况,无需拼接URL后面的参数,比如access_token;需要注意部分Post接口,需要在URI后拼接除access_token外的个别参数。
  2. 构造Request对象,接口对应的request对象,一般规则是Oapi+接口Path驼峰形式+Request,如/user/get接口,请求对象是OapiUserGetRequest。
  3. 调用Request的方法设置参数,注意参数HttpMethod,默认是POST,如果是GET类型接口,需要这样设置request.setHttpMethod(“GET”)。
  4. 调用client.execute执行,其中access_token同样可以使用SDK获取到。同时,/gettoken,/sns/gettoken,/service/get_suite_token等获取token的接口在调用execute时,无需再传token参数。
  5. 执行后得到Response对象,是与Request对应的,然后可获取执行结果。

SDK下载后添加maven依赖

环境依赖

  • Java SDK 需要依赖 Java SE/EE 1.5及以上
<dependency>
 <groupId>com.aliyun</groupId>
 <artifactId>alibaba-dingtalk-service-sdk</artifactId>
 <version>2.0.0</version>
</dependency>

获取打卡结果

请求方式:POST

请求地址https://oapi.dingtalk.com/attendance/list

其它参数信息见:https://open.dingtalk.com/document/orgapp/api-overview

请求示例

注:需要带access_token。例:POST https://oapi.dingtalk.com/attendance/list?access_token=ACCESS_TOKEN

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/attendance/list");
OapiAttendanceListRequest req = new OapiAttendanceListRequest();
req.setWorkDateFrom("2020-11-07 08:00:00");
req.setWorkDateTo("2020-11-11 08:00:00");
req.setUserIdList(Arrays.asList("manager"));
req.setOffset(0L);
req.setLimit(10L);
req.setIsI18n(true);
OapiAttendanceListResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());

获取打卡详情

请求方式:POST

请求地址https://oapi.dingtalk.com/attendance/listRecord

其它参数信息见:https://open.dingtalk.com/document/orgapp/api-overview

请求示例

注:需要带access_token。例:POST https://oapi.dingtalk.com/attendance/listRecord?access_token=ACCESS_TOKEN

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/attendance/listRecord");
OapiAttendanceListRecordRequest req = new OapiAttendanceListRecordRequest();
req.setUserIds(Arrays.asList("user123","user456"));
req.setCheckDateFrom("2020-11-07 08:00:00");
req.setCheckDateTo("2020-11-12 08:00:00");
req.setIsI18n(false);
OapiAttendanceListRecordResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());

由于传参需要userId还需要获取人员信息,可以通过获取部门用户userid列表接口获取

在这里插入图片描述

请求方式:POST

请求地址https://oapi.dingtalk.com/topapi/user/listid

Query参数:access_token 调用该接口的应用凭证。

Body参数:dept_id部门deptId,可通过以下方式获取:

返回参数:

在这里插入图片描述

获取部门列表

在这里插入图片描述

请求方式:POST

请求地址https://oapi.dingtalk.com/topapi/v2/department/listsub

在这里插入图片描述

返回参数:

在这里插入图片描述

建议部门以及人员信息在初期人员确定后,直接保存在本地数据库中减少付费 API 调用量。

注:需要注意查询考勤打卡记录的起始工作日到考勤打卡记录的结束工作日,最多相隔7天。


每个接口的调用Query参数都需要企业内部应用的access_token

在这里插入图片描述

在获取access_token前,需要在开发者后台查看应用的AppKey和AppSecret

在这里插入图片描述

请求方式:GET

请求地址https://oapi.dingtalk.com/gettoken

在这里插入图片描述

在测试中获取到了access_token,但是在后续获取部门信息时有可能存在没有权限的问题

 	/**
     * 获取部门列表
     */
    @Override
    public void getDepartmentList() throws ApiException {
        //从缓存中获取access_token
        String access_token = (String)CacheUtils.get("access_token");
        //判断access_token是否为空
        if (StringUtils.isEmpty(access_token)){
            //为空先获取access_token
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
            OapiGettokenRequest request = new OapiGettokenRequest();
            request.setAppkey(appKey);
            request.setAppsecret(appSecret);
            request.setHttpMethod("GET");
            OapiGettokenResponse response = client.execute(request);
            String repBody = response.getBody();
            log.info("access_token获取成功返回信息为:"+repBody);
            JSONObject repObj= JSONObject.parseObject(repBody);
            access_token = repObj.getString("access_token");
            //将access_token放入缓存中
            CacheUtils.put("access_token",access_token);
        }
        //获取部门列表
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
        OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
        req.setDeptId(1L);
        req.setLanguage("zh_CN");
        OapiV2DepartmentListsubResponse rsp = client.execute(req, access_token);
        log.info("获取部门列表返回信息为:"+rsp.getBody());
    }

在这里插入图片描述

提示没有调用该接口的权限,接口权限申请参考:https://open.dingtalk.com/document/orgapp-server/add-api-permission

在钉钉开放平台应用开发-应用下的权限管理搜索关键字,进行申请。

在这里插入图片描述

我这边点击申请后,状态变为已开通

在这里插入图片描述

就可以查询到相关部门信息

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值