打造釘釘事件分發平台之釘釘審批等事件處理


前言

上講和上上講我們說到了釘釘的審批和釘釘通訊錄的一個簡單示例,這次我們講下如何快速打造一個自己的釘釘事件分發平台。讓你能夠通過監聽用戶在釘釘上的操作,然后進行對應的業務處理,比如釘釘流程審批完后業務處理、通訊錄員工增加后對應自己系統的業務處理等等

為什么要做一套自己的釘釘事件分發平台?
之前我們講過通過釘釘提供的通訊錄接口進行同步自己OA系統和釘釘通訊錄,這種同步的方式為:OA系統通訊錄更改-》釘釘通訊錄同步。這種方式只解決了單向同步,所以如果我們把釘釘通訊錄的事件監聽起來,這樣釘釘通訊錄更改-》OA系統通訊錄同步就能實現雙向同步的過程。
再說回上講的釘釘審批,我們講了如果通過接口進行釘釘的流程發起,但是審批的操作都是在釘釘上進行,所以也必須把釘釘上的審批動作事件進行監聽,然后將結果返回給自己的系統進行業務處理。
釘釘官方明確注明了,一個企業只能注冊一個接收回調的URL地址 ,所以我們必須將事件的回調進行統一管理,做一套屬於自己的釘釘事件分發平台,注冊對應的事件,然后只提供一個回調地址給釘釘,然后在自己的回調地址中進行轉發。我簡單畫了一個圖,如下:
20200923225618

釘釘的事件回調
回調是開發者在釘釘開放平台注冊一個HTTP接口,並訂閱相關的事件,當事件發生時,釘釘會主動調用開發者注冊的HTTP接口,推送對應的事件信息。比如訂閱審批事件回調后,當審批狀態變更時,會向注冊的HTTP接口推送事件信息。

針對所有的回調事件,在收到事件推送后,務必返回包含經過加密的字符串“success”的json數據,只有返回了對應的json數據,釘釘才會判斷此事件推送成功。具體返回的數據格式為:

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

20200923222844

先來注冊釘釘事件回調

注冊回調接口時,釘釘服務器會向URL發起【測試回調URL】事件,來驗證填寫url的合法性,url服務器需要在接收到回調之后返回字符串“success”的加密json數據,才能完成注冊。流程如下圖:
20200923230502

請求地址(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"
}

20200923231025

測試事件回調URL
在注冊事件回調接口的時候,釘釘服務器會向您“注冊回調接口”時候設置的url(接收回調的url)發起POST請求,用來測試url的合法性。收到消息后,需要返回經過加密后的字符串“success”的json數據,否則釘釘服務器將認為url不合法。
20200923231357

msg_signature :消息體簽名
timeStamp :時間戳
nonce :隨機字符串
encrypt :字符串“success”加密值,加解密說明:https://ding-doc.dingtalk.com/doc#/faquestions/ltr370

這里我已經注冊好了,直接用查詢接口看看
20200923232906
20200923232931

再來看下審批的事件回調

20200924000222

我們自己寫的測試回調接口:

        /// <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的回調地址告訴分發平台,由分發平台接收到釘釘回調后根據需要分別通知即可,這里就不做代碼展示了。

上講的時候我們是的流程發起,其實填單是在自己的內部系統填寫的然后通過接口像釘釘發起流程,實現這次的事件分發平台后,我們可以將一些簡單的表單由釘釘上直接填寫,然后通過事件回調,然后傳給我們內部系統進行歸檔。

內部系統填寫表單 (由於自己內部系統,可以支持各種復雜的表單填寫,數據關聯操作等):
20200924002417

釘釘系統填寫表單 (適合簡單的表單填寫):
20200924002626

好了,到此結束,更多的大家可以多關注下釘釘官方文檔:https://ding-doc.dingtalk.com/doc#/personnal/fdzxvg

如果大家有疑問或者更好的想法建議,評論區見~
20200924005259

福祿ICH·ERP項目部 福樂里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM