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

简介: 大家好,我是V哥。本文分享如何在企业微信中实现审批流程,通过调用企业微信的开放API完成。主要内容包括获取Access Token、创建审批模板、发起审批流程和查询审批结果。提供了一个Java示例代码,帮助开发者快速上手。希望对你有帮助,关注V哥爱编程,编码路上同行。

大家好,我是 V 哥。最近的一个项目中,用到企业微信的审批流程,整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成,企业微信提供了审批应用接口,用于创建审批模板、发起审批流程以及获取审批实例详情。下面 V 哥用一个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 Token
    public 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 Token
            String 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. 审批人配置:审批人需要是企业微信用户,并确保在审批模板中有相关配置。

最后

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

相关文章
|
6月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
7月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
2384 1
|
7月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
388 3
|
7月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1455 0
|
7月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
878 111
|
7月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
376 8
|
7月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
854 64
|
8月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
281 0
|
8月前
|
人工智能 Cloud Native Java
Java 技术栈企业级应用开发全流程
本指南通过构建企业级电商系统,全面解析现代化Java技术栈实战应用。涵盖Spring Boot 3、微服务架构、云原生部署、服务治理、监控可观测性及AI集成,助开发者掌握全流程开发技能,打造高效可扩展的企业级应用。
509 0
Java 技术栈企业级应用开发全流程
|
8月前
|
消息中间件 监控 Java
借助最新技术构建 Java 邮件发送功能的详细流程与核心要点分享 Java 邮件发送功能
本文介绍了如何使用Spring Boot 3、Jakarta Mail、MailHog及响应式编程技术构建高效的Java邮件发送系统,涵盖环境搭建、异步发送、模板渲染、测试与生产配置,以及性能优化方案,助你实现现代化邮件功能。
461 0

热门文章

最新文章