本文属于个人原创作品、个人总结,谢绝转载、抄袭。如果您有疑问或者希望沟通交流,可以联系QQ:865562060。
钉钉开放了很多接口供企业同步内部系统数据到钉钉,同时也支持钉钉上信息变动回调企业内部系统,将信息变动回写企业内部系统:官方文档地址
官方文档中的C#回调demo是ashx文件实现,我这里是应用到个人公司内部企业的WebAPI项目实现,在钉钉上注册回调地址之后,钉钉调用WebAPI的接口进行数据回写。
钉钉的注册事件和回调事件是连通的,必须两个联动调试通过之后,才算成功。
1、注册事件
注册回调接口的时候,钉钉服务器会回调测试回调url,来验证填写的url的合法性,需要您再接收到回调之后返回加密字符串“success”的json数据,才能完成注册。
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,也就是第二步里面要写的回调地址
}
请求示例:
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、因为回调地址必须是钉钉可以访问的地址,所以在调试的时候稍显麻烦。但是在注册事件和回调地址都调试通过之后,再调试业务代码就非常的轻松了。