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