C# WebAPI接口实现钉钉消息回调-通讯录和群管理变更同步

本文属于个人原创作品、个人总结,谢绝转载、抄袭。如果您有疑问或者希望沟通交流,可以联系QQ:865562060。

一、简述

钉钉开放了很多接口供企业同步内部系统数据到钉钉,同时也支持钉钉上信息变动回调企业内部系统,将信息变动回写企业内部系统:官方文档地址

官方文档中的C#回调demo是ashx文件实现,我这里是应用到个人公司内部企业的WebAPI项目实现,在钉钉上注册回调地址之后,钉钉调用WebAPI的接口进行数据回写。

二、实现代码

钉钉的注册事件和回调事件是连通的,必须两个联动调试通过之后,才算成功。

1、注册事件

注册回调接口的时候,钉钉服务器会回调测试回调url,来验证填写的url的合法性,需要您再接收到回调之后返回加密字符串“success”的json数据,才能完成注册。

C# WebAPI接口实现钉钉消息回调-通讯录和群管理变更同步_第1张图片

Https请求方式: 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",//加解密需要用到的token,ISV(服务提供商)推荐使用注册套件时填写的token,普通企业可以随机填写
    "aes_key": "1",//数据加密密钥。用于回调数据的加密,长度固定为43个字符,从a-z, A-Z, 0-9共62个字符中选取,您可以随机生成,ISV(服务提供商)推荐使用注册套件时填写的EncodingAESKey
    "url":"www.dingtalk.com"//接收事件回调的url,也就是第二步里面要写的回调地址
}

请求示例:

C# WebAPI接口实现钉钉消息回调-通讯录和群管理变更同步_第2张图片

2、回调事件

回调事件需要写一个返回Json数据的接口,因为钉钉在回调时要通过返回的Json数据验证回调的正确性。

        [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
        }

3、因为回调地址必须是钉钉可以访问的地址,所以在调试的时候稍显麻烦。但是在注册事件和回调地址都调试通过之后,再调试业务代码就非常的轻松了。

你可能感兴趣的:(C#)