C#-钉钉事件订阅-接口回调

简介: C#-钉钉事件订阅-接口回调

最做一个项目要应用到钉钉的事件订阅这个功能,然后根据它文档中的操作来进行配置,期间也出来很多问题。

下面给大家展示一下该怎么正确的进行一个事件订阅。

钉钉官方的配置事件订阅的过程

首先我们要先建立一个web api的程序

具体建立这个web api应用的操作可以在网上搜有很多。

建立成功以后

是这个样子的,咱们是要在这个方法下进行操作的,这么做是为了简单,你也可以自己去写一个方法,比如这个样子



这个就是我这边写的钉钉订阅事件回调的接口方法,参数有3个是通过 这是钉钉调用咱们要传过来的,因为传过来的数据解密后对应的是你具体触发的事件,这是我具体的回调接口中的代码,可以分为三部分来看,第一部分是解密传进来的json串,第二部分是根据第一部分传解密后的值判断事件类型也就是你具体的业务了,第三部分是要给钉钉返回一个加密json串。


首先这个回调方法中涉及到的加解密类:

https://github.com/open-dingtalk/dingtalk-callback-Crypto?spm=ding_open_doc.document.0.0.1c9f70088ZsInrd

https://github.com/open-dingtalk/dingtalk-callback-Crypto?spm=ding_open_doc.document.0.0.1c9f70088ZsInr

[HttpPost]
        public DingDingBack dingding(string signature, string timestamp, string nonce)
        {
            //第一部分
            //这两句代码是为了接收body体中传入的加密json串
            Request.Content.ReadAsStreamAsync().Result.Seek(0, System.IO.SeekOrigin.Begin);
            string content = Request.Content.ReadAsStringAsync().Result;
            //反序列化json串拿去加密字符串
            JToken json = JToken.Parse(content);
            string ever = json["encrypt"].ToString();
            //实例化钉钉解密类构造参数为对应的 应用中的token、aes_key、AppKey值
            DingTalkEncryptor dingTalkEncryptor = new DingTalkEncryptor("token", "aes_key", "appkey");
            //定义字符串接收解密后的值
            string text = dingTalkEncryptor.getDecryptMsg(signature, timestamp, nonce, ever);
            JToken jToken = JToken.Parse(text);
            //取出事件类型字段
            string EventType = jToken["EventType"].ToString();
            第二部分
            //  { //判断事件类型是否是日程事件
            if ("calendar_event_change" == EventType)
            {
            }
            //第三部分
            //返回加密字符串          
            var msg = dingTalkEncryptor.getEncryptedMap("success");
            DingDingBack back = new DingDingBack();
            back.msg_signature = msg["msg_signature"];
            back.encrypt = msg["encrypt"];
            back.timeStamp = msg["timeStamp"];
            back.nonce = msg["nonce"];
            return back;
        }

因为钉钉是要请求咱们这边的接口,还有传值进来,我们要做的是根据它传入的值进行一个解密,然后再返回一个加密的字符串,



最后碰到的问题汇总:关于超时类型的问题,可能是你的这个接口调用时间太长,超时以后钉钉这边就认为调用失败。


还有返回200的码表示正常,这种问题就是你接口的返回值不是json格式的,你直接返回实体到就可以解决这个问题。


还有最重要的就是你的接口一定要是公网可访问的。


相关文章
|
4月前
|
存储 弹性计算 JSON
钉钉接口回调问题
当调用钉钉审批接口返回错误提示“form_component_values 参数无效”时,可以尝试以下方法进行排查和解决: 检查 form_component_values 参数的格式是否正确。 确保该参数是一个 JSON 对象,且包含所有必填字段 确保 form_component_values 参数中的所有字段值都是有效的。 如果某个字段的值不符合要求,可能会导致审批流程无法正常提交。
|
10月前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
570 5
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
142 9
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
329 7
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
595 5
由浅入深理解C#中的事件
由浅入深理解C#中的事件
206 19
|
C++ 安全 存储
C++智能指针解析
C++智能指针解析
176 0
C++智能指针解析
|
存储 算法 C++
Hash与布隆过滤器
Hash与布隆过滤器
148 0
Hash与布隆过滤器
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
209 1
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
573 0