当前位置: 首页 > news >正文

Java如何实现企业微信审批流程

大家好,我是 V 哥。最近的一个项目中,用到企业微信的审批流程,整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成,企业微信提供了审批应用接口,用于创建审批模板、发起审批流程以及获取审批实例详情。下面 V 哥用一个Java示例代码,来展示如何在企业微信中实现审批流程。

V 哥推荐:2024 最适合入门的 JAVA 课程

实现步骤

  1. 获取企业微信Access Token:每次访问企业微信API接口前需要先获取Access Token。
  2. 创建审批模板(如已有模板则跳过此步骤)。
  3. 发起审批流程:通过指定的模板ID发起审批请求。
  4. 查询审批结果:获取审批的状态和详细信息。

以下代码使用HttpClient发起HTTP请求来调用企业微信API接口。

代码示例

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class WeChatApproval {//下面三个常量定义,需要用你自己的(企业微信开放平台)private static final String CORP_ID = "你的corp_id";private static final String CORP_SECRET = "你的corp_secret";private static final String APPROVAL_TEMPLATE_ID = "你的template_id"; // 审批模板ID// 获取 Access Tokenpublic static String getAccessToken() throws IOException {String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID + "&corpsecret=" + CORP_SECRET;try (CloseableHttpClient client = HttpClients.createDefault()) {HttpGet request = new HttpGet(url);try (CloseableHttpResponse response = client.execute(request)) {String responseBody = EntityUtils.toString(response.getEntity());Map<String, Object> map = new ObjectMapper().readValue(responseBody, Map.class);return map.get("access_token").toString();}}}// 发起审批流程public static String initiateApproval(String accessToken, Map<String, Object> approvalData) throws IOException {String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token=" + accessToken;try (CloseableHttpClient client = HttpClients.createDefault()) {HttpPost post = new HttpPost(url);post.setHeader("Content-Type", "application/json");Map<String, Object> requestMap = new HashMap<>();requestMap.put("template_id", APPROVAL_TEMPLATE_ID);requestMap.put("use_template_approver", 1); // 使用模板中的审批人requestMap.put("approver", approvalData.get("approver"));requestMap.put("apply_data", approvalData.get("apply_data"));requestMap.put("summary_list", approvalData.get("summary_list"));String json = new ObjectMapper().writeValueAsString(requestMap);post.setEntity(new StringEntity(json, "UTF-8"));try (CloseableHttpResponse response = client.execute(post)) {String responseBody = EntityUtils.toString(response.getEntity());Map<String, Object> map = new ObjectMapper().readValue(responseBody, Map.class);return map.get("sp_no").toString(); // 返回审批单编号}}}// 查询审批流程状态public static Map<String, Object> getApprovalDetail(String accessToken, String spNo) throws IOException {String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=" + accessToken;try (CloseableHttpClient client = HttpClients.createDefault()) {HttpPost post = new HttpPost(url);post.setHeader("Content-Type", "application/json");Map<String, Object> requestMap = new HashMap<>();requestMap.put("sp_no", spNo);String json = new ObjectMapper().writeValueAsString(requestMap);post.setEntity(new StringEntity(json, "UTF-8"));try (CloseableHttpResponse response = client.execute(post)) {String responseBody = EntityUtils.toString(response.getEntity());return new ObjectMapper().readValue(responseBody, Map.class);}}}public static void main(String[] args) {try {// 1. 获取Access TokenString accessToken = getAccessToken();System.out.println("Access Token: " + accessToken);// 2. 发起审批流程Map<String, Object> approvalData = new HashMap<>();approvalData.put("approver", new Object[] { Map.of("attr", 1, "userid", new String[] { "approver_userid" }) });approvalData.put("apply_data", Map.of("contents", new Object[] {Map.of("control", "Text", "id", "Text-1", "value", Map.of("text", "请假事由")),Map.of("control", "Date", "id", "Date-1", "value", Map.of("date", "2024-11-01"))}));approvalData.put("summary_list", new Object[] {Map.of("summary_info", Map.of("text", "请假申请"))});String spNo = initiateApproval(accessToken, approvalData);System.out.println("审批单号: " + spNo);// 3. 查询审批状态Map<String, Object> approvalDetail = getApprovalDetail(accessToken, spNo);System.out.println("审批详情: " + approvalDetail);} catch (IOException e) {e.printStackTrace();}}
}

代码说明

  1. 获取Access Token:通过getAccessToken方法获取企业微信的access_token,用于后续接口调用。
  2. 发起审批流程initiateApproval方法通过oa/applyevent接口发起审批流程,传入审批模板ID和审批表单数据(如审批人、申请数据和摘要等)。
  3. 查询审批流程状态getApprovalDetail方法通过oa/getapprovaldetail接口查询审批详情,包括审批状态和各环节的处理结果。

核心参数解释

  • template_id:审批模板ID,由企业微信审批应用中创建。
  • approver:审批人信息,可以指定具体审批人或审批人角色。
  • apply_data:审批申请数据,包含表单控件的数据内容。
  • summary_list:摘要信息,用于在审批列表显示申请概要信息。
  • sp_no:审批单编号,用于查询审批状态。

注意事项

  1. 权限问题:确保调用接口的应用具有审批权限,且已配置了企业微信API调用权限。
  2. 审批模板ID:模板ID需要在企业微信管理后台中创建审批模板时获取。
  3. 审批人配置:审批人需要是企业微信用户,并确保在审批模板中有相关配置。

最后

以上是实现企业微信中的审批流程,如何你也在开发类似的功能,希望可以帮助到你。关注威哥爱编程,编码路上作个同行人。

相关文章:

Java如何实现企业微信审批流程

大家好&#xff0c;我是 V 哥。最近的一个项目中&#xff0c;用到企业微信的审批流程&#xff0c;整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成&#xff0c;企业微信提供了审批应用接口&#xff0c;用于创建审批模板、发起审批流程以及获取…...

GEE app:在地图上构建一个可以查看局部的小窗

目录 简介 函数 ee.Geometry.MultiLineString(coords, proj, geodesic, maxError) Arguments: Returns: Geometry.MultiLineString getBounds(asGeoJSON) Arguments: Returns: GeoJSONGeometry|List|String setControlVisibility(all, layerList, zoomControl, scaleC…...

leetcode71:简化路径

给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下&#xff1a; 一个点 . 表示当前目录本身。此外&#xff0c;两个点 ..…...

nodejs入门教程4:nodejs创建第一个应用

1. 安装 Node.js 首先&#xff0c;确保你的计算机上已经安装了 Node.js。如果还没有安装&#xff0c;可以从官方网站&#xff08;https://nodejs.org&#xff09;下载并安装最新的 LTS 版本。安装完成后&#xff0c;你可以在命令行或终端中运行以下命令来验证安装&#xff1a;…...

启用 iPhone 原生的五笔输入

聊聊如何在 iOS 中使用原生的五笔输入法 本文虽然介绍的是如何添加五笔键盘&#xff0c;其实其他键盘&#xff08;双拼&#xff0c;外语键盘、第三方输入法&#xff09;也是类似的添加方式。 ‍ 使用原生的理由 虽然之前的文章列了不少第三方的五笔输入法&#xff0c;但其实…...

这个工具让你轻松开发一个带AI功能的Notion

这个工具让你轻松开发一个带AI功能的Notion Plate 是一款由 AI 加持的富文本编辑器&#xff0c;旨在帮助开发者创建功能强大的 WYSIWYG 文本编辑工具。本文将介绍 Plate 的基本信息、特点、以及如何快速上手使用。 软件简介 Plate 由 udecode 开发&#xff0c;基于 React 和 S…...

光耦合器的关键作用和创新---腾恩科技

光耦合器或光隔离器已成为电路中必不可少的器件&#xff0c;它允许信号在无需直接电接触的情况下跨不同电压域传输。这种隔离能力对于保护低压元件免受高压电路的潜在损坏至关重要。本文将仔细研究光耦合器在当今技术中发挥的独特作用&#xff0c;并探讨其在各种应用中不断扩展…...

穿越死锁的迷雾:pthread_mutex_lock的终极挑战与破解策略

穿越死锁的迷雾:pthread_mutex_lock的终极挑战与破解策略 一、死锁的基本概念二、pthread_mutex_lock 出现死锁的原因三、pthread_mutex_lock 出现死锁的表现四、处理pthread_mutex_lock 出现死锁的方法1. 避免死锁1.1 遵循锁的顺序原则1.2 使用定时锁1.3 使用尝试锁1.4 使用递…...

Dockerfile制作Oracle19c镜像

Dockerfile文件 cat > Dockerfile << EOF # 使用 Oracle Linux 8 作为基础镜像 FROM oraclelinux:8# 复制 Oracle 19c 安装包 COPY oracle-database-ee-19c-1.0-1.x86_64.rpm /tmp/# 安装 Oracle 19c 数据库和依赖 RUN yum localinstall -y /tmp/oracle-database-ee-…...

【时间之外】IT人求职和创业应知【23】

目录 新闻一:央行发布首个买断式逆回购交易公告 新闻二:2024CCF科技创业大赛报名截止 新闻三:BNB Chain将在迪拜主办第四届BNB孵化联盟(BIA) 认知决定你的赚钱能力。以下是今天可能影响你求职和创业的热点新闻: 今日关键字:TCL两连扳,已经跑了,我的认知就到此了 新…...

后端:Spring-1

文章目录 1. 了解 spring(Spring Framework)2. 基于maven搭建Spring框架2.1 纯xml配置方式来实现Spring2.2 注解方式来实现Spring3. Java Config类来实现Spring 2.4 总结 1. 了解 spring(Spring Framework) 传统方式构建spring(指的是Spring Framework)项目&#xff0c;导入依…...

OTX系统架构分析

OTX&#xff08;Open Test Sequence Exchange&#xff09;系统架构是一种专门为汽车行业设计的测试序列交换格式&#xff0c;它基于ISO 13209标准&#xff0c;旨在提供一种独立于测试人员的可执行测试序列描述格式。 一、OTX系统架构概述 OTX架构是一种标准化的平台和格式&am…...

ASO如何低预算进行优化

当一个产品打造出来之后&#xff0c;正式上线是从零到一的过程&#xff0c;那从一到一百的路径就是获取流量到商业变现这个环节产生的&#xff0c;之前的文章也说过&#xff0c;一个产品只有有了一定的曝光才能获得相应的搜索流量或下载流量 ASO的江湖地位&#xff1a;有数据显…...

非线性数据结构之数

一、基本概念 1. 二叉树的节点与深度 节点&#xff1a;二叉树的基本组成单位&#xff0c;每个节点包含一个数据值、一个左子节点和一个右子节点。树的深度&#xff08;Height&#xff09;&#xff1a;指树的根节点到叶子节点的最长路径所包含的边数。 2. 二叉树的类型 叶节…...

个人开发三步走

一、开发准备 1&#xff0e;需求分析&#xff1a;需求是开发的起点。第一步要做的就是明确需求&#xff0c;具体来说就是分析目标用户、他们的需求(功能需求、性能需求、安全需求)和痛点。 2&#xff0e;技术选型&#xff1a;综合开发需求、个人能力&#xff08;能熟练使用&a…...

qt QAction详解

1、概述 QAction是Qt框架中的一个抽象类&#xff0c;用于表示用户界面中的一个动作&#xff08;action&#xff09;。这些动作可以绑定到菜单项、工具栏按钮或快捷键上&#xff0c;提供了一种灵活的方式来处理用户交互。QAction不仅包含了动作的名称、图标、提示信息等属性&am…...

建立maven项目常见问题解决办法

从git拉的项目爆红 https://blog.csdn.net/wsdbld_/article/details/115380325 idea点击具体的类没有反应 https://www.likecs.com/show-204943934.html maven Could not find artifact com.** 无法下载原因分析 https://www.cnblogs.com/thinkingandworkinghard/p/100824…...

Windows 10 安装使用Docker踩过的坑和解决-31/10/2024

目录 环境版本 一、Docker Desktop双击启动没反应&#xff0c;open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified. 二、Docker Desktop运行run命令时显示错误HTTP code 500 并且错误大意是服务器拒绝访问 三、Docker Engine stopped/启动…...

微服务之间的调用关系

从数据的流向来区分有 1.直接调用&#xff08;推&#xff09;A直接B的接口直接将数据推送给B; 2.间接调用&#xff08;拉&#xff09;A先调B&#xff0c;B根据A给信息再去调A拉取数据&#xff1b; 感觉间接调用有点多此一举&#xff01;&#xff01;&#xff01; 直接调用的…...

Chinese Spelling Correction as Rephrasing Language Model(AAAI2024)

Chinese Spelling Correction as Rephrasing Language Model(AAAI2024) 一&#xff0e;概述 目前最先进的方法将CSC(Chinese Spelling Correction)作为序列标注任务&#xff0c;并在句子对上微调基于bert的方法。然而&#xff0c;我们注意到在将一个字符标注为另一个字符的过…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法

目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客&#xff1a;【写在创作纪念日】基于SpringBoot和PostG…...