Java如何实现企业微信审批流程
大家好,我是 V 哥。最近的一个项目中,用到企业微信的审批流程,整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成,企业微信提供了审批应用接口,用于创建审批模板、发起审批流程以及获取审批实例详情。下面 V 哥用一个Java示例代码,来展示如何在企业微信中实现审批流程。
V 哥推荐:2024 最适合入门的 JAVA 课程
实现步骤
- 获取企业微信Access Token:每次访问企业微信API接口前需要先获取Access Token。
- 创建审批模板(如已有模板则跳过此步骤)。
- 发起审批流程:通过指定的模板ID发起审批请求。
- 查询审批结果:获取审批的状态和详细信息。
以下代码使用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();}}
}
代码说明
- 获取Access Token:通过
getAccessToken方法获取企业微信的access_token,用于后续接口调用。 - 发起审批流程:
initiateApproval方法通过oa/applyevent接口发起审批流程,传入审批模板ID和审批表单数据(如审批人、申请数据和摘要等)。 - 查询审批流程状态:
getApprovalDetail方法通过oa/getapprovaldetail接口查询审批详情,包括审批状态和各环节的处理结果。
核心参数解释
template_id:审批模板ID,由企业微信审批应用中创建。approver:审批人信息,可以指定具体审批人或审批人角色。apply_data:审批申请数据,包含表单控件的数据内容。summary_list:摘要信息,用于在审批列表显示申请概要信息。sp_no:审批单编号,用于查询审批状态。
注意事项
- 权限问题:确保调用接口的应用具有审批权限,且已配置了企业微信API调用权限。
- 审批模板ID:模板ID需要在企业微信管理后台中创建审批模板时获取。
- 审批人配置:审批人需要是企业微信用户,并确保在审批模板中有相关配置。
最后
以上是实现企业微信中的审批流程,如何你也在开发类似的功能,希望可以帮助到你。关注威哥爱编程,编码路上作个同行人。
相关文章:
Java如何实现企业微信审批流程
大家好,我是 V 哥。最近的一个项目中,用到企业微信的审批流程,整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成,企业微信提供了审批应用接口,用于创建审批模板、发起审批流程以及获取…...
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 ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 / 开头),请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下: 一个点 . 表示当前目录本身。此外,两个点 ..…...
nodejs入门教程4:nodejs创建第一个应用
1. 安装 Node.js 首先,确保你的计算机上已经安装了 Node.js。如果还没有安装,可以从官方网站(https://nodejs.org)下载并安装最新的 LTS 版本。安装完成后,你可以在命令行或终端中运行以下命令来验证安装:…...
启用 iPhone 原生的五笔输入
聊聊如何在 iOS 中使用原生的五笔输入法 本文虽然介绍的是如何添加五笔键盘,其实其他键盘(双拼,外语键盘、第三方输入法)也是类似的添加方式。 使用原生的理由 虽然之前的文章列了不少第三方的五笔输入法,但其实…...
这个工具让你轻松开发一个带AI功能的Notion
这个工具让你轻松开发一个带AI功能的Notion Plate 是一款由 AI 加持的富文本编辑器,旨在帮助开发者创建功能强大的 WYSIWYG 文本编辑工具。本文将介绍 Plate 的基本信息、特点、以及如何快速上手使用。 软件简介 Plate 由 udecode 开发,基于 React 和 S…...
光耦合器的关键作用和创新---腾恩科技
光耦合器或光隔离器已成为电路中必不可少的器件,它允许信号在无需直接电接触的情况下跨不同电压域传输。这种隔离能力对于保护低压元件免受高压电路的潜在损坏至关重要。本文将仔细研究光耦合器在当今技术中发挥的独特作用,并探讨其在各种应用中不断扩展…...
穿越死锁的迷雾: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)项目,导入依…...
OTX系统架构分析
OTX(Open Test Sequence Exchange)系统架构是一种专门为汽车行业设计的测试序列交换格式,它基于ISO 13209标准,旨在提供一种独立于测试人员的可执行测试序列描述格式。 一、OTX系统架构概述 OTX架构是一种标准化的平台和格式&am…...
ASO如何低预算进行优化
当一个产品打造出来之后,正式上线是从零到一的过程,那从一到一百的路径就是获取流量到商业变现这个环节产生的,之前的文章也说过,一个产品只有有了一定的曝光才能获得相应的搜索流量或下载流量 ASO的江湖地位:有数据显…...
非线性数据结构之数
一、基本概念 1. 二叉树的节点与深度 节点:二叉树的基本组成单位,每个节点包含一个数据值、一个左子节点和一个右子节点。树的深度(Height):指树的根节点到叶子节点的最长路径所包含的边数。 2. 二叉树的类型 叶节…...
个人开发三步走
一、开发准备 1.需求分析:需求是开发的起点。第一步要做的就是明确需求,具体来说就是分析目标用户、他们的需求(功能需求、性能需求、安全需求)和痛点。 2.技术选型:综合开发需求、个人能力(能熟练使用&a…...
qt QAction详解
1、概述 QAction是Qt框架中的一个抽象类,用于表示用户界面中的一个动作(action)。这些动作可以绑定到菜单项、工具栏按钮或快捷键上,提供了一种灵活的方式来处理用户交互。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双击启动没反应,open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified. 二、Docker Desktop运行run命令时显示错误HTTP code 500 并且错误大意是服务器拒绝访问 三、Docker Engine stopped/启动…...
微服务之间的调用关系
从数据的流向来区分有 1.直接调用(推)A直接B的接口直接将数据推送给B; 2.间接调用(拉)A先调B,B根据A给信息再去调A拉取数据; 感觉间接调用有点多此一举!!! 直接调用的…...
Chinese Spelling Correction as Rephrasing Language Model(AAAI2024)
Chinese Spelling Correction as Rephrasing Language Model(AAAI2024) 一.概述 目前最先进的方法将CSC(Chinese Spelling Correction)作为序列标注任务,并在句子对上微调基于bert的方法。然而,我们注意到在将一个字符标注为另一个字符的过…...
2026四大主流收银系统深度横评:商拓、柚子、商琦云与银阁仕实战对比
在零售和餐饮行业数字化转型的浪潮中,收银系统早已超越了简单的“算账工具”范畴,成为了门店运营的中枢神经。很多店主在选型时容易陷入一个误区:只盯着硬件价格或者界面好不好看,却忽略了系统在高峰期的稳定性、数据链路的打通能…...
动态扩散Transformer(DyDiT++)技术解析与优化
1. 动态扩散Transformer(DyDiT)技术解析在视觉生成领域,扩散模型(Diffusion Models)已成为当前最主流的生成技术之一。这类模型通过逐步去噪的过程,能够合成高质量的图像和视频内容。然而,随着模…...
终极指南:如何用FanControl彻底解决Windows电脑风扇噪音与散热问题
终极指南:如何用FanControl彻底解决Windows电脑风扇噪音与散热问题 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub…...
在OpenClaw项目中接入Taotoken实现多模型Agent工作流
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在OpenClaw项目中接入Taotoken实现多模型Agent工作流 对于使用OpenClaw框架构建智能体工作流的开发者而言,如何稳定、灵…...
别再为测试视频发愁了!手把手教你用FFmpeg生成YUV/RGB原始数据(附播放命令)
音视频开发实战:FFmpeg高效生成与播放YUV/RGB测试素材指南 在音视频编解码器开发、计算机视觉算法测试或多媒体性能调优过程中,开发者经常面临一个共同难题:如何快速获取特定像素格式的原始视频数据作为测试素材?网上现成的YUV或R…...
MFC老树开新花:手把手教你用CMake配置动态/静态链接库并解决中文编码问题
MFC老树开新花:手把手教你用CMake配置动态/静态链接库并解决中文编码问题 在Windows桌面开发领域,MFC(Microsoft Foundation Classes)作为微软经典的C框架,虽然常被调侃为"老古董",但在维护遗留系…...
Windows 环境 OpenClaw 部署详解|从安装到使用全流程
OpenClaw(小龙虾)Windows 一键部署教程|10 分钟搭建自动化数字员工 前言 OpenClaw(俗称小龙虾)是 2026 年热门的开源 AI 智能体,GitHub 星标突破 28 万,主打本地运行、低门槛、自动化执行。本…...
保姆级教程:手把手教你用Amlogic刷机工具给中兴B863AV3.2T盒子刷当贝桌面(附短接神器使用心得)
中兴B863AV3.2T盒子刷机全流程实战指南:从拆机到当贝桌面的完美蜕变 第一次接触电视盒子刷机时,那种既兴奋又忐忑的心情我至今记忆犹新。手里拿着价值不过百元的中兴B863AV3.2T盒子,却像捧着一个未知的宝藏——既期待通过刷机解锁它的全部潜能…...
[笔记] 系统分析师 目录
文章目录系统分析师 第一章 绪论系统分析师 第二章 经济管理与应用数学系统分析师 第三章 操作系统基本原理系统分析师 第四章 数据通信与计算机网络系统分析师 第五章 数据库系统系统分析师 第六章 系统配置与性能评价系统分析师 第七章 企业信息化系统分析师 第八章 软件工程…...
我用豆包写的论文 AI 率为什么 95%?这款工具一次降到 4% 万方检测合格
我用豆包写的论文 AI 率为什么 95%?这款工具一次降到 4% 万方检测合格 去年我用豆包写了 1 万字的生物学本科论文——自己读着挺顺、像人写的。送学校万方 AIGC 检测——AI 率 95.7%,学校卡的是 30%。我整个人懵了。 这篇文章我把当时的实测过程写下来—…...
