动态

详情 返回 返回

Java如何實現企業微信審批流程 - 动态 详情

大家好,我是 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. 審批人配置:審批人需要是企業微信用户,並確保在審批模板中有相關配置。

最後

以上是實現企業微信中的審批流程,如何你也在開發類似的功能,希望可以幫助到你。關注威哥愛編程,編碼路上作個同行人。

user avatar littlelyon 头像 user_ze46ouik 头像 b_a_r_a_n 头像 toplist 头像 icollection 头像 _6085362b65292 头像 even_5ac21d3322069 头像
点赞 7 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.