上講和上上講咱們說到了釘釘的審批和釘釘通信錄的一個簡單示例,此次咱們講下如何快速打造一個本身的釘釘事件分發平臺。讓你可以經過監聽用戶在釘釘上的操做,而後進行對應的業務處理,好比釘釘流程審批完後業務處理、通信錄員工增長後對應本身系統的業務處理等等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
若是你們有疑問或者更好的想法建議,評論區見~