打造钉钉事件分发平台之钉钉审批等事件处理
前言
上講和上上講我們說到了釘釘?shù)膶徟歪斸斖ㄓ嶄浀囊粋€簡單示例,這次我們講下如何快速打造一個自己的釘釘事件分發(fā)平臺。讓你能夠通過監(jiān)聽用戶在釘釘上的操作,然后進行對應(yīng)的業(yè)務(wù)處理,比如釘釘流程審批完后業(yè)務(wù)處理、通訊錄員工增加后對應(yīng)自己系統(tǒng)的業(yè)務(wù)處理等等
為什么要做一套自己的釘釘事件分發(fā)平臺?
之前我們講過通過釘釘提供的通訊錄接口進行同步自己OA系統(tǒng)和釘釘通訊錄,這種同步的方式為:OA系統(tǒng)通訊錄更改-》釘釘通訊錄同步。這種方式只解決了單向同步,所以如果我們把釘釘通訊錄的事件監(jiān)聽起來,這樣釘釘通訊錄更改-》OA系統(tǒng)通訊錄同步就能實現(xiàn)雙向同步的過程。
再說回上講的釘釘審批,我們講了如果通過接口進行釘釘?shù)牧鞒贪l(fā)起,但是審批的操作都是在釘釘上進行,所以也必須把釘釘上的審批動作事件進行監(jiān)聽,然后將結(jié)果返回給自己的系統(tǒng)進行業(yè)務(wù)處理。
釘釘官方明確注明了,一個企業(yè)只能注冊一個接收回調(diào)的URL地址?,所以我們必須將事件的回調(diào)進行統(tǒng)一管理,做一套屬于自己的釘釘事件分發(fā)平臺,注冊對應(yīng)的事件,然后只提供一個回調(diào)地址給釘釘,然后在自己的回調(diào)地址中進行轉(zhuǎn)發(fā)。我簡單畫了一個圖,如下:
釘釘?shù)氖录卣{(diào)
回調(diào)是開發(fā)者在釘釘開放平臺注冊一個HTTP接口,并訂閱相關(guān)的事件,當事件發(fā)生時,釘釘會主動調(diào)用開發(fā)者注冊的HTTP接口,推送對應(yīng)的事件信息。比如訂閱審批事件回調(diào)后,當審批狀態(tài)變更時,會向注冊的HTTP接口推送事件信息。
針對所有的回調(diào)事件,在收到事件推送后,務(wù)必返回包含經(jīng)過加密的字符串“success”的json數(shù)據(jù),只有返回了對應(yīng)的json數(shù)據(jù),釘釘才會判斷此事件推送成功。具體返回的數(shù)據(jù)格式為:
{"msg_signature":"111108bb8e6dbce3c9671d6fdb69d15066227608","timeStamp":"1783610513","nonce":"123456","encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl"}先來注冊釘釘事件回調(diào)
注冊回調(diào)接口時,釘釘服務(wù)器會向URL發(fā)起【測試回調(diào)URL】事件,來驗證填寫url的合法性,url服務(wù)器需要在接收到回調(diào)之后返回字符串“success”的加密json數(shù)據(jù),才能完成注冊。流程如下圖:
請求地址(POST):
https://oapi.dingtalk.com/call_back/register_call_back?access_token=ACCESS_TOKEN請求包結(jié)構(gòu)體?:
{"call_back_tag": ["user_add_org", "user_modify_org", "user_leave_org"],"token": "123456","aes_key": "xxxxxxxxlvdhntotr3x9qhlbytb18zyz5zxxxxxxxxx","url":"http://test001.vaiwan.com/eventreceive"}測試事件回調(diào)URL
在注冊事件回調(diào)接口的時候,釘釘服務(wù)器會向您“注冊回調(diào)接口”時候設(shè)置的url(接收回調(diào)的url)發(fā)起POST請求,用來測試url的合法性。收到消息后,需要返回經(jīng)過加密后的字符串“success”的json數(shù)據(jù),否則釘釘服務(wù)器將認為url不合法。
msg_signature?:消息體簽名
timeStamp?:時間戳
nonce?:隨機字符串
encrypt?:字符串“success”加密值,加解密說明:https://ding-doc.dingtalk.com/doc#/faquestions/ltr370
這里我已經(jīng)注冊好了,直接用查詢接口看看
再來看下審批的事件回調(diào)
我們自己寫的測試回調(diào)接口:
/// <summary>/// 響應(yīng)釘釘事件/// </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_changevar processInstanceId = dic["processInstanceId"]?.ToString();//審批實例idvar corpId = dic["corpId"]?.ToString();//審批實例對應(yīng)的企業(yè)var createTime = dic["createTime"].ToString();//流程創(chuàng)建事件var title = dic["title"].ToString();//標題// type為start表示審批實例開始,審批正常結(jié)束(同意或拒絕)的type為finish,審批終止(發(fā)起人撤銷審批單)的type為terminatevar type = dic["type"].ToString();var staffId = dic["staffId"].ToString();//發(fā)起流程實例的員工var url = dic["url"].ToString();//審批實例url,可在釘釘內(nèi)跳轉(zhuǎn)到審批頁面var processCode = dic["processCode"].ToString();//審批模板的唯一碼var result = dic["result"].ToString();//同意時result為agree,拒絕時result為refuse,只有審批任務(wù)結(jié)束、審批任務(wù)轉(zhuǎn)交時才有var remark = dic["remark"].ToString();//remark表示操作時寫的評論內(nèi)容return Ok(1);}再說回事件分發(fā)平臺,這里我們只需要將需要接受回調(diào)的業(yè)務(wù)系統(tǒng)A的回調(diào)地址告訴分發(fā)平臺,由分發(fā)平臺接收到釘釘回調(diào)后根據(jù)需要分別通知即可,這里就不做代碼展示了。
上講的時候我們是的流程發(fā)起,其實填單是在自己的內(nèi)部系統(tǒng)填寫的然后通過接口像釘釘發(fā)起流程,實現(xiàn)這次的事件分發(fā)平臺后,我們可以將一些簡單的表單由釘釘上直接填寫,然后通過事件回調(diào),然后傳給我們內(nèi)部系統(tǒng)進行歸檔。
內(nèi)部系統(tǒng)填寫表單?(由于自己內(nèi)部系統(tǒng),可以支持各種復(fù)雜的表單填寫,數(shù)據(jù)關(guān)聯(lián)操作等):
釘釘系統(tǒng)填寫表單?(適合簡單的表單填寫):
好了,到此結(jié)束,更多的大家可以多關(guān)注下釘釘官方文檔:https://ding-doc.dingtalk.com/doc#/personnal/fdzxvg
如果大家有疑問或者更好的想法建議,評論區(qū)見~
總結(jié)
以上是生活随笔為你收集整理的打造钉钉事件分发平台之钉钉审批等事件处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟我一起学.NetCore之Swagge
- 下一篇: BeetleX框架详解-小结