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

钉钉官方文档在这: 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("\"}", "");//应用签名Tokenstring token = "Token";//应用加密 aes_keystring aes_key = "aes_key";//应用appKeystring suitekey = "appKey";#region 验证回调的urlDingTalkCrypt 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进行区分,进而触发我们自己编写的业务代码,这样就实现了回调。

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

  1. python处理钉钉回调事件中的消息体加解密

    钉钉的回调事件列表: user_add_org : 通讯录用户增加 user_modify_org : 通讯录用户更改 user_leave_org : 通讯录用户离职 org_admin_add : ...

  2. 钉钉中添加回调监听事件

    此类是HttpRequest.java -------------------------------------------------------------------------------- ...

  3. 钉钉OA审批事件回调遇坑梳理-如何注册多个事件回调

    项目场景: 问题:使用钉钉http调用事件回调注册,遇坑 本项目有两套服务. 当 600 服务,在使用钉钉注册回调的接口后,再次注册800回调服务,800 回调会覆盖掉600服务 测试服务 600 正 ...

  4. python项目对接钉钉SDK

    钉钉SDK 对接sdk还是遇到不少问题的 文章目录 钉钉SDK 一. 第三方web网站扫码登录 1. 流程 二. 加解密 1.注册事件 三. 调试 钉钉python版SDK文档地址: https:// ...

  5. 钉钉统一身份认证对接前后端代码

    1. 钉钉统一身份认证平台的对接方式 钉钉统一身份认证平台提供了多种对接方式,包括OAuth2.0.SAML.CAS等,其中OAuth2.0是最常用的一种方式.OAuth2.0的对接流程如下: 1.开 ...

  6. 金蝶钉钉对接方案介绍

    业务系统使用了金蝶云星空ERP,办公审批考勤等使用钉钉软件,本文介绍如何使两个系统数据互通. 对接思路: 1. 金蝶ERP中用表单插件,通过按钮事件把需要传递钉钉的数据整理成json格式.调用钉钉的接 ...

  7. Java对接钉钉开发第三方H5微应用详细教程

    文章转载自:钉钉开发第三方H5微应用入门详细教程[ISV][免登流程][授权码][HTTP回调推送][识别用户身份][获取用户信息] - 世间草木 - 博客园 (by lnexin@aliyun.co ...

  8. 钉钉开发第三方H5微应用入门详细教程[ISV][免登流程][授权码][HTTP回调推送][识别用户身份][获取用户信息]...

    转载请注明原文地址:https://www.cnblogs.com/applerosa/p/11509512.html (by lnexin@aliyun.com 世间草木) 此教程注意点: 适用于第 ...

  9. 钉钉接入access_无需开发,IT事件接入钉钉的方法详解

    1.市场在拥抱钉钉 最近一篇名为<为什么有很多企业沉迷钉钉无法自拔>的文章很火,文章不短,其中有一部分阐述了:钉钉抓住以人为核心的"智能协同"差异化路线,帮助企业打破过 ...

最新文章

  1. VIRTUAL COMMUNITY INFORMATICS
  2. 第十八章 MySQL Workbench5.2使用(待续)
  3. spring获取bean的方案
  4. Pycharm ipynb
  5. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )
  6. mybaits二十一:1连接池以及事务控制
  7. 8.8 正睿暑期集训营 Day5
  8. 济宁市机器人科技乐园_人工智能的“游乐场”,邀你免费畅玩!
  9. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...
  10. 全新Linux+Python高端运维班第一次作业
  11. 谷歌首页被别的网站篡改
  12. android 过滤英文字符,Android编程之TextView的字符过滤功能分析
  13. Android_仿爱奇艺Loading效果
  14. java peek函数_java (String) s.peek()是什么意思?
  15. 为什么我们的代码难以维护(草稿)
  16. NLP入门概览(9) ——句法分析c:局部句法分析、依存关系分析
  17. DNA sequence HDU 1560
  18. 惊呆了!难道还有这么云盘的软件???再也不怕视频被和谐了!!
  19. c++十六进制加法_C/C++知识点之怎样理解八进制和十六进制
  20. 网站底部的统计代码HTML

热门文章

  1. 升级家庭影院怎能少得了杜比全景声?——飞利浦全景声回音壁B8905
  2. 对话声网CEO赵斌:API吃掉世界,在RTC+AI+5G的交点上构建实时场景
  3. 怎么恢复损坏后U盘中的数据
  4. 2011级-csdn-java-张侃— JDBC开发—连接池(二)
  5. P8Z77-V-ASUS-2104-Nvme_Dell2.3.rar 我需要这个
  6. window.returnValue和 window.showModalDialog()和window.close()的使用方法
  7. 调试Linux系统挂起和休眠问题的最佳实践
  8. [转载] 图像处理入门教程
  9. 单片机+c语言+运算符,单片机C语言编程常用的运算符介绍
  10. 骗取搜索引擎排名的黑帽SEO方法说明