1. 程式人生 > 實用技巧 >4. .net 註冊回撥

4. .net 註冊回撥

回撥概念

回撥是開發者在釘釘開放平臺註冊一個HTTP介面,並訂閱相關的事件,當事件發生時,釘釘會主動呼叫開發者註冊的HTTP介面,推送對應的事件資訊。比如訂閱審批事件回撥後,當審批狀態變更時,會向註冊的HTTP介面推送事件資訊。

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

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

引數說明:

引數 說明
msg_signature 訊息體簽名
timeStamp 時間戳
nonce 隨機字串
encrypt “success”加密字串

成功註冊回撥需要關注事項

  • 時間戳和隨機數取從釘釘伺服器傳遞過來的引數,簽名取新值
  • 返回的資料格式 需要繼承DingTalkResponse,ErrCode按照建議寫“0”

不然可能會遇到:

errcode 71009 返回文字非success

原始碼


        [HttpPost]
        public DingTalkCallBack callback(string signature = "", string timestamp = "", string nonce = "", [FromBody] DingTalkEventType dingTalkEvent = null)
        {
            DingTalkCrypt dingTalk = new DingTalkCrypt(DingTalkConst.TOKEN, DingTalkConst.AESKEY, MyConfigManager.GetValueByName<string>("SyncExpenseTest:corpid"));

            string l_strPlainText = "";// 解密後的資料
            dingTalk.DecryptMsg(signature, timestamp, nonce, dingTalkEvent.encrypt, ref l_strPlainText);
            //測試解密資料是否為   "EventType" : "check_url"
            //Console.WriteLine(l_strDecryptMsg);

            string l_strEncryptMsg = "";
            string l_strSignMsg = "";

            int result = dingTalk.EncryptMsg(DingTalkConst.SUCCESS, timestamp, nonce, ref l_strEncryptMsg, ref l_strSignMsg);
            if (result != 0)
            {
                Log.Error("加密過程中出現失敗!");
            }

            //自己測試加密 l_strDecryptMsg  看看跟它發過來的是否一致
            //string aaa = "";
            //dingTalk.DecryptMsg(signature, timestamp,nonce,l_strPlainText, ref aaa);
            //Console.WriteLine(aaa);

            JObject jObject = JObject.Parse(l_strPlainText);
            string eventtype = jObject.GetValue("EventType")?.ToString();
            DingTalkCallBack model = new DingTalkCallBack();
            if (eventtype == "check_url")
            { //校驗地址是否有效
                model.msg_signature = l_strSignMsg;
                model.encrypt = l_strEncryptMsg;
                model.timeStamp = timestamp;
                model.nonce = nonce;
                model.ErrCode = "0";
                return model;
            }

            return Handle(jObject);
        }

需要引用的DLL

我是.net core 專案,所以需要引用 dingtalk-sdk-netCore 中的topsdk-net-core.dll

http://open-dev.dingtalk.com/download/openSDK/netCore

別的可以在下面的地址中查詢

https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02/8DMhu