前言
上講和上上講我們說到了釘釘的審批和釘釘通訊錄的一個簡單示例,這次我們講下如何快速打造一個自己的釘釘事件分發平台。讓你能夠通過監聽用戶在釘釘上的操作,然后進行對應的業務處理,比如釘釘流程審批完后業務處理、通訊錄員工增加后對應自己系統的業務處理等等
為什么要做一套自己的釘釘事件分發平台?
之前我們講過通過釘釘提供的通訊錄接口進行同步自己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
這里我已經注冊好了,直接用查詢接口看看
再來看下審批的事件回調
我們自己寫的測試回調接口:
/// <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
如果大家有疑問或者更好的想法建議,評論區見~