博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
打造钉钉事件分发平台之钉钉审批等事件处理
阅读量:4033 次
发布时间:2019-05-24

本文共 3053 字,大约阅读时间需要 10 分钟。

前言

上讲和上上讲我们说到了钉钉的审批和钉钉通讯录的一个简单示例,这次我们讲下如何快速打造一个自己的钉钉事件分发平台。让你能够通过监听用户在钉钉上的操作,然后进行对应的业务处理,比如钉钉流程审批完后业务处理、通讯录员工增加后对应自己系统的业务处理等等

为什么要做一套自己的钉钉事件分发平台?

之前我们讲过通过钉钉提供的通讯录接口进行同步自己OA系统和钉钉通讯录,这种同步的方式为:OA系统通讯录更改-》钉钉通讯录同步。这种方式只解决了单向同步,所以如果我们把钉钉通讯录的事件监听起来,这样钉钉通讯录更改-》OA系统通讯录同步就能实现双向同步的过程。
再说回上讲的钉钉审批,我们讲了如果通过接口进行钉钉的流程发起,但是审批的操作都是在钉钉上进行,所以也必须把钉钉上的审批动作事件进行监听,然后将结果返回给自己的系统进行业务处理。
钉钉官方明确注明了,一个企业只能注册一个接收回调的URL地址 ,所以我们必须将事件的回调进行统一管理,做一套属于自己的钉钉事件分发平台,注册对应的事件,然后只提供一个回调地址给钉钉,然后在自己的回调地址中进行转发。我简单画了一个图,如下:

钉钉的事件回调

回调是开发者在钉钉开放平台注册一个HTTP接口,并订阅相关的事件,当事件发生时,钉钉会主动调用开发者注册的HTTP接口,推送对应的事件信息。比如订阅审批事件回调后,当审批状态变更时,会向注册的HTTP接口推送事件信息。

针对所有的回调事件,在收到事件推送后,务必返回包含经过加密的字符串“success”的json数据,只有返回了对应的json数据,钉钉才会判断此事件推送成功。具体返回的数据格式为:

{"msg_signature":"111108bb8e6dbce3c9671d6fdb69d15066227608","timeStamp":"1783610513","nonce":"123456","encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl"}

先来注册钉钉事件回调

注册回调接口时,钉钉服务器会向URL发起【测试回调URL】事件,来验证填写url的合法性,url服务器需要在接收到回调之后返回字符串“success”的加密json数据,才能完成注册。流程如下图:

请求地址(POST):

https://oapi.dingtalk.com/call_back/register_call_back?access_token=ACCESS_TOKEN

请求包结构体 :

{"call_back_tag": ["user_add_org", "user_modify_org", "user_leave_org"],"token": "123456","aes_key": "xxxxxxxxlvdhntotr3x9qhlbytb18zyz5zxxxxxxxxx","url":"http://test001.vaiwan.com/eventreceive"}

测试事件回调URL

在注册事件回调接口的时候,钉钉服务器会向您“注册回调接口”时候设置的url(接收回调的url)发起POST请求,用来测试url的合法性。收到消息后,需要返回经过加密后的字符串“success”的json数据,否则钉钉服务器将认为url不合法。

msg_signature :消息体签名

timeStamp :时间戳
nonce :随机字符串
encrypt :字符串“success”加密值,加解密说明:https://ding-doc.dingtalk.com/doc#/faquestions/ltr370

这里我已经注册好了,直接用查询接口看看

再来看下审批的事件回调

我们自己写的测试回调接口:

/// ///     响应钉钉事件/// /// /// 
[HttpPost("DingEventReceive")]public async Task
DingEventReceive([FromBody] string value) {var dic = JsonConvert.DeserializeObject
>(value);var eventType = dic["EventType"]?.ToString();//事件类型 bpms_instance_change、bpms_task_changevar processInstanceId = dic["processInstanceId"]?.ToString();//审批实例idvar corpId = dic["corpId"]?.ToString();//审批实例对应的企业var createTime = dic["createTime"].ToString();//流程创建事件var title = dic["title"].ToString();//标题// type为start表示审批实例开始,审批正常结束(同意或拒绝)的type为finish,审批终止(发起人撤销审批单)的type为terminatevar type = dic["type"].ToString();var staffId = dic["staffId"].ToString();//发起流程实例的员工var url = dic["url"].ToString();//审批实例url,可在钉钉内跳转到审批页面var processCode = dic["processCode"].ToString();//审批模板的唯一码var result = dic["result"].ToString();//同意时result为agree,拒绝时result为refuse,只有审批任务结束、审批任务转交时才有var remark = dic["remark"].ToString();//remark表示操作时写的评论内容return Ok(1);}

再说回事件分发平台,这里我们只需要将需要接受回调的业务系统A的回调地址告诉分发平台,由分发平台接收到钉钉回调后根据需要分别通知即可,这里就不做代码展示了。

上讲的时候我们是的流程发起,其实填单是在自己的内部系统填写的然后通过接口像钉钉发起流程,实现这次的事件分发平台后,我们可以将一些简单的表单由钉钉上直接填写,然后通过事件回调,然后传给我们内部系统进行归档。

内部系统填写表单 (由于自己内部系统,可以支持各种复杂的表单填写,数据关联操作等):

钉钉系统填写表单 (适合简单的表单填写):

好了,到此结束,更多的大家可以多关注下钉钉官方文档:https://ding-doc.dingtalk.com/doc#/personnal/fdzxvg

如果大家有疑问或者更好的想法建议,评论区见~

转载地址:http://ifkdi.baihongyu.com/

你可能感兴趣的文章
busybox passwd修改密码
查看>>
wpa_supplicant控制脚本
查看>>
rfkill: WLAN hard blocked
查看>>
gstreamer相关工具集合
查看>>
arm 自动升级脚本
查看>>
RS232 四入四出模块控制代码
查看>>
gstreamer插件之 videotestsrc
查看>>
autoupdate script
查看>>
linux 驱动开发 头文件
查看>>
/etc/resolv.conf
查看>>
container_of()传入结构体中的成员,返回该结构体的首地址
查看>>
linux sfdisk partition
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
电平触发方式和边沿触发的区别
查看>>
网络视频服务器移植
查看>>
Encoding Schemes
查看>>
移植QT
查看>>
如此调用
查看>>
计算机的发展史
查看>>