做釘釘事件回調,來監測單據審批狀況,釘釘給的真是一個垃圾demo,打開就報錯,提交工單上去,給的也是沒用的回復
折騰了好久,我終於做好了。
先說下操作流程:
網站向釘釘發出注冊信息(包含相關數據,及回調的Url地址)
釘釘服務器會訪問該地址,並傳遞相關數據,
本地網站解密數據,並返回加密的“success”
注冊成功,之后可以一直接收到相關的事件信息
先注冊:
protected void Button1_Click(object sender, EventArgs e) { Token _t = new Token(); string _token = _t.GetTokens(); //獲取Token DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/call_back/register_call_back"); OapiCallBackRegisterCallBackRequest request = new OapiCallBackRegisterCallBackRequest(); request.Url = "http://www.xxx.com/receive.ashx"; //回調Url request.AesKey = "45skhqweass5232345IUJKWEDL5251054DSFdsuhfW2"; //隨機43位字符串 request.Token = ""; //隨機填寫 List<string> _arr = new List<string>(); _arr.Add("bpms_task_change"); //填寫要監控的信息,具體填寫方法看這里 https://open-doc.dingtalk.com/microapp/serverapi2/skn8ld _arr.Add("bpms_instance_change"); request.CallBackTag =_arr; OapiCallBackRegisterCallBackResponse response = client.Execute(request, _token); string _str = response.Body; Response.Write(_str); }
[HttpPost] public JsonResult Receive(string signature, string timestamp, string nonce, PostBody body) { //接收encrypt參數 string encryptStr = body.encrypt.Replace("{\"encrypt\":\"", "").Replace("\"}",""); //注冊時填寫的token、aes_key、suitekey string token = ConfigurationManager.AppSettings["SuiteToken"]; //token = "123456";//釘釘測試文檔中的token string aes_key = ConfigurationManager.AppSettings["Suiteaes_key"]; //aes_key = "4g5j64qlyl3zvetqxz5jiocdr586fn2zvjpa8zls3ij";//釘釘測試文檔中的aes_key string suitekey = ConfigurationManager.AppSettings["DD_corpid"]; //suitekey = "suite4xxxxxxxxxxxxxxx";//釘釘測試文檔中的suitekey #region 驗證回調的url DingTalkCrypt dingTalk = new DingTalkCrypt(token, aes_key, suitekey); string sEchoStr = ""; int ret = dingTalk.VerifyURL(signature, timestamp, nonce, encryptStr, ref sEchoStr); #endregion #region 解密接受信息,進行事件處理 string plainText = ""; ret = dingTalk.DecryptMsg(signature, timestamp, nonce, encryptStr, ref plainText); Hashtable tb = (Hashtable)JsonConvert.DeserializeObject(plainText, typeof(Hashtable)); string eventType = tb["EventType"].ToString(); string res = "success"; switch (eventType) { case "user_modify_org"://用戶信息修改,執行代碼 #region 用戶信息修改,執行代碼 #endregion break; default: break; } timestamp = DateTime.Now.GetTimeStamp().ToString(); string encrypt = ""; string signature2 = ""; dingTalk = new DingTalkCrypt(token, aes_key, suitekey); ret = dingTalk.EncryptMsg(res, timestamp, nonce, ref encrypt, ref signature2); Hashtable jsonMap = new Hashtable { {"msg_signature", signature2}, {"encrypt", encrypt}, {"timeStamp", timestamp}, {"nonce", nonce} }; return Json(jsonMap); #endregion }