4. .net 註冊回撥
阿新 • • 發佈:2020-07-31
回撥概念
回撥是開發者在釘釘開放平臺註冊一個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
別的可以在下面的地址中查詢