C# 实现对接钉钉回调事件(语言不重要,主要是思路)

钉钉的文档写的比较宽泛,又更新比较快,所以在解决回调的对接后做个记录,避免后面再次踩坑,也给遇到困惑的大家带来一点灵感,互相帮助~

钉钉官方文档在这: https://developers.dingtalk.com/document/app/callback-overview,有需要的朋友自取。

所谓回调,我的简单理解就是由a(数据主系统)提供入口,b(第三方系统)通过a提供的开放的接口和方法进行授权、注册等一系列操作后,可以实现a有数据变动或业务操作时,调用b的接口从而触发业务关联和数据传输,达到独立系统之间数据同步和共享的目的。

一、登录开发后台创建应用,记录所需参数

 首先我们在钉钉客户端进入后台管理,登录开发者后台,创建一个应用(这个应用目的就是配置钉钉http回调的url和需要订阅的哪些事件,意思就是比如需要钉钉用户新增时自动调用你的接口发消息啊,保存钉钉用户数据到你的数据库啊之类的,就需要在这里勾选用户新增事件,去订阅它)。

首先点应用进来,"基础信息"里面就看到有几个参数,我们只需记录这一个应用的Appkey即可,回调会用到。

二、配置key和token、回调地址 

然后我们点左边导航的"事件订阅",里面有加密 aes_key、签名 token,可以自己设置,也可以点随机生成,这两个参数也是注册回调需要用到的,小笔记录起!然后我们看到下面还有一个请求网址,这个就是我们自己的接口地址(必须要公网能访问)了,用来接收钉钉触发了订阅的事件,向我们发起的请求。

 三、编写回调接口地址代码

我的接口地址配置的如上图,对应代码如下。

        /// <summary>
        /// 钉钉注册的回调地址
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <param name="body"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("Api/DINGDV2/CallBack")]
        public dynamic CallBack(string signature, string timestamp, string nonce, PostBody body)
        {
            //接收encrypt参数
            string encryptStr = body.encrypt.Replace("{\"encrypt\":\"", "").Replace("\"}", "");
            //应用签名Token
            string token = "Token";
            //应用加密 aes_key
            string aes_key = "aes_key";
            //应用appKey
            string suitekey = "appKey";

            #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";//固定字符,加密返回后验证合法性

            #region 根据触发的事件编写自己的业务逻辑
            //用户新增事件
             if (eventType == "user_add_org")
                {}
            //用户离职事件
             if (eventType == "user_leave_org")
                {}
            #endregion 

            DateTime dt1 = Convert.ToDateTime("1970-01-01 00:00:00");
            TimeSpan ts = DateTime.Now - dt1;
            long time = (long)Math.Ceiling(ts.TotalSeconds);
            timestamp = time.ToString();//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
        }

相信大家都是看了钉钉文档才到网上搜坑的吧,那我就不多解释,请求的几个参数:string signature, string timestamp, string nonce, PostBody body,意思就是为了验证你的接口的有效合法性,你要拿来解密处理,并在1500ms内返回包含success的加密字符串(JSON格式)就可以了,就认为你的接口是正常的,可以放心把数据推送给你啦,如果验证失败,会判定为失败的回调信息,具体返回的信息在文档中有解释,什么参数错误啊之类的多检查就好了。这几个参数传入格式是钉钉固定的格式,照着写就是。

代码中用到了在钉钉git上淘的两个加密解密的帮助类DingTalkCrypt、Cryptography,有需要的朋友点这里下载完整代码查看~完整代码.zzziiippp

四、选择需要订阅的事件

OK,回调接口也写完了,接下来就是订阅事件了,回到开发者后台,我们创建的应用,还是点开左边栏的事件订阅,往下滑,我们看到有很多的事件,根据业务需要进行选择就可以了,比如
我代码里面写的"eventType == "user_add_org"",对应的事件就是通讯录用户新增事件,勾选之后,用户新增之后就会触发接口,根据eventType进行区分,进而触发我们自己编写的业务代码,这样就实现了回调。

<think>好的,我现在需要帮助用户查找如何使用C#钉钉审批系统进行集成的方法。用户明确提到了需要示例和教程,所以我应该结合之前提供的引用信息来整理答案。 首先,我需要回顾用户提供的引用内容,特别是引用[2]、[4]和[5],因为这些直接提到了C#钉钉的集成。引用[2]提到C#对接钉钉OA审批流程的示例代码,虽然源代码可能无法直接运行,但流程步骤已经给出。引用[4]展示了操作localStorage的基础代码,可能涉及身份验证时的令牌管理。引用[5]则讨论了回调接口的实现,需要提供HTTP服务。 接下来,我应该按照用户要求的步骤结构来组织回答。用户可能需要从环境准备开始,比如创建钉钉应用,获取必要的凭证如AppKey和AppSecret。然后,获取访问令牌,这是调用API的前提。引用[2]中的步骤提到了获取部门列表、人员列表、封装参数和发送请求,这些可以整合到步骤中。 然后,用户可能需要示例代码,例如如何发送审批实例。这里需要确保代码符合C#的语法,并且正确使用HttpClient等库。引用[2]中的发起审批实例的链接需要被引用,同时要提醒用户替换关键参数如token、process_code和userid。 另外,用户可能遇到附件参数的问题,引用[2]提到无法通过程序创建审批流程时传附件,只能单独发送,这点需要作为注意事项提及。同时,回调接口的处理需要参考引用[5],说明如何设置HTTP服务来处理钉钉回调请求。 最后,需要生成相关问题,可能涉及调试技巧、安全性处理、附件上传和与其他系统的集成,这些都能从引用中找到相关点,比如引用[3]提到的数据集成中台和主流软件集成。 需要确保所有步骤清晰,代码示例正确,并且引用标记正确添加。同时,提醒用户代码可能需要调整,特别是微应用绑定的地址问题,如引用[2]所述。这样用户就能有一个全面的指南来开始集成工作。</think>### C#钉钉审批系统集成方法分步说明 #### 一、环境准备 1. 在钉钉开发者后台创建微应用,获取$AppKey$和$AppSecret$[^2] 2. 安装C#开发环境(建议使用.NET Core 3.1+) 3. 添加NuGet包依赖:`RestSharp`或`HttpClient` #### 二、核心实现步骤 1. **获取访问令牌** ```csharp public string GetAccessToken(string appKey, string appSecret) { using var client = new HttpClient(); var response = client.GetAsync($"https://oapi.dingtalk.com/gettoken?appkey={appKey}&appsecret={appSecret}").Result; return JsonConvert.DeserializeObject<dynamic>(response.Content.ReadAsStringAsync().Result).access_token; } ``` 调用示例:`var token = GetAccessToken("your_appkey", "your_appsecret")` 2. **发起审批实例** ```csharp public void CreateApprovalInstance(string token) { var request = new { process_code = "PROC-XXXXXX", // 审批模板ID originator_user_id = "manager123", dept_id = "123456", form_component_values = new[] { new { name = "请假事由", value = "病假" } } }; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("x-acs-dingtalk-access-token", token); var response = client.PostAsJsonAsync( "https://api.dingtalk.com/v1.0/workflow/processInstances", request).Result; } ``` 完整参数结构参考[官方文档](https://developers.dingtalk.com/document/app/initiate-approval) #### 三、关键注意事项 1. **身份验证**需处理token缓存,建议使用: ```csharp // 使用内存缓存存储token MemoryCache.Default.Add("DingTalkToken", token, DateTimeOffset.Now.AddHours(1.5)); ``` [参考localStorage实现思路[^4]] 2. **回调接口**实现需创建WebAPI: ```csharp [HttpPost("/dingtalk/callback")] public IActionResult HandleCallback([FromBody] DingTalkEvent payload) { // 验证签名逻辑 if (!CheckSign(Request.Headers["Timestamp"], Request.Headers["Sign"])) return Unauthorized(); // 处理审批事件 if (payload.EventType == "bpms_task_change") HandleApprovalChange(payload); return Ok(new { Message = "success" }); } ``` [事件处理参考[^5]] #### 四、调试技巧 1. 使用钉钉提供的[接口调试工具](https://open-dev.dingtalk.com/apiExplorer) 2. 捕获请求日志: ```csharp var requestContent = JsonConvert.SerializeObject(request); _logger.LogInformation($"Sending: {requestContent}"); ``` #### 附:完整流程示意图 $$ \begin{array}{ccc} \text{C#应用} & \xrightarrow{\text{1.获取Token}} & \text{钉钉服务器} \\ & \xleftarrow{\text{2.返回access\_token}} & \\ & \xrightarrow{\text{3.提交审批数据}} & \\ & \xleftarrow{\text{4.返回实例ID}} & \\ & \xrightarrow{\text{5.接收回调}} & \\ \end{array} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝色黄昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值