当前位置: 首页 > 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;我们注意到在将一个字符标注为另一个字符的过…...

从零开始:Java使用通用物体识别-ResNet18镜像实现图像分类

从零开始&#xff1a;Java使用通用物体识别-ResNet18镜像实现图像分类 你是否想过&#xff0c;用Java写几行代码&#xff0c;就能让程序看懂一张图片里有什么&#xff1f;过去&#xff0c;这可能需要搭建复杂的Python环境、学习深度学习框架、处理繁琐的模型部署。但现在&…...

告别NMS!用RT-DETR在1080Ti上跑出108FPS的实时目标检测(保姆级部署教程)

在1080Ti上实现108FPS的RT-DETR实时目标检测实战指南 当目标检测遇上Transformer架构&#xff0c;一场关于速度与精度的革命正在悄然发生。RT-DETR作为DETR家族的最新成员&#xff0c;不仅继承了端到端集合预测的基因&#xff0c;更通过一系列创新设计突破了实时检测的瓶颈。本…...

万兴剧厂AI漫剧APP2025推荐,打造个性化漫剧体验

万兴剧厂AI漫剧APP2025推荐&#xff0c;打造个性化漫剧体验在当今数字化娱乐的浪潮中&#xff0c;漫剧以其独特的表现形式和丰富的内容吸引了众多用户。据《2025中国数字娱乐行业发展报告》显示&#xff0c;2025年漫剧市场规模持续增长&#xff0c;用户对于优质漫剧的需求也日益…...

微信公众号模板消息推送实战:从配置到代码实现(PHP版)

微信公众号模板消息推送实战&#xff1a;PHP开发全流程指南 在移动互联网时代&#xff0c;微信公众号已成为企业与用户沟通的重要桥梁。模板消息作为微信生态中的关键功能&#xff0c;能够实现精准、高效的信息触达。本文将带领PHP开发者从零开始&#xff0c;完整掌握模板消息推…...

Ostrakon-VL-8B惊艳效果:同一界面内对比原始图/热力图/标注图三视图

Ostrakon-VL-8B惊艳效果&#xff1a;同一界面内对比原始图/热力图/标注图三视图 1. 像素特工终端&#xff1a;重新定义零售视觉分析 想象一下&#xff0c;当你走进一家零售店铺&#xff0c;能瞬间"扫描"出所有商品的位置、价格标签和货架状态。这正是Ostrakon-VL-8…...

基于SpringBoot + Vue的养老院管理系统(角色:家属、护工、管理员)

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…...

Win11更新后Wifi图标消失?别急着重装系统,先试试这个官方驱动修复法

Win11更新后Wifi图标消失&#xff1f;三步精准定位官方驱动修复方案 刚更新完Windows 11系统&#xff0c;正准备继续手头的工作&#xff0c;突然发现任务栏右下角的Wifi图标不翼而飞。尝试重启电脑、重置网络设置&#xff0c;甚至检查了各种服务状态&#xff0c;问题依旧存在。…...

Video2X:用AI魔法将低分辨率视频变成4K超清大片的终极指南

Video2X&#xff1a;用AI魔法将低分辨率视频变成4K超清大片的终极指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…...

学习神经网络

一、神经网络概述&#xff1a;人工智能的核心基石&#xff08;一&#xff09;神经网络的定义与起源神经网络&#xff0c;全称为人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff0c;是一种模仿生物神经网络&#xff08;动物大脑神经元网…...

AIGlasses OS Pro 智能视觉系统Python入门实战:3步完成环境部署与基础调用

AIGlasses OS Pro 智能视觉系统Python入门实战&#xff1a;3步完成环境部署与基础调用 你是不是也对那些能“看懂”世界的智能眼镜感到好奇&#xff1f;想自己动手写几行代码&#xff0c;让程序也能识别物体、分析场景&#xff0c;却不知道从何开始&#xff1f;别担心&#xf…...