GGYS

博客园 首页 新随笔 联系 订阅 管理

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

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

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

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

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

建立成功以后

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

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

首先这个回调方法中涉及到的加解密类:https://github.com/open-dingtalk/dingtalk-callback-Crypto?spm=ding_open_doc.document.0.0.1c9f70088ZsInrdicon-default.png?t=LBL2https://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格式的,你直接返回实体到就可以解决这个问题。

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

posted on 2021-12-31 20:54  pengpeng077  阅读(117)  评论(0编辑  收藏  举报  来源