上讲和上上讲咱们说到了钉钉的审批和钉钉通信录的一个简单示例,此次咱们讲下如何快速打造一个本身的钉钉事件分发平台。让你可以经过监听用户在钉钉上的操做,而后进行对应的业务处理,好比钉钉流程审批完后业务处理、通信录员工增长后对应本身系统的业务处理等等json
为何要作一套本身的钉钉事件分发平台?
以前咱们讲过经过钉钉提供的通信录接口进行同步本身OA系统和钉钉通信录,这种同步的方式为:OA系统通信录更改-》钉钉通信录同步。这种方式只解决了单向同步,因此若是咱们把钉钉通信录的事件监听起来,这样钉钉通信录更改-》OA系统通信录同步就能实现双向同步的过程。
再说回上讲的钉钉审批,咱们讲了若是经过接口进行钉钉的流程发起,可是审批的操做都是在钉钉上进行,因此也必须把钉钉上的审批动做事件进行监听,而后将结果返回给本身的系统进行业务处理。
钉钉官方明确注明了,一个企业只能注册一个接收回调的URL地址 ,因此咱们必须将事件的回调进行统一管理,作一套属于本身的钉钉事件分发平台,注册对应的事件,而后只提供一个回调地址给钉钉,而后在本身的回调地址中进行转发。我简单画了一个图,以下:
c#
钉钉的事件回调
回调是开发者在钉钉开放平台注册一个HTTP接口,并订阅相关的事件,当事件发生时,钉钉会主动调用开发者注册的HTTP接口,推送对应的事件信息。好比订阅审批事件回调后,当审批状态变动时,会向注册的HTTP接口推送事件信息。api
针对全部的回调事件,在收到事件推送后,务必返回包含通过加密的字符串“success”的json数据,只有返回了对应的json数据,钉钉才会判断此事件推送成功。具体返回的数据格式为:服务器
{ "msg_signature":"111108bb8e6dbce3c9671d6fdb69d15066227608", "timeStamp":"1783610513", "nonce":"123456", "encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl" }
先来注册钉钉事件回调async
注册回调接口时,钉钉服务器会向URL发起【测试回调URL】事件,来验证填写url的合法性,url服务器须要在接收到回调以后返回字符串“success”的加密json数据,才能完成注册。流程以下图:
测试
请求地址(POST):加密
https://oapi.dingtalk.com/call_back/register_call_back?access_token=ACCESS_TOKEN
请求包结构体 :url
{ "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不合法。
spa
msg_signature :消息体签名
timeStamp :时间戳
nonce :随机字符串
encrypt :字符串“success”加密值,加解密说明:https://ding-doc.dingtalk.com/doc#/faquestions/ltr3703d
这里我已经注册好了,直接用查询接口看看
再来看下审批的事件回调
咱们本身写的测试回调接口:
/// <summary> /// 响应钉钉事件 /// </summary> /// <param name="value"></param> /// <returns></returns> [HttpPost("DingEventReceive")] public async Task<IActionResult> DingEventReceive([FromBody] string value) { var dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(value); var eventType = dic["EventType"]?.ToString();//事件类型 bpms_instance_change、bpms_task_change var processInstanceId = dic["processInstanceId"]?.ToString();//审批实例id var corpId = dic["corpId"]?.ToString();//审批实例对应的企业 var createTime = dic["createTime"].ToString();//流程建立事件 var title = dic["title"].ToString();//标题 // type为start表示审批实例开始,审批正常结束(赞成或拒绝)的type为finish,审批终止(发起人撤销审批单)的type为terminate var 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
若是你们有疑问或者更好的想法建议,评论区见~