对接钉钉审批过程记录(C#版本)

钉钉开放平台:API总览 - 钉钉开放平台

按照开放平台操作指引,进入到钉钉开发者后台:开发者后台统一登录 - 钉钉统一身份认证,进行应用创建。

按照开放平台指引下载钉钉SDK(新版)。

在vs引入钉钉dll文件。

  • 获取应用接入token:
 public class GetToken{public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient(){AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();config.Protocol = "https";config.RegionId = "central";return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);}public static string DingtalkToken(){AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient();AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetTokenRequest getTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetTokenRequest{ClientId = "你的clientid,在开发者后台查看",ClientSecret = "你的secret,在开发者后台查看",GrantType = "client_credentials",};var res = client.GetToken("你的组织corpid,需要管理员在钉钉管理后台查看", getTokenRequest);return res.Body.AccessToken;}}
  • 获取用户id:
public class GetUser
{public static AlibabaCloud.SDK.Dingtalkcontact_1_0.Client CreateClient(){AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();config.Protocol = "https";config.RegionId = "central";return new AlibabaCloud.SDK.Dingtalkcontact_1_0.Client(config);}public static string GetUserId(string token,string username){AlibabaCloud.SDK.Dingtalkcontact_1_0.Client client = CreateClient();AlibabaCloud.SDK.Dingtalkcontact_1_0.Models.SearchUserHeaders searchUserHeaders = new AlibabaCloud.SDK.Dingtalkcontact_1_0.Models.SearchUserHeaders();searchUserHeaders.XAcsDingtalkAccessToken = token;AlibabaCloud.SDK.Dingtalkcontact_1_0.Models.SearchUserRequest searchUserRequest = new AlibabaCloud.SDK.Dingtalkcontact_1_0.Models.SearchUserRequest{QueryWord = username,Offset = 0,Size = 10,FullMatchField = 1,};try{var res = client.SearchUserWithOptions(searchUserRequest, searchUserHeaders, new AlibabaCloud.TeaUtil.Models.RuntimeOptions());string uid = res.Body.List.First();return uid;}catch (TeaException err){if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message)){Console.WriteLine(err.Code);Console.WriteLine(err.Message);var a = err.AccessDeniedDetail["requiredScopes"];foreach (var item in (List<object>)a){Console.WriteLine(item.ToString());}}}catch (Exception _err){TeaException err = new TeaException(new Dictionary<string, object>{{ "message", _err.Message }});if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message)){Console.WriteLine(err.Code);Console.WriteLine(err.Message);}}return "";}
}
  • 发起流程:
public class DingtalkProcess
{public static AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client CreateClient(){AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();config.Protocol = "https";config.RegionId = "central";return new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client(config);}public static string StartProcess(string Token,string Uid,string Now, string Code, string Name,string Group,string Address){AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client client = CreateClient();AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceHeaders startProcessInstanceHeaders = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceHeaders();startProcessInstanceHeaders.XAcsDingtalkAccessToken = Token;string InstanceId = "";AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues0 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues{Name = "日期",Value = Now,ComponentType = "DDDateField",};AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues1 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues{Name = "编码",Value = Code,ComponentType = "TextField",};AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues2 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues{Name = "名称",Value = Name,ComponentType = "TextField",};AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues3 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues{Name = "分组",Value = Group,ComponentType = "TextField",};AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues4 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues{Name = "地址",Value = Address,ComponentType = "TextField",};AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest startProcessInstanceRequest = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest{OriginatorUserId = Uid,//发起人idProcessCode = "你的单据id,由管理员在钉钉后台OA审批相应单据查看",DeptId = 1234567,//部门id,由管理员在通讯录查询相应部门idFormComponentValues = new List<AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues>
{formComponentValues0, formComponentValues1, formComponentValues2, formComponentValues3, formComponentValues4
},};try{var ResponseId=client.StartProcessInstanceWithOptions(startProcessInstanceRequest, startProcessInstanceHeaders, new AlibabaCloud.TeaUtil.Models.RuntimeOptions());InstanceId = ResponseId.Body.InstanceId;}catch (TeaException err) {Console.WriteLine(err.Code);Console.WriteLine(err.Message);var a=err.AccessDeniedDetail["requiredScopes"];foreach (var item in (List<object>)a){Console.WriteLine(item.ToString());}}return InstanceId;}
}
  • 根据钉钉流程审批实例id获取审批流程状态:
 public class GetInstance{public static AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client CreateClient(){AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();config.Protocol = "https";config.RegionId = "central";return new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client(config);}public static GetProcessInstanceResponse GetProcess(string token,string processId) {AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client client = CreateClient();AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.GetProcessInstanceHeaders getProcessInstanceHeaders = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.GetProcessInstanceHeaders();getProcessInstanceHeaders.XAcsDingtalkAccessToken = token;AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.GetProcessInstanceRequest getProcessInstanceRequest = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.GetProcessInstanceRequest{ProcessInstanceId = processId,};try{var res= client.GetProcessInstanceWithOptions(getProcessInstanceRequest, getProcessInstanceHeaders, new AlibabaCloud.TeaUtil.Models.RuntimeOptions());return res;}catch (TeaException err){if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message)){// err 中含有 code 和 message 属性,可帮助开发定位问题}}catch (Exception _err){TeaException err = new TeaException(new Dictionary<string, object>{{ "message", _err.Message }});if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message)){// err 中含有 code 和 message 属性,可帮助开发定位问题}}return null;}}

注意:以上操作需要接口权限,具体在实际调试过程中按照返回提示结合操作指引在钉钉开发者后台申请相应权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917857.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AFSIM入门教程03.03:更新所有依赖库版本

系列索引&#xff1a;AFSIM入门教程索引 上一篇中更新了tiff库版本&#xff0c;本文将更新所有使用到的依赖库版本。 失败了 依赖库 首先获取哪些库被使用了。打开源码目录&#xff0c;搜索# Configure the 3rd_party&#xff0c;可以看到调用第三方库的代码。 官方提供的…

完美解决hive external表中csv字段内容含“,“逗号的问题

为解决hive表中csv字段内容含","逗号的问题&#xff0c;网上几乎都是说要用org.apache.hadoop.hive.serde2.OpenCSVSerde。 使用方法为&#xff1a; 1、mysql导出时&#xff0c;加一个ENCLOSED BY ‘"’&#xff0c; 示例&#xff1a; mysql -h 10.16.0.10 -P …

【Git】修改本地和远程的分支名称

其原理是&#xff1a; 对于本地&#xff1a;可直接修改分支名称&#xff1b;对于远程&#xff1a;不可直接重命名分支&#xff0c;所以应该将修改好名称的分支以新分支的形式推送上远程仓库&#xff0c;之后将新分支与远程新分支关联&#xff0c;之后可选择删除旧分支# 例子&am…

ubuntu24.04安装selenium、chrome、chromedriver

实验环境&#xff1a;kaggle notebook、colab notebook1、安装chrome!wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb!sudo dpkg -i google-chrome-stable_current_amd64.deb!sudo apt-get install -f!export QT_QPA_PLATFORMoffscreen!sudo…

西门子PLC基础指令6:读取时钟指令、设置时钟指令、使能含义与注意

读/写指令 1. 读取时钟 指令 READ_RTCREAD_RTC &#xff08;RTC 全称是 Real - Time Clock&#xff0c;即实时时钟 &#xff09;指令的主要作用是将 CPU 内部实时时钟&#xff08;RTC&#xff09;的当前日期和时间信息读取出来&#xff0c;并存储到以指定字节地址&#xff08;图…

GeoTools 结合 OpenLayers 实现缓冲区分析

前言❝ 缓冲区分析是地理信息系统&#xff08;GIS&#xff09;空间分析的核心功能之一。它通过围绕点、线或面等地理实体&#xff0c;自动生成指定距离&#xff08;或宽度&#xff09;的等距区域&#xff08;缓冲区&#xff09;。该功能为量化空间邻近度、评估影响范围、识别潜…

SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现

SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现 前言 上一篇文章 我写的关于SpringBoot整合t-io是websocket实时通信的文章中我们可以了解到 websocket是双向通信的,而且需要TCP连接的支持,今天在这里我要说的SSE(Server-Sent Events) 是一个单项通信的消息实时推…

创建型设计模式:对象诞生的艺术与智慧

&#x1f3ad; 创建型设计模式&#xff1a;对象诞生的艺术与智慧 &#x1f4a1; 温馨提示&#xff1a;本文将以轻松有趣的方式带你探索设计模式的世界&#xff0c;就像在听一个关于"如何优雅地生孩子"的故事一样&#xff01; &#x1f6aa; 传送门&#xff1a;在开始…

如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题 摘要 在使用 PyCharm 2025 进行 Python 开发时&#xff0c;常常需要通过 pip install 安装第三方包以丰富项目功能。但在安装 gensim 等包时&…

【嵌入式电机控制#26】BLDC:三相模拟采集

之前有些网友试着用有刷的平均电流法采集三相&#xff0c;还搞了个闭环控制。求&#xff01;结果直接把驱动板给干没了......做过仿真的朋友们都知道&#xff0c;无刷电机的相电流波形是介于方波和正弦波的。如果拿平均电流去测量&#xff0c;很不靠谱。这节内容为大家分享采集…

ref存储对象和reactive深度响应式递归地对对象的嵌套属性进行响应式处理

ref 不会递归地对 对象 或 数组 中的每个属性或元素进行深度响应式处理。如果你需要递归处理嵌套属性&#xff0c;reactive 是更适合的选择。让我通过具体的例子来展示这一点。 例子&#xff1a;ref 存储对象和嵌套对象 1. 使用 ref 存储嵌套对象&#xff1a; import { createA…

小鹏汽车前端面经

前端基础与浏览器机制 (Front-End Fundamentals & Browser Mechanics) 这些问题涵盖了Web工作的基本原理&#xff0c;包括网络、渲染和浏览器特性。 1. 浏览器渲染与性能 (Browser Rendering & Performance) URL输入发生什么&#xff1f;(What happens when you type a…

利用DeepSeek编写go语言按行排序程序

听说google出品的go语言也是系统开发中常用的&#xff0c;性能到底怎么样&#xff0c;还是老办法&#xff0c;让DeepSeek写个程序跑一下&#xff0c;基于以往的经验&#xff0c;直接让它同时编写有缓冲和无缓冲版本。 package mainimport ("bufio""fmt"&qu…

《解构Angular组件变化检测:从自动到手 动的效能突破》

为何有时数据更新后视图却无动于衷?为何看似简单的操作会引发连锁式的性能损耗?要解开这些疑问,需要穿透表层的API调用,深入到框架设计的底层逻辑中去。变化检测的核心使命,是确保视图层能够准确反映数据层的当前状态。这种"数据-视图"的同步关系,是所有前端框…

书单 | AI编程+Python+Go三大核心领域书单

这份书单聚焦AI编程、Python开发、Go语言三大核心领域&#xff0c;精选6本本月 最具前瞻性的技术图书&#xff0c;为你构建"工具链业务层系统层"的全栈能力。 1、人人皆可Vibe编程&#xff1a;玩转氛围编程 作者&#xff1a;池志炜,薛志荣 本书围绕Vibe编程这一AI驱…

Kali Linux 2025.2基于MITRE ATTCK框架

从彻底革新的菜单结构到新增的13款尖端工具&#xff0c;再到首次支持智能手表Wi-Fi注入&#xff0c;Kali Linux 2025.2为红队、蓝队以及安全研究人员提供了更高效、更直观的工具生态。菜单结构大变革&#xff1a;基于MITRE ATT&CK框架Kali Linux 2025.2最引人注目的变化之一…

javacc实现简单SQL解析器

文章目录前言本章节源码需求1&#xff1a;实现一个最简单的select sql要求实现jj文件编译测试需求2&#xff1a;理解Token及其他属性说明javajj文件需求3&#xff1a;实现解析得到SQL语法树 & 精确点位资料获取前言 博主介绍&#xff1a;✌目前全网粉丝4W&#xff0c;csdn…

Odoo OWL前端框架全面学习指南 (后端开发者视角)

核心理念&#xff1a; 将您熟悉的Odoo后端MVCORM架构思想&#xff0c;完整映射到前端OWL组件化开发中&#xff0c;让您在熟悉的概念体系下&#xff0c;快速掌握新的技术栈。第一部分&#xff1a;核心概念映射与环境搭建内容摘要&#xff1a; 本部分旨在建立后端与前端最核心的概…

Java开发工具包,jdk,idea,VMware,rocketmq,redis,CentOS7

Java开发工具包&#xff0c;jdk&#xff0c;idea&#xff0c;VMware&#xff0c;rocketmq&#xff0c;redis&#xff0c;CentOS7 下载地址 通过网盘分享的文件&#xff1a;Java开发环境工具包 链接: https://pan.baidu.com/s/1eJqvPx5DYqtmXgmEtOl8-A?pwdcj1f 提取码: cj1f –…

macOS Python 安装

目录 一、确认系统环境 二、安装 &#xff08;一&#xff09;下载安装包 &#xff08;二&#xff09;安装过程 三、配置环境变量 四、验证安装 一、确认系统环境 在安装 Python 之前&#xff0c;我们先简单了解一下自己的 MACOS 系统。可以点击屏幕左上角的苹果菜单&…