钉钉企业内部应用开发

2022/10/01 Ali DingDing

钉钉企业内部应用开发

钉钉(Ding Talk)是阿里巴巴集团打造的企业级智能移动办公平台,基础功能是免费的,现在好多中小企业在用。 但在使用过程中,避免不了需要一些定制化的功能,这个时候就需要做些开发,对于不是太复杂的功能,企业内部信息部门可以尝试自行实现,下面对钉钉内部应用创建的过程做个梳理记录。

钉钉开放平台

钉钉开放平台文档: https://open.dingtalk.com/document/orgapp/learning-map 服务端SDK下载: https://open.dingtalk.com/document/resourcedownload/download-server-sdk 钉钉官方提供了统一的SDK,使用SDK可以便捷地调用服务端API。

通过Maven安装DingTalk

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>alibaba-dingtalk-service-sdk</artifactId>
    <version>2.0.0</version>
</dependency>

实例代码

package com.demo.ding;

import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiUserGetRequest;
import com.dingtalk.api.response.OapiUserGetResponse;

public class DingTalkDemo {


    public static void main(String[] args) {
        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);
    }
}

基于Java的钉钉SDK开发

钉钉官方的SDK对钉钉API提供了简单的封装,但官方的SDK使用起来较为臃肿,并且最重要的是官方SDK仅仅是封装了API,对于accessToken的维护以及消息回调处理等等都没有封装,在项目中大规模使用比较麻烦,因此萌生了对钉钉官方SDK进行全面重构的想法

钉钉官方SDK存在的一些问题或不足 我们在使用官方SDK的过程中发现官方SDK存在一些比较蛋疼的问题:

  • accessToken需要自己来维护,SDK并不维护,那么在实际使用中就要做好accessToken的过期处理、多线程刷新时保证刷新是正确的
  • 出了自己维护accessToken外,基本上每次调用都需要将accessToken作为参数传入,没有自动化的将固定参数补齐
  • 消息回调的加解密并不包含在SDK中,需要自己整合进来
  • 对不同消息如何处理应该在SDK层面来解决掉,这样业务层面就只需要关心具体的处理逻辑即可,但SDK并不包含这些
  • 不支持HTTP代理,当代码部署在内网后没办法直接和钉钉API交互,需要借助代理来完成交互,但SDK并不支持代理且由于第6点的原因想优化SDK却不好下手优化
  • SDK封装方式比较蛋疼,底层又是用到了淘宝的SDK,不是很容易来修改
  • 当然还有其他的小问题,比如调用SDK方法时并不知道需要传哪些参数所以需要对照着开发文档才能发起调用等等。

我们是完全抛弃了钉钉官方SDK,从零搭建出了一套Java版本的钉钉SDK,并且已经开源出来了,希望大家能多多点点Star、Fork,跪谢。 开源钉钉SDKhttps://github.com/tingyugetc520/DtJava

通过Maven方式安装使用

<dependency>
    <groupId>com.github.tingyugetc520</groupId>
    <artifactId>dt-java</artifactId>
    <version>0.1.2</version>
</dependency>

示例代码

// 钉钉应用配置
DtDefaultConfigImpl config = new DtDefaultConfigImpl();
config.setCorpId("corpId");
config.setAgentId(agentId);
config.setAppKey("appKey");
config.setAppSecret("appSecret");

// DtService为SDK使用入口,后续接口使用均需要DtService
DtServiceImpl dtService = new DtServiceImpl();
dtService.setDtConfigStorage(config);

// 查询用户
DtUser user = dtService.getUserService().getById(userId);
log.info("dt user:{}", user);

// 发送工作消息通知
DtCorpConversationMessage message = DtCorpConversationMessage.builder()
			.agentId(config.getAgentId())
			.userIds(Lists.newArrayList("userId"))
			.msg(DtMessage.TEXT().content("this is content").build())
			.build();
dtService.getCorpConversationMsgService().send(message);

Search

    微信好友

    博士的沙漏

    Table of Contents