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

 更新时间:2024年11月01日 11:44:05   作者:威哥爱编程  
这篇文章主要使用了一个Java示例代码,来向大家展示如何在企业微信中实现审批流程,文中的示例代码简洁易懂,有需要的小伙伴可以参考下

最近的一个项目中,用到企业微信的审批流程,整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成,企业微信提供了审批应用接口,用于创建审批模板、发起审批流程以及获取审批实例详情。下面 V 哥用一个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 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();
        }
    }
}

代码说明

  • 获取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如何实现企业微信审批流程的文章就介绍到这了,更多相关Java实现企业微信审批内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springBoot @Scheduled实现多个任务同时开始执行

    springBoot @Scheduled实现多个任务同时开始执行

    这篇文章主要介绍了springBoot @Scheduled实现多个任务同时开始执行,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring Boot Admin 环境搭建与基本使用详解

    Spring Boot Admin 环境搭建与基本使用详解

    这篇文章主要介绍了Spring Boot Admin 环境搭建与基本使用,本文主要是对于Spring Boot Admin的基本认识和基本运用,通过本篇博客能够对Spring Boot Admin有一个宏观认知和能够快速上手,需要的朋友可以参考下
    2023-08-08
  • Java计算两个程序运行时间的实例

    Java计算两个程序运行时间的实例

    下面小编就为大家带来一篇Java计算两个程序运行时间的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 详解SpringCloud服务认证(JWT)

    详解SpringCloud服务认证(JWT)

    本篇文章主要介绍了SpringCloud服务认证(JWT),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Spring boot项目部署到云服务器小白教程详解

    Spring boot项目部署到云服务器小白教程详解

    这篇文章主要介绍了Spring boot项目部署到云服务器小白教程详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • JAVA字符串反转的三种方法

    JAVA字符串反转的三种方法

    这篇文章主要介绍了JAVA字符串反转的三种方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • SpringMVC处理器映射器HandlerMapping详解

    SpringMVC处理器映射器HandlerMapping详解

    这篇文章主要介绍了SpringMVC处理器映射器HandlerMapping详解,在SpringMVC中会有很多请求,每个请求都需要一个HandlerAdapter处理,具体接收到一个请求之后使用哪个HandlerAdapter进行处理呢,他们的过程是什么,需要的朋友可以参考下
    2023-09-09
  • 使用AbstractRoutingDataSource实现数据源动态切换的实例

    使用AbstractRoutingDataSource实现数据源动态切换的实例

    AbstractRoutingDataSource 是 Spring 框架提供的一个抽象类,用于实现动态数据源路由,这个类主要用于多数据源场景,其中可以根据不同的条件动态地切换到不同的数据源,本文给大家介绍了如何使用AbstractRoutingDataSource实现数据源动态切换,需要的朋友可以参考下
    2024-03-03
  • Java之Mybatis多层嵌套查询方式

    Java之Mybatis多层嵌套查询方式

    这篇文章主要介绍了Java之Mybatis多层嵌套查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java forEach对原数组的操作过程

    Java forEach对原数组的操作过程

    forEach对于基本数据类型,是直接赋值,对于引用数据类型,是引用地址值,forEach遍历时,是创建的临时变量,引用的数据地址,本文给大家介绍Java forEach对原数组的操作过程,感兴趣的朋友一起看看吧
    2024-02-02

最新评论