一、本節要點
1.獲取通訊錄密鑰
獲取方式:
登錄企業微信—>管理工具—>通訊錄同步助手—>開啟“API接口同步” ; 開啟后,即可看到通訊錄密鑰,也可設置通訊錄API的權限:讀取或者編輯通訊錄。
獲取通訊錄密鑰的目的:
通過企業ID(CorpId)和 通訊錄密鑰可以獲取通訊錄相關接口的使用憑證(AccessToken)。有了AccessToken,就可以使用通訊錄相關接口了。
憑證的獲取方式有兩種(此處暫時存疑,以待勘誤):
通訊錄AccessToken:CorpId+通訊錄密鑰
其他AccessToken:CorpId+應用密鑰
2.json序列化
2.1序列化和反序列化的概念
把對象轉換為字節序列的過程稱為對象的序列化。
把字節序列恢復為對象的過程稱為對象的反序列化。
2.2對象的序列化的目的
1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中;
2) 在網絡上傳送對象的字節序列。
2.3java序列化方式
(1)java原生序列化
(2)json序列化
而json序列化可使用 ① json-lib
②fastJson
③gson
2.4json序列化與反序列化
這里我們采用gson來實現java對象的序列化,需要引入 gson-2.7.jar 包。
(1)簡單的Jason
{ "userid": "zhangsan", "name": "張三", "english_name": "jackzhang" }
使用gson.toJson(user)即可將user對象順序轉成json字符串,如下
Gson gson = new Gson(); String jsonU1 =gson.toJson(user);
(2)帶數組的json
將department設為list<Integer>類型即可
{ "userid": "zhangsan", "name": "張三", "english_name": "jackzhang" "department": [1, 2], }
(3)包含子對象的json
以下代碼為文本消息的json字符串,將text屬性類型設為Text,Text類中包含content屬性。然后使用 gson.toJson(user)
{ "msgtype" : "text", "agentid" : 1, "text" : { "content" : "你的快遞已到,請攜帶工卡前往郵件中心領取。\n出發前可查看<a href=\"http://work.weixin.qq.com\">郵件中心視頻實況</a>,聰明避開排隊。" }, }
關於Json序列化,讀者在 Java企業微信開發_05_消息推送之發送消息 這一節會有更深刻的理解,這一周將會繼續總結。
3.企業微信開發思路
企業微信的開發大體可分為以下幾步:
(1)封裝實體類
參考官方文檔給出的請求包、回包(即響應包),封裝對應的java實體類。
(2)java對象的序列化
將java對象序列化為json格式的字符串
(3)獲取AccessToken,拼接請求接口url
(4)調用接口發送http請求
封裝好http請求方法:httpRequest(請求url, 請求方法POST/GET, 請求包);

1 /** 2 * 1.發起https請求並獲取結果 3 * 4 * @param requestUrl 請求地址 5 * @param requestMethod 請求方式(GET、POST) 6 * @param outputStr 提交的數據 7 * @return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值) 8 */ 9 public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { 10 JSONObject jsonObject = null; 11 StringBuffer buffer = new StringBuffer(); 12 try { 13 // 創建SSLContext對象,並使用我們指定的信任管理器初始化 14 TrustManager[] tm = { new MyX509TrustManager() }; 15 SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); 16 sslContext.init(null, tm, new java.security.SecureRandom()); 17 // 從上述SSLContext對象中得到SSLSocketFactory對象 18 SSLSocketFactory ssf = sslContext.getSocketFactory(); 19 20 URL url = new URL(requestUrl); 21 HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); 22 httpUrlConn.setSSLSocketFactory(ssf); 23 24 httpUrlConn.setDoOutput(true); 25 httpUrlConn.setDoInput(true); 26 httpUrlConn.setUseCaches(false); 27 // 設置請求方式(GET/POST) 28 httpUrlConn.setRequestMethod(requestMethod); 29 30 if ("GET".equalsIgnoreCase(requestMethod)) 31 httpUrlConn.connect(); 32 33 // 當有數據需要提交時 34 if (null != outputStr) { 35 OutputStream outputStream = httpUrlConn.getOutputStream(); 36 // 注意編碼格式,防止中文亂碼 37 outputStream.write(outputStr.getBytes("UTF-8")); 38 outputStream.close(); 39 } 40 41 // 將返回的輸入流轉換成字符串 42 InputStream inputStream = httpUrlConn.getInputStream(); 43 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 44 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 45 46 String str = null; 47 while ((str = bufferedReader.readLine()) != null) { 48 buffer.append(str); 49 } 50 bufferedReader.close(); 51 inputStreamReader.close(); 52 // 釋放資源 53 inputStream.close(); 54 inputStream = null; 55 httpUrlConn.disconnect(); 56 jsonObject = JSONObject.fromObject(buffer.toString()); 57 } catch (ConnectException ce) { 58 log.error("Weixin server connection timed out."); 59 } catch (Exception e) { 60 log.error("https request error:{}", e); 61 } 62 return jsonObject; 63 }
二、代碼實現
相關jar包:
2.1 工具類之微信參數封裝類——WeiXinParamesUtil.java
此類封裝了微信的相關參數,如企業id、應用憑證、通訊錄憑證等。封裝起來更易維護,實現一處修改多處改變。

1 package com.ray.util; 2 /** 3 * 微信參數 4 * @author shirayner 5 * 6 */ 7 public class WeiXinParamesUtil { 8 //1.微信參數 9 //token 10 public final static String token = "ray"; 11 // encodingAESKey 12 public final static String encodingAESKey = "z2W9lyOAR1XjY8mopEmiSqib0TlBZzCFiCLp6IdS2Iv"; 13 //企業ID 14 public final static String corpId = "ww92f5da92bb24696e"; 15 16 //應用的憑證密鑰 17 public final static String agentSecret = "I73733veH3uCs6H_ijPvIq0skjTaOePsFF4MyCEi3Ag"; 18 //通訊錄秘鑰 19 public final static String contactsSecret = "1m_9XP62YrXjSiYtL5ThbexiLVWBThukiK5sH7wm1TM"; 20 21 //企業應用的id,整型。可在應用的設置頁面查看 22 public final static int agentId = 1000002; 23 24 }
2.2 工具類之微信輔助類——WeiXinUtil.java
此類封裝了http請求、https請求、獲取accessToken的方法

1 package com.ray.util; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.net.ConnectException; 8 import java.net.HttpURLConnection; 9 import java.net.URL; 10 import javax.net.ssl.HttpsURLConnection; 11 import javax.net.ssl.SSLContext; 12 import javax.net.ssl.SSLSocketFactory; 13 import javax.net.ssl.TrustManager; 14 import org.slf4j.Logger; 15 import org.slf4j.LoggerFactory; 16 import com.ray.pojo.AccessToken; 17 import net.sf.json.JSONException; 18 import net.sf.json.JSONObject; 19 20 public class WeiXinUtil { 21 22 private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class); 23 //微信的請求url 24 //獲取access_token的接口地址(GET) 限200(次/天) 25 public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}"; 26 27 28 29 /** 30 * 1.發起https請求並獲取結果 31 * 32 * @param requestUrl 請求地址 33 * @param requestMethod 請求方式(GET、POST) 34 * @param outputStr 提交的數據 35 * @return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值) 36 */ 37 public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { 38 JSONObject jsonObject = null; 39 StringBuffer buffer = new StringBuffer(); 40 try { 41 // 創建SSLContext對象,並使用我們指定的信任管理器初始化 42 TrustManager[] tm = { new MyX509TrustManager() }; 43 SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); 44 sslContext.init(null, tm, new java.security.SecureRandom()); 45 // 從上述SSLContext對象中得到SSLSocketFactory對象 46 SSLSocketFactory ssf = sslContext.getSocketFactory(); 47 48 URL url = new URL(requestUrl); 49 HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); 50 httpUrlConn.setSSLSocketFactory(ssf); 51 52 httpUrlConn.setDoOutput(true); 53 httpUrlConn.setDoInput(true); 54 httpUrlConn.setUseCaches(false); 55 // 設置請求方式(GET/POST) 56 httpUrlConn.setRequestMethod(requestMethod); 57 58 if ("GET".equalsIgnoreCase(requestMethod)) 59 httpUrlConn.connect(); 60 61 // 當有數據需要提交時 62 if (null != outputStr) { 63 OutputStream outputStream = httpUrlConn.getOutputStream(); 64 // 注意編碼格式,防止中文亂碼 65 outputStream.write(outputStr.getBytes("UTF-8")); 66 outputStream.close(); 67 } 68 69 // 將返回的輸入流轉換成字符串 70 InputStream inputStream = httpUrlConn.getInputStream(); 71 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 72 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 73 74 String str = null; 75 while ((str = bufferedReader.readLine()) != null) { 76 buffer.append(str); 77 } 78 bufferedReader.close(); 79 inputStreamReader.close(); 80 // 釋放資源 81 inputStream.close(); 82 inputStream = null; 83 httpUrlConn.disconnect(); 84 jsonObject = JSONObject.fromObject(buffer.toString()); 85 } catch (ConnectException ce) { 86 log.error("Weixin server connection timed out."); 87 } catch (Exception e) { 88 log.error("https request error:{}", e); 89 } 90 return jsonObject; 91 } 92 93 /** 94 * 2.發起http請求獲取返回結果 95 * 96 * @param requestUrl 請求地址 97 * @return 98 */ 99 public static String httpRequest(String requestUrl) { 100 StringBuffer buffer = new StringBuffer(); 101 try { 102 URL url = new URL(requestUrl); 103 HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); 104 105 httpUrlConn.setDoOutput(false); 106 httpUrlConn.setDoInput(true); 107 httpUrlConn.setUseCaches(false); 108 109 httpUrlConn.setRequestMethod("GET"); 110 httpUrlConn.connect(); 111 112 // 將返回的輸入流轉換成字符串 113 InputStream inputStream = httpUrlConn.getInputStream(); 114 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 115 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 116 117 String str = null; 118 while ((str = bufferedReader.readLine()) != null) { 119 buffer.append(str); 120 } 121 bufferedReader.close(); 122 inputStreamReader.close(); 123 // 釋放資源 124 inputStream.close(); 125 inputStream = null; 126 httpUrlConn.disconnect(); 127 128 } catch (Exception e) { 129 } 130 return buffer.toString(); 131 } 132 133 134 /** 135 * 3.獲取access_token 136 * 137 * @param appid 憑證 138 * @param appsecret 密鑰 139 * @return 140 */ 141 public static AccessToken getAccessToken(String appid, String appsecret) { 142 AccessToken accessToken = null; 143 144 String requestUrl = access_token_url.replace("{corpId}", appid).replace("{corpsecret}", appsecret); 145 JSONObject jsonObject = httpRequest(requestUrl, "GET", null); 146 // 如果請求成功 147 if (null != jsonObject) { 148 try { 149 accessToken = new AccessToken(); 150 accessToken.setToken(jsonObject.getString("access_token")); 151 accessToken.setExpiresIn(jsonObject.getInt("expires_in")); 152 } catch (JSONException e) { 153 accessToken = null; 154 // 獲取token失敗 155 log.error("獲取token失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 156 } 157 } 158 return accessToken; 159 } 160 161 162 }
發送https請求需要一個證書信任管理器,所以此類依賴於MyX509TrustManager.java

1 package com.ray.util; 2 3 import java.security.cert.CertificateException; 4 import java.security.cert.X509Certificate; 5 6 import javax.net.ssl.X509TrustManager; 7 8 /** 9 * 證書信任管理器(用於https請求) 10 * 11 * @author liufeng 12 * @date 2013-08-08 13 */ 14 public class MyX509TrustManager implements X509TrustManager { 15 16 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 17 } 18 19 public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 20 } 21 22 public X509Certificate[] getAcceptedIssuers() { 23 return null; 24 } 25 }
2.3 實體類之憑證封裝類——AccessToken.java

1 package com.ray.pojo; 2 3 /** 4 * @desc : 微信通用接口憑證 5 * 6 * @author: shirayner 7 * @date : 2017-8-20 下午9:35:11 8 */ 9 public class AccessToken { 10 // 獲取到的憑證 11 private String token; 12 // 憑證有效時間,單位:秒 13 private int expiresIn; 14 15 public String getToken() { 16 return token; 17 } 18 19 public void setToken(String token) { 20 this.token = token; 21 } 22 23 public int getExpiresIn() { 24 return expiresIn; 25 } 26 27 public void setExpiresIn(int expiresIn) { 28 this.expiresIn = expiresIn; 29 } 30 }
2.4 實體類之用戶類——User.java
注:這兩個實體類只添加了User的部分屬性,如有需要,讀者可根據官方文檔自行添加相關屬性。

1 package com.ray.pojo; 2 3 public class User { 4 private String userid; 5 private String name; 6 private int department; 7 private String mobile; 8 private String email; 9 private String position; 10 private String gender; 11 12 public User(){}; 13 public User(String userid, String name, int department, String mobile, 14 String email, String position, String gender) { 15 super(); 16 this.userid = userid; 17 this.name = name; 18 this.department = department; 19 this.mobile = mobile; 20 this.email = email; 21 this.position = position; 22 this.gender = gender; 23 } 24 public String getUserid() { 25 return userid; 26 } 27 public void setUserid(String userid) { 28 this.userid = userid; 29 } 30 public String getName() { 31 return name; 32 } 33 public void setName(String name) { 34 this.name = name; 35 } 36 37 public int getDepartment() { 38 return department; 39 } 40 public void setDepartment(int department) { 41 this.department = department; 42 } 43 public String getMobile() { 44 return mobile; 45 } 46 public void setMobile(String mobile) { 47 this.mobile = mobile; 48 } 49 public String getEmail() { 50 return email; 51 } 52 public void setEmail(String email) { 53 this.email = email; 54 } 55 public String getPosition() { 56 return position; 57 } 58 public void setPosition(String position) { 59 this.position = position; 60 } 61 public String getGender() { 62 return gender; 63 } 64 public void setGender(String gender) { 65 this.gender = gender; 66 } 67 @Override 68 public String toString() { 69 return "User [userid=" + userid + ", name=" + name + ", department=" 70 + department + ", mobile=" + mobile + ", email=" + email 71 + ", position=" + position + ", gender=" + gender + "]"; 72 } 73 74 public String toJson(){ 75 String str="{\"userid\": %s,\"name\": %s,\"department\": [1],\"mobile\": %s,\"email\": %s,\"gender\": %s}"; 76 77 return String.format(str,this.userid,this.name,this.mobile,this.email,this.gender); 78 } 79 80 81 }
2.5 實體類之部門類——Department.java

1 package com.ray.pojo; 2 3 public class Department { 4 private int id ; 5 private String name; 6 private int parentid; 7 private int order; 8 9 10 11 public Department(int id, String name, int parentid) { 12 super(); 13 this.id = id; 14 this.name = name; 15 this.parentid = parentid; 16 } 17 public int getId() { 18 return id; 19 } 20 public void setId(int id) { 21 this.id = id; 22 } 23 public String getName() { 24 return name; 25 } 26 public void setName(String name) { 27 this.name = name; 28 } 29 public int getParentid() { 30 return parentid; 31 } 32 public void setParentid(int parentid) { 33 this.parentid = parentid; 34 } 35 public int getOrder() { 36 return order; 37 } 38 public void setOrder(int order) { 39 this.order = order; 40 } 41 42 43 }
2.6 業務類之通訊錄用戶業務類——Contacts_UserService

1 package com.ray.service; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 7 import net.sf.json.JSONObject; 8 9 import org.slf4j.Logger; 10 import org.slf4j.LoggerFactory; 11 12 import com.google.gson.Gson; 13 import com.ray.pojo.User; 14 import com.ray.test.UserTest; 15 import com.ray.util.WeiXinUtil; 16 17 public class Contacts_UserService { 18 private static Logger log = LoggerFactory.getLogger(UserTest.class); 19 20 private static String createUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=ACCESS_TOKEN"; 21 private static String getUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=USERID"; 22 private static String updateUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=ACCESS_TOKEN"; 23 private static String deleteUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/delete?access_token=ACCESS_TOKEN&userid=USERID"; 24 private static String batchdeleteUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/batchdelete?access_token=ACCESS_TOKEN"; 25 private static String getDepartmentUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD"; 26 private static String getDepartmentUserDetails_url="https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD"; 27 28 29 //1.創建成員 30 public void createUser(String accessToken,User user) { 31 32 //1.獲取json字符串:將user對象轉換為json字符串 33 Gson gson = new Gson(); 34 String jsonU1 =gson.toJson(user); //使用gson.toJson(user)即可將user對象順序轉成json 35 System.out.println("jsonU1:"+jsonU1); 36 37 38 //2.獲取請求的url 39 createUser_url=createUser_url.replace("ACCESS_TOKEN", accessToken); 40 41 //3.調用接口,發送請求,創建成員 42 JSONObject jsonObject = WeiXinUtil.httpRequest(createUser_url, "POST", jsonU1); 43 System.out.println("jsonObject:"+jsonObject.toString()); 44 45 //4.錯誤消息處理 46 if (null != jsonObject) { 47 if (0 != jsonObject.getInt("errcode")) { 48 log.error("創建成員失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 49 } 50 } 51 } 52 53 //2.獲取成員 54 public void getUser(String accessToken,String userId) { 55 56 //1.獲取請求的url 57 getUser_url=getUser_url.replace("ACCESS_TOKEN", accessToken) 58 .replace("USERID", userId); 59 60 //2.調用接口,發送請求,獲取成員 61 JSONObject jsonObject = WeiXinUtil.httpRequest(getUser_url, "GET", null); 62 System.out.println("jsonObject:"+jsonObject.toString()); 63 64 //3.錯誤消息處理 65 if (null != jsonObject) { 66 if (0 != jsonObject.getInt("errcode")) { 67 log.error("獲取成員失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 68 } 69 } 70 } 71 72 //3.更新成員 73 public void updateUser(String accessToken,User user) { 74 75 //1.獲取json字符串:將user對象轉換為json字符串 76 Gson gson = new Gson(); 77 String jsonU1 =gson.toJson(user); //使用gson.toJson(user)即可將user對象順序轉成json 78 System.out.println("jsonU1:"+jsonU1); 79 80 81 //2.獲取請求的url 82 updateUser_url=updateUser_url.replace("ACCESS_TOKEN", accessToken); 83 84 //3.調用接口,發送請求,創建成員 85 JSONObject jsonObject = WeiXinUtil.httpRequest(updateUser_url, "POST", jsonU1); 86 System.out.println("jsonObject:"+jsonObject.toString()); 87 88 //4.錯誤消息處理 89 if (null != jsonObject) { 90 if (0 != jsonObject.getInt("errcode")) { 91 log.error("更新成員失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 92 } 93 } 94 } 95 96 //4.刪除成員 97 public void deleteUser(String accessToken,String userId) { 98 99 //1.獲取請求的url 100 deleteUser_url=deleteUser_url.replace("ACCESS_TOKEN", accessToken) 101 .replace("USERID", userId); 102 103 //2.調用接口,發送請求,刪除成員 104 JSONObject jsonObject = WeiXinUtil.httpRequest(deleteUser_url, "GET", null); 105 System.out.println("jsonObject:"+jsonObject.toString()); 106 107 //3.錯誤消息處理 108 if (null != jsonObject) { 109 if (0 != jsonObject.getInt("errcode")) { 110 log.error("刪除成員失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 111 } 112 } 113 } 114 115 //5.批量刪除成員 116 public void batchdeleteUser(String accessToken,List<String> userIdList){ 117 //1.獲取json字符串:將user對象轉換為json字符串 118 Map<String, Object> content = new HashMap<String, Object>(); 119 content.put("useridlist", userIdList); 120 121 Gson gson=new Gson(); 122 String useridlist=gson.toJson(content); 123 System.out.println(useridlist); 124 125 //2.獲取請求的url 126 batchdeleteUser_url=batchdeleteUser_url.replace("ACCESS_TOKEN", accessToken); 127 128 //3.調用接口,發送請求,創建成員 129 JSONObject jsonObject = WeiXinUtil.httpRequest(batchdeleteUser_url, "POST", useridlist); 130 System.out.println("jsonObject:"+jsonObject.toString()); 131 132 //4.錯誤消息處理 133 if (null != jsonObject) { 134 if (0 != jsonObject.getInt("errcode")) { 135 log.error("批量刪除成員失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 136 } 137 } 138 } 139 140 141 //6.獲取部門成員 142 public void getDepartmentUser(String accessToken,String departmentId,String fetchChild) { 143 144 //1.獲取請求的url 145 getDepartmentUser_url=getDepartmentUser_url.replace("ACCESS_TOKEN", accessToken) 146 .replace("DEPARTMENT_ID", departmentId) 147 .replace("FETCH_CHILD", fetchChild); 148 149 //2.調用接口,發送請求,獲取部門成員 150 JSONObject jsonObject = WeiXinUtil.httpRequest(getDepartmentUser_url, "GET", null); 151 System.out.println("jsonObject:"+jsonObject.toString()); 152 153 //3.錯誤消息處理 154 if (null != jsonObject) { 155 if (0 != jsonObject.getInt("errcode")) { 156 log.error("獲取部門成員失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 157 } 158 } 159 } 160 161 162 //7.獲取部門成員詳情 163 public void getDepartmentUserDetails(String accessToken,String departmentId,String fetchChild) { 164 //1.獲取請求的url 165 getDepartmentUserDetails_url=getDepartmentUserDetails_url.replace("ACCESS_TOKEN", accessToken) 166 .replace("DEPARTMENT_ID", departmentId) 167 .replace("FETCH_CHILD", fetchChild); 168 169 //2.調用接口,發送請求,獲取部門成員 170 JSONObject jsonObject = WeiXinUtil.httpRequest(getDepartmentUserDetails_url, "GET", null); 171 System.out.println("jsonObject:"+jsonObject.toString()); 172 173 //3.錯誤消息處理 174 if (null != jsonObject) { 175 if (0 != jsonObject.getInt("errcode")) { 176 log.error("獲取部門成員詳情失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 177 } 178 } 179 } 180 181 }
2.7 業務類之通訊錄部門業務類

1 package com.ray.service; 2 3 import net.sf.json.JSONObject; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import com.google.gson.Gson; 7 import com.ray.pojo.Department; 8 import com.ray.test.DepartmentTest; 9 import com.ray.util.WeiXinUtil; 10 11 public class Contacts_DepartmentService { 12 private static Logger log = LoggerFactory.getLogger(DepartmentTest.class); 13 14 private static String createDepartment_url="https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN"; 15 private static String updateDepartment_url="https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=ACCESS_TOKEN"; 16 private static String deleteDepartment_url="https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token=ACCESS_TOKEN&id=ID"; 17 private static String getDepartmentList_url="https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=ACCESS_TOKEN&id=ID"; 18 19 20 //1.創建部門 21 public void createDepartment(String accessToken,Department department) { 22 23 //1.獲取json字符串:將Department對象轉換為json字符串 24 Gson gson = new Gson(); 25 String jsonDepartment =gson.toJson(department); //使用gson.toJson(jsonDepartment)即可將jsonDepartment對象順序轉成json 26 System.out.println("jsonDepartment:"+jsonDepartment); 27 //2.拼接請求的url 28 createDepartment_url=createDepartment_url.replace("ACCESS_TOKEN", accessToken); 29 30 //3.調用接口,發送請求,創建部門 31 JSONObject jsonObject = WeiXinUtil.httpRequest(createDepartment_url, "POST", jsonDepartment); 32 System.out.println("jsonObject:"+jsonObject.toString()); 33 if (null != jsonObject) { 34 if (0 != jsonObject.getInt("errcode")) { 35 36 log.error("創建部門失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 37 } 38 } 39 } 40 41 //2.更新部門 42 public void updateDepartment(String accessToken,Department department) { 43 44 //1.獲取json字符串:將Department對象轉換為json字符串 45 Gson gson = new Gson(); 46 String jsonDepartment =gson.toJson(department); //使用gson.toJson(jsonDepartment)即可將jsonDepartment對象順序轉成json 47 System.out.println("jsonDepartment:"+jsonDepartment); 48 //2.拼接請求的url 49 updateDepartment_url=updateDepartment_url.replace("ACCESS_TOKEN", accessToken); 50 51 //3.調用接口,發送請求,更新部門 52 JSONObject jsonObject = WeiXinUtil.httpRequest(updateDepartment_url, "POST", jsonDepartment); 53 System.out.println("jsonObject:"+jsonObject.toString()); 54 if (null != jsonObject) { 55 if (0 != jsonObject.getInt("errcode")) { 56 57 log.error("更新部門失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 58 } 59 } 60 } 61 62 63 //3.刪除部門 64 public void deleteDepartment(String accessToken,String departmentId) { 65 66 //1.獲取請求的url 67 deleteDepartment_url=deleteDepartment_url.replace("ACCESS_TOKEN", accessToken) 68 .replace("ID", departmentId); 69 70 //2.調用接口,發送請求,刪除部門 71 JSONObject jsonObject = WeiXinUtil.httpRequest(deleteDepartment_url, "GET", null); 72 System.out.println("jsonObject:"+jsonObject.toString()); 73 74 //3.錯誤消息處理 75 if (null != jsonObject) { 76 if (0 != jsonObject.getInt("errcode")) { 77 log.error("刪除部門失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 78 } 79 } 80 } 81 82 83 84 //4.獲取部門列表 85 public void getDepartmentList(String accessToken,String departmentId) { 86 87 //1.獲取請求的url 88 getDepartmentList_url=getDepartmentList_url.replace("ACCESS_TOKEN", accessToken) 89 .replace("ID", departmentId); 90 91 //2.調用接口,發送請求,獲取成員 92 JSONObject jsonObject = WeiXinUtil.httpRequest(getDepartmentList_url, "GET", null); 93 System.out.println("jsonObject:"+jsonObject.toString()); 94 95 //3.錯誤消息處理 96 if (null != jsonObject) { 97 if (0 != jsonObject.getInt("errcode")) { 98 log.error("獲取部門列表 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); 99 } 100 } 101 } 102 103 104 }
2.8 測試類之用戶測試類-UserTest.java

1 package com.ray.test; 2 3 import java.util.Arrays; 4 import java.util.List; 5 6 import org.junit.Test; 7 8 import com.ray.pojo.User; 9 import com.ray.service.Contacts_UserService; 10 import com.ray.util.WeiXinParamesUtil; 11 import com.ray.util.WeiXinUtil; 12 13 /** 14 * 成員管理 15 * @author shirayner 16 * 17 *要注意的地方: 18 *1.開啟通訊錄同步之后,才能進行通訊錄的相關操作 19 *2.對通訊錄操作的憑證access_token,由企業id-cropId和通訊錄秘鑰secret(而不是應用秘鑰)獲取。 20 *3.創建成員需要開啟通訊錄的編輯權限。(管理工具-通訊錄同步) 21 *4.java對象轉json: 用gson.toJson(user)即可將user對象順序轉成json 22 */ 23 24 public class UserTest { 25 26 //1.創建成員 27 @Test 28 public void testCreateUser() { 29 //1.創建user對象 30 //User user = new User("3", "ray", 1,"13886086292","3057046319@qq.com","技術顧問","1"); 31 User user = new User("4", "jack", 1,"13986086293","4057046319@qq.com","咨詢顧問","1"); 32 //User user = new User("5", "tom", 1,"14986086294","5057046319@qq.com","產品經理","1"); 33 34 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 35 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 36 System.out.println("accessToken:"+accessToken); 37 38 //3.創建成員 39 Contacts_UserService cus=new Contacts_UserService(); 40 cus.createUser(accessToken,user); 41 42 } 43 44 45 //2.獲取成員 46 @Test 47 public void testGetUser() { 48 //1.獲取userId 49 //String userId="ShiRui"; 50 String userId="4"; 51 52 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 53 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 54 System.out.println("accessToken:"+accessToken); 55 56 //3.獲取成員 57 Contacts_UserService cus=new Contacts_UserService(); 58 cus.getUser(userId, accessToken); 59 } 60 61 //3.更新成員 62 @Test 63 public void testUpdateUser() { 64 65 //1.更改user對象信息 66 //User user = new User("3", "ray", 1,"13886086292","3057046319@qq.com","技術顧問","1"); 67 //User user = new User("4", "jack", 1,"13986086293","4057046319@qq.com","咨詢顧問","1"); 68 User user = new User("3", "ray", 1,"13889086292","3057946319@qq.com","咨詢顧問","1"); 69 70 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 71 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 72 System.out.println("accessToken:"+accessToken); 73 74 //3.創建成員 75 Contacts_UserService cus=new Contacts_UserService(); 76 cus.updateUser( accessToken,user); 77 78 } 79 80 //4.刪除成員 81 @Test 82 public void testDeleteUser() { 83 //1.獲取userId 84 //String userId="ShiRui"; 85 String userId="4"; 86 87 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 88 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 89 System.out.println("accessToken:"+accessToken); 90 91 //3.創建成員 92 Contacts_UserService cus=new Contacts_UserService(); 93 cus.deleteUser(userId, accessToken); 94 } 95 96 97 //5.批量刪除成員 98 @Test 99 public void testbatchdeleteUser() { 100 //1.獲取userIdList 101 String userId1="3"; 102 String userId2="4"; 103 List<String> userIdList = Arrays.asList(userId1, userId2); //此時將userIdList轉json,則結果為:["3","4"],會報錯:{"errcode":40063,"errmsg":"some parameters are empty"} 104 105 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 106 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 107 System.out.println("accessToken:"+accessToken); 108 109 //3.批量刪除成員 110 Contacts_UserService cus=new Contacts_UserService(); 111 cus.batchdeleteUser(accessToken,userIdList); 112 } 113 114 115 //6.獲取部門成員 116 @Test 117 public void testGetDepartmentUser() { 118 //1.獲取部門ID以及是否獲取子部門成員 119 String departmentId="1"; 120 String fetchChild="0"; 121 122 //2.獲取accessToken:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 123 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 124 System.out.println("accessToken:"+accessToken); 125 126 //3.獲取部門成員 127 Contacts_UserService cus=new Contacts_UserService(); 128 cus.getDepartmentUser(accessToken, departmentId, fetchChild); 129 } 130 131 132 //7.獲取部門成員詳情 133 @Test 134 public void testGetDepartmentUserDetails() { 135 //1.獲取部門ID以及是否獲取子部門成員 136 String departmentId="1"; 137 String fetchChild="0"; 138 139 //2.獲取accessToken:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 140 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 141 System.out.println("accessToken:"+accessToken); 142 143 //3.獲取部門成員 144 Contacts_UserService cus=new Contacts_UserService(); 145 cus.getDepartmentUserDetails(accessToken, departmentId, fetchChild); 146 } 147 }
2.9 測試類之部門測試類-DepartmentTest.java

1 package com.ray.test; 2 3 import org.junit.Test; 4 import com.ray.pojo.Department; 5 import com.ray.service.Contacts_DepartmentService; 6 import com.ray.util.WeiXinParamesUtil; 7 import com.ray.util.WeiXinUtil; 8 9 /** 10 * 部門管理 11 * @author shirayner 12 * 13 * 14 */ 15 16 public class DepartmentTest { 17 18 19 //1.創建部門 20 @Test 21 public void testCreateDepartment() { 22 //1.創建Department對象,並將對象轉換成json字符串 23 Department department = new Department(3, "HEC武漢分公司", 2); 24 //Department department = new Department(2, "HEC技術中心", 1); 25 26 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 27 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 28 System.out.println("accessToken:"+accessToken); 29 30 //3.創建部門 31 Contacts_DepartmentService cds= new Contacts_DepartmentService(); 32 cds.createDepartment(accessToken, department); 33 } 34 35 36 //2.更新部門 37 @Test 38 public void testUpdateDepartment() { 39 //1.創建Department對象,並將對象轉換成json字符串 40 Department department = new Department(2, "HEC技術服務中心", 1); 41 42 43 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 44 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 45 System.out.println("accessToken:"+accessToken); 46 47 //3.更新部門 48 Contacts_DepartmentService cds= new Contacts_DepartmentService(); 49 cds.updateDepartment(accessToken, department); 50 } 51 52 //3.刪除部門 53 @Test 54 public void testDeleteDepartment() { 55 //1.獲取userId 56 String departmentId="3"; 57 58 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 59 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 60 System.out.println("accessToken:"+accessToken); 61 62 //3.刪除部門 63 Contacts_DepartmentService cds= new Contacts_DepartmentService(); 64 cds.deleteDepartment(accessToken, departmentId); 65 } 66 67 68 /** 69 * 4.獲取部門列表 70 * 參數 必須 說明 71 * access_token 是 調用接口憑證 72 * id 否 部門id。獲取指定部門及其下的子部門。 如果不填,默認獲取全量組織架構 73 */ 74 @Test 75 public void testGetDepartmentList() { 76 //1.獲取departmentId 77 String departmentId="1"; 78 79 //2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,並拼接請求url 80 String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken(); 81 System.out.println("accessToken:"+accessToken); 82 83 //3.調用接口,發送請求,刪除部門 84 Contacts_DepartmentService cds= new Contacts_DepartmentService(); 85 cds.getDepartmentList(accessToken, departmentId); 86 } 87 88 89 }
三、參考資料
1.微信企業號官方開發文檔:https://work.weixin.qq.com/api/doc#10016