企業(yè)微信審批流程實現(xiàn):Java調(diào)用API接口示例

2024-12-16 18:05 更新

大家好,我是 V 哥。最近的一個項目中,用到企業(yè)微信的審批流程,整理出來分享給大家。在企業(yè)微信中實現(xiàn)審批流程可以通過調(diào)用企業(yè)微信的開放API完成,企業(yè)微信提供了審批應用接口,用于創(chuàng)建審批模板、發(fā)起審批流程以及獲取審批實例詳情。下面 V 哥用一個Java示例代碼,來展示如何在企業(yè)微信中實現(xiàn)審批流程。

實現(xiàn)步驟

  1. 獲取企業(yè)微信Access Token:每次訪問企業(yè)微信API接口前需要先獲取Access Token。
  2. 創(chuàng)建審批模板(如已有模板則跳過此步驟)。
  3. 發(fā)起審批流程:通過指定的模板ID發(fā)起審批請求。
  4. 查詢審批結(jié)果:獲取審批的狀態(tài)和詳細信息。

以下代碼使用HttpClient發(fā)起HTTP請求來調(diào)用企業(yè)微信API接口。

代碼示例

  1. import org.apache.http.client.methods.CloseableHttpResponse;
  2. import org.apache.http.client.methods.HttpPost;
  3. import org.apache.http.client.methods.HttpGet;
  4. import org.apache.http.entity.StringEntity;
  5. import org.apache.http.impl.client.CloseableHttpClient;
  6. import org.apache.http.impl.client.HttpClients;
  7. import org.apache.http.util.EntityUtils;
  8. import com.fasterxml.jackson.databind.ObjectMapper;
  9. import java.io.IOException;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. public class WeChatApproval {
  13. //下面三個常量定義,需要用你自己的(企業(yè)微信開放平臺)
  14. private static final String CORP_ID = "你的corp_id";
  15. private static final String CORP_SECRET = "你的corp_secret";
  16. private static final String APPROVAL_TEMPLATE_ID = "你的template_id"; // 審批模板ID
  17. // 獲取 Access Token
  18. public static String getAccessToken() throws IOException {
  19. String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID + "&corpsecret=" + CORP_SECRET;
  20. try (CloseableHttpClient client = HttpClients.createDefault()) {
  21. HttpGet request = new HttpGet(url);
  22. try (CloseableHttpResponse response = client.execute(request)) {
  23. String responseBody = EntityUtils.toString(response.getEntity());
  24. Map<String, Object> map = new ObjectMapper().readValue(responseBody, Map.class);
  25. return map.get("access_token").toString();
  26. }
  27. }
  28. }
  29. // 發(fā)起審批流程
  30. public static String initiateApproval(String accessToken, Map<String, Object> approvalData) throws IOException {
  31. String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token=" + accessToken;
  32. try (CloseableHttpClient client = HttpClients.createDefault()) {
  33. HttpPost post = new HttpPost(url);
  34. post.setHeader("Content-Type", "application/json");
  35. Map<String, Object> requestMap = new HashMap<>();
  36. requestMap.put("template_id", APPROVAL_TEMPLATE_ID);
  37. requestMap.put("use_template_approver", 1); // 使用模板中的審批人
  38. requestMap.put("approver", approvalData.get("approver"));
  39. requestMap.put("apply_data", approvalData.get("apply_data"));
  40. requestMap.put("summary_list", approvalData.get("summary_list"));
  41. String json = new ObjectMapper().writeValueAsString(requestMap);
  42. post.setEntity(new StringEntity(json, "UTF-8"));
  43. try (CloseableHttpResponse response = client.execute(post)) {
  44. String responseBody = EntityUtils.toString(response.getEntity());
  45. Map<String, Object> map = new ObjectMapper().readValue(responseBody, Map.class);
  46. return map.get("sp_no").toString(); // 返回審批單編號
  47. }
  48. }
  49. }
  50. // 查詢審批流程狀態(tài)
  51. public static Map<String, Object> getApprovalDetail(String accessToken, String spNo) throws IOException {
  52. String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=" + accessToken;
  53. try (CloseableHttpClient client = HttpClients.createDefault()) {
  54. HttpPost post = new HttpPost(url);
  55. post.setHeader("Content-Type", "application/json");
  56. Map<String, Object> requestMap = new HashMap<>();
  57. requestMap.put("sp_no", spNo);
  58. String json = new ObjectMapper().writeValueAsString(requestMap);
  59. post.setEntity(new StringEntity(json, "UTF-8"));
  60. try (CloseableHttpResponse response = client.execute(post)) {
  61. String responseBody = EntityUtils.toString(response.getEntity());
  62. return new ObjectMapper().readValue(responseBody, Map.class);
  63. }
  64. }
  65. }
  66. public static void main(String[] args) {
  67. try {
  68. // 1. 獲取Access Token
  69. String accessToken = getAccessToken();
  70. System.out.println("Access Token: " + accessToken);
  71. // 2. 發(fā)起審批流程
  72. Map<String, Object> approvalData = new HashMap<>();
  73. approvalData.put("approver", new Object[] {
  74. Map.of("attr", 1, "userid", new String[] { "approver_userid" })
  75. });
  76. approvalData.put("apply_data", Map.of(
  77. "contents", new Object[] {
  78. Map.of("control", "Text", "id", "Text-1", "value", Map.of("text", "請假事由")),
  79. Map.of("control", "Date", "id", "Date-1", "value", Map.of("date", "2024-11-01"))
  80. }
  81. ));
  82. approvalData.put("summary_list", new Object[] {
  83. Map.of("summary_info", Map.of("text", "請假申請"))
  84. });
  85. String spNo = initiateApproval(accessToken, approvalData);
  86. System.out.println("審批單號: " + spNo);
  87. // 3. 查詢審批狀態(tài)
  88. Map<String, Object> approvalDetail = getApprovalDetail(accessToken, spNo);
  89. System.out.println("審批詳情: " + approvalDetail);
  90. } catch (IOException e) {
  91. e.printStackTrace();
  92. }
  93. }
  94. }

代碼說明

  1. 獲取Access Token:通過getAccessToken方法獲取企業(yè)微信的access_token,用于后續(xù)接口調(diào)用。
  2. 發(fā)起審批流程initiateApproval方法通過oa/applyevent接口發(fā)起審批流程,傳入審批模板ID和審批表單數(shù)據(jù)(如審批人、申請數(shù)據(jù)和摘要等)。
  3. 查詢審批流程狀態(tài)getApprovalDetail方法通過oa/getapprovaldetail接口查詢審批詳情,包括審批狀態(tài)和各環(huán)節(jié)的處理結(jié)果。

核心參數(shù)解釋

  • template_id:審批模板ID,由企業(yè)微信審批應用中創(chuàng)建。
  • approver:審批人信息,可以指定具體審批人或?qū)徟私巧?/li>
  • apply_data:審批申請數(shù)據(jù),包含表單控件的數(shù)據(jù)內(nèi)容。
  • summary_list:摘要信息,用于在審批列表顯示申請概要信息。
  • sp_no:審批單編號,用于查詢審批狀態(tài)。

注意事項

  1. 權(quán)限問題:確保調(diào)用接口的應用具有審批權(quán)限,且已配置了企業(yè)微信API調(diào)用權(quán)限。
  2. 審批模板ID:模板ID需要在企業(yè)微信管理后臺中創(chuàng)建審批模板時獲取。
  3. 審批人配置:審批人需要是企業(yè)微信用戶,并確保在審批模板中有相關(guān)配置。

最后

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號