写点什么

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

作者:威哥爱编程
  • 2024-11-01
    北京
  • 本文字数:3832 字

    阅读完需:约 13 分钟

大家好,我是 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. 审批人配置:审批人需要是企业微信用户,并确保在审批模板中有相关配置。

最后

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

发布于: 刚刚阅读数: 5
用户头像

华为 HDE、CSDN 博客专家、Java畅销书作者 2018-05-30 加入

全栈领域优质创作者(Java/HarmonyOS/AI),公众号:威哥爱编程

评论

发布
暂无评论
Java如何实现企业微信审批流程_Java_威哥爱编程_InfoQ写作社区