詳解Java如何實現(xiàn)企業(yè)微信審批流程
最近的一個項目中,用到企業(yè)微信的審批流程,整理出來分享給大家。在企業(yè)微信中實現(xiàn)審批流程可以通過調用企業(yè)微信的開放API完成,企業(yè)微信提供了審批應用接口,用于創(chuàng)建審批模板、發(fā)起審批流程以及獲取審批實例詳情。下面 V 哥用一個Java示例代碼,來展示如何在企業(yè)微信中實現(xiàn)審批流程。
實現(xiàn)步驟
- 獲取企業(yè)微信Access Token:每次訪問企業(yè)微信API接口前需要先獲取Access Token。
- 創(chuàng)建審批模板(如已有模板則跳過此步驟)。
- 發(fā)起審批流程:通過指定的模板ID發(fā)起審批請求。
- 查詢審批結果:獲取審批的狀態(tài)和詳細信息。
以下代碼使用HttpClient發(fā)起HTTP請求來調用企業(yè)微信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 {
//下面三個常量定義,需要用你自己的(企業(yè)微信開放平臺)
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();
}
}
}
// 發(fā)起審批流程
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(); // 返回審批單編號
}
}
}
// 查詢審批流程狀態(tài)
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. 發(fā)起審批流程
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. 查詢審批狀態(tài)
Map<String, Object> approvalDetail = getApprovalDetail(accessToken, spNo);
System.out.println("審批詳情: " + approvalDetail);
} catch (IOException e) {
e.printStackTrace();
}
}
}
代碼說明
- 獲取Access Token:通過
getAccessToken方法獲取企業(yè)微信的access_token,用于后續(xù)接口調用。 - 發(fā)起審批流程:
initiateApproval方法通過oa/applyevent接口發(fā)起審批流程,傳入審批模板ID和審批表單數(shù)據(jù)(如審批人、申請數(shù)據(jù)和摘要等)。 - 查詢審批流程狀態(tài):
getApprovalDetail方法通過oa/getapprovaldetail接口查詢審批詳情,包括審批狀態(tài)和各環(huán)節(jié)的處理結果。
核心參數(shù)解釋
template_id:審批模板ID,由企業(yè)微信審批應用中創(chuàng)建。
approver:審批人信息,可以指定具體審批人或審批人角色。
apply_data:審批申請數(shù)據(jù),包含表單控件的數(shù)據(jù)內容。
summary_list:摘要信息,用于在審批列表顯示申請概要信息。
sp_no:審批單編號,用于查詢審批狀態(tài)。
注意事項
權限問題:確保調用接口的應用具有審批權限,且已配置了企業(yè)微信API調用權限。
審批模板ID:模板ID需要在企業(yè)微信管理后臺中創(chuàng)建審批模板時獲取。
審批人配置:審批人需要是企業(yè)微信用戶,并確保在審批模板中有相關配置。
到此這篇關于詳解Java如何實現(xiàn)企業(yè)微信審批流程的文章就介紹到這了,更多相關Java實現(xiàn)企業(yè)微信審批內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springBoot?@Scheduled實現(xiàn)多個任務同時開始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實現(xiàn)多個任務同時開始執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring Boot Admin 環(huán)境搭建與基本使用詳解
這篇文章主要介紹了Spring Boot Admin 環(huán)境搭建與基本使用,本文主要是對于Spring Boot Admin的基本認識和基本運用,通過本篇博客能夠對Spring Boot Admin有一個宏觀認知和能夠快速上手,需要的朋友可以參考下2023-08-08
SpringMVC處理器映射器HandlerMapping詳解
這篇文章主要介紹了SpringMVC處理器映射器HandlerMapping詳解,在SpringMVC中會有很多請求,每個請求都需要一個HandlerAdapter處理,具體接收到一個請求之后使用哪個HandlerAdapter進行處理呢,他們的過程是什么,需要的朋友可以參考下2023-09-09
使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換的實例
AbstractRoutingDataSource 是 Spring 框架提供的一個抽象類,用于實現(xiàn)動態(tài)數(shù)據(jù)源路由,這個類主要用于多數(shù)據(jù)源場景,其中可以根據(jù)不同的條件動態(tài)地切換到不同的數(shù)據(jù)源,本文給大家介紹了如何使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換,需要的朋友可以參考下2024-03-03

