一、本節要點
1.通訊錄權限
ISV(應用服務商)默認無管理通訊錄的權限,企業應用默認有所有通訊錄權限。
2.數據傳輸格式—JSON
請參見: Java_數據交換_fastJSON_01_用法入門
二、代碼實現
1.HTTP請求工具類—HttpHelper

package com.ray.dingtalk.qy.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.util.EntityUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; /** * HTTP請求封裝,建議直接使用sdk的API */ public class HttpHelper { private static final Logger log = LogManager.getLogger(HttpHelper.class); /** * @desc :1.發起GET請求 * * @param url * @return JSONObject * @throws Exception */ public static JSONObject doGet(String url) throws Exception { //1.生成一個請求 HttpGet httpGet = new HttpGet(url); //2.配置請求的屬性 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build();//2000 httpGet.setConfig(requestConfig); //3.發起請求,獲取響應信息 //3.1 創建httpClient CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; try { //3.2 發起請求,獲取響應信息 response = httpClient.execute(httpGet, new BasicHttpContext()); //如果返回結果的code不等於200,說明出錯了 if (response.getStatusLine().getStatusCode() != 200) { log.info("request url failed, http code=" + response.getStatusLine().getStatusCode() + ", url=" + url); return null; } //4.解析請求結果 HttpEntity entity = response.getEntity(); //reponse返回的數據在entity中 if (entity != null) { String resultStr = EntityUtils.toString(entity, "utf-8"); //將數據轉化為string格式 log.info("GET請求結果:"+resultStr); JSONObject result = JSON.parseObject(resultStr); //將String轉換為 JSONObject if(result.getInteger("errcode")==null) { return result; }else if (0 == result.getInteger("errcode")) { return result; }else { log.info("request url=" + url + ",return value="); log.info(resultStr); int errCode = result.getInteger("errcode"); String errMsg = result.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } catch (IOException e) { log.info("request url=" + url + ", exception, msg=" + e.getMessage()); e.printStackTrace(); } finally { if (response != null) try { response.close(); //釋放資源 } catch (IOException e) { e.printStackTrace(); } } return null; } /** 2.發起POST請求 * @desc : * * @param url 請求url * @param data 請求參數(json) * @return * @throws Exception JSONObject */ public static JSONObject doPost(String url, Object data) throws Exception { //1.生成一個請求 HttpPost httpPost = new HttpPost(url); //2.配置請求屬性 //2.1 設置請求超時時間 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build(); httpPost.setConfig(requestConfig); //2.2 設置數據傳輸格式-json httpPost.addHeader("Content-Type", "application/json"); //2.3 設置請求實體,封裝了請求參數 StringEntity requestEntity = new StringEntity(JSON.toJSONString(data), "utf-8"); httpPost.setEntity(requestEntity); //3.發起請求,獲取響應信息 //3.1 創建httpClient CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; try { //3.3 發起請求,獲取響應 response = httpClient.execute(httpPost, new BasicHttpContext()); if (response.getStatusLine().getStatusCode() != 200) { log.info("request url failed, http code=" + response.getStatusLine().getStatusCode() + ", url=" + url); return null; } //獲取響應內容 HttpEntity entity = response.getEntity(); if (entity != null) { String resultStr = EntityUtils.toString(entity, "utf-8"); log.info("POST請求結果:"+resultStr); //解析響應內容 JSONObject result = JSON.parseObject(resultStr); if(result.getInteger("errcode")==null) { return result; }else if (0 == result.getInteger("errcode")) { return result; }else { log.info("request url=" + url + ",return value="); log.info(resultStr); int errCode = result.getInteger("errcode"); String errMsg = result.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } catch (IOException e) { log.info("request url=" + url + ", exception, msg=" + e.getMessage()); e.printStackTrace(); } finally { if (response != null) try { response.close(); //釋放資源 } catch (IOException e) { e.printStackTrace(); } } return null; } /** * @desc : 3. * * @param url * @param file * @return * @throws Exception * JSONObject */ public static JSONObject uploadMedia(String url, File file) throws Exception { HttpPost httpPost = new HttpPost(url); CloseableHttpResponse response = null; CloseableHttpClient httpClient = HttpClients.createDefault(); RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build(); httpPost.setConfig(requestConfig); HttpEntity requestEntity = MultipartEntityBuilder.create().addPart("media", new FileBody(file, ContentType.APPLICATION_OCTET_STREAM, file.getName())).build(); httpPost.setEntity(requestEntity); try { response = httpClient.execute(httpPost, new BasicHttpContext()); if (response.getStatusLine().getStatusCode() != 200) { log.info("request url failed, http code=" + response.getStatusLine().getStatusCode() + ", url=" + url); return null; } HttpEntity entity = response.getEntity(); if (entity != null) { String resultStr = EntityUtils.toString(entity, "utf-8"); JSONObject result = JSON.parseObject(resultStr); if (result.getInteger("errcode") == 0) { // 成功 //result.remove("errcode"); //result.remove("errmsg"); return result; } else { log.info("request url=" + url + ",return value="); log.info(resultStr); int errCode = result.getInteger("errcode"); String errMsg = result.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } catch (IOException e) { log.info("request url=" + url + ", exception, msg=" + e.getMessage()); e.printStackTrace(); } finally { if (response != null) try { response.close(); //釋放資源 } catch (IOException e) { e.printStackTrace(); } } return null; } public static File downloadMedia(String url, String fileDir) throws Exception { //1.生成一個請求 HttpGet httpGet = new HttpGet(url); //2.配置請求屬性 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build(); httpGet.setConfig(requestConfig); //3.發起請求,獲取響應信息 //3.1 創建httpClient CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; //4.設置本地保存的文件 File file = new File(fileDir); try { //5. 發起請求,獲取響應信息 response = httpClient.execute(httpGet, new BasicHttpContext()); log.info("HttpStatus.SC_OK:"+HttpStatus.SC_OK); log.info("response.getStatusLine().getStatusCode():"+response.getStatusLine().getStatusCode()); //請求成功 if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){ //6.取得請求內容 HttpEntity entity = response.getEntity(); if (entity != null) { //這里可以得到文件的類型 如image/jpg /zip /tiff 等等 但是發現並不是十分有效,有時明明后綴是.rar但是取到的是null,這點特別說明 log.info(entity.getContentType()); //可以判斷是否是文件數據流 log.info(entity.isStreaming()); //6.1 輸出流 FileOutputStream output = new FileOutputStream(file); //6.2 輸入流:從釘釘服務器返回的文件流,得到網絡資源並寫入文件 InputStream input = entity.getContent(); //6.3 將數據寫入文件:將輸入流中的數據寫入到輸出流 byte b[] = new byte[1024]; int j = 0; while( (j = input.read(b))!=-1){ output.write(b,0,j); } output.flush(); output.close(); } if (entity != null) { entity.consumeContent(); } } } catch (IOException e) { log.info("request url=" + url + ", exception, msg=" + e.getMessage()); e.printStackTrace(); } finally { if (response != null) try { response.close(); //釋放資源 } catch (IOException e) { e.printStackTrace(); } } return file; } }
2.Token工具類—AuthHelper

package com.ray.dingtalk.qy.auth; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Formatter; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson.JSONObject; import com.ray.dingtalk.qy.config.Env; import com.ray.dingtalk.qy.util.HttpHelper; /** * 釘釘相關配置參數的獲取工具類 * @desc : AccessToken和jsticket的獲取封裝 * * @author: shirayner * @date : 2017年9月27日 下午5:00:25 */ public class AuthHelper { //private static Logger log = LoggerFactory.getLogger(AuthHelper.class); //獲取access_token的接口地址,有效期為7200秒 private static final String GET_ACCESSTOKEN_URL="https://oapi.dingtalk.com/gettoken?corpid=CORPID&corpsecret=CORPSECRET"; //獲取getJsapiTicket的接口地址,有效期為7200秒 private static final String GET_JSAPITICKET_URL="https://oapi.dingtalk.com/get_jsapi_ticket?access_token=ACCESSTOKE"; /** 1.獲取access_token * @desc : * * @param corpId * @param corpSecret * @return * @throws Exception String */ public static String getAccessToken(String corpId,String corpSecret) throws Exception { //1.獲取請求url String url=GET_ACCESSTOKEN_URL.replace("CORPID", corpId).replace("CORPSECRET", corpSecret); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); //3.解析結果,獲取accessToken String accessToken=""; if (null != jsonObject) { accessToken=jsonObject.getString("access_token"); //4.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return accessToken; } /** * 2、獲取JSTicket, 用於js的簽名計算 * 正常的情況下,jsapi_ticket的有效期為7200秒,所以開發者需要在某個地方設計一個定時器,定期去更新jsapi_ticket * @throws Exception */ public static String getJsapiTicket(String accessToken) throws Exception { //1.獲取請求url String url=GET_JSAPITICKET_URL.replace("ACCESSTOKE", accessToken); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); //3.解析結果,獲取ticket String ticket=""; if (null != jsonObject) { ticket=jsonObject.getString("ticket"); //4.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return ticket; } /** * @desc : 3.生成簽名的函數 * * @param ticket jsticket * @param nonceStr 隨機串,自己定義 * @param timeStamp 生成簽名用的時間戳 * @param url 需要進行免登鑒權的頁面地址,也就是執行dd.config的頁面地址 * @return * @throws Exception String */ public static String getSign(String jsTicket, String nonceStr, Long timeStamp, String url) throws Exception { String plainTex = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonceStr + "×tamp=" + timeStamp + "&url=" + url; System.out.println(plainTex); try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(plainTex.getBytes("UTF-8")); return byteToHex(crypt.digest()); } catch (NoSuchAlgorithmException e) { throw new Exception(e.getMessage()); } catch (UnsupportedEncodingException e) { throw new Exception(e.getMessage()); } } //將bytes類型的數據轉化為16進制類型 private static String byteToHex(byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", new Object[] { Byte.valueOf(b) }); } String result = formatter.toString(); formatter.close(); return result; } /** * @desc :獲取前端jsapi需要的配置參數(已棄用,請用getConfig(HttpServletRequest)) * * @param request request:在釘釘中點擊微應用圖標跳轉的url地址 * @return Map<String,Object> 將需要的參數存入map,並返回 */ public static Map<String, Object> getDDConfig(HttpServletRequest request){ Map<String, Object> configMap = new HashMap<String, Object>(); //1.准備好參與簽名的字段 /* *以http://localhost/test.do?a=b&c=d為例 *request.getRequestURL的結果是http://localhost/test.do *request.getQueryString的返回值是a=b&c=d */ String urlString = request.getRequestURL().toString(); String queryString = request.getQueryString(); String queryStringEncode = null; String url; if (queryString != null) { queryStringEncode = URLDecoder.decode(queryString); url = urlString + "?" + queryStringEncode; } else { url = urlString; } String nonceStr=UUID.randomUUID().toString(); //隨機數 long timeStamp = System.currentTimeMillis() / 1000; //時間戳參數 String signedUrl = url; String accessToken = null; String ticket = null; String signature = null; //簽名 //2.進行簽名,獲取signature try { accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); ticket=AuthHelper.getJsapiTicket(accessToken); signature=getSign(ticket,nonceStr,timeStamp,signedUrl); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("accessToken:"+accessToken); System.out.println("ticket:"+ticket); System.out.println("nonceStr:"+nonceStr); System.out.println("timeStamp:"+timeStamp); System.out.println("signedUrl:"+signedUrl); System.out.println("signature:"+signature); System.out.println("agentId:"+Env.AGENTID); System.out.println("corpId:"+Env.CORP_ID); //3.將配置參數存入Map configMap.put("agentId", Env.AGENTID); configMap.put("corpId", Env.CORP_ID); configMap.put("timeStamp", timeStamp); configMap.put("nonceStr", nonceStr); configMap.put("signature", signature); return configMap; } public static String getConfig(HttpServletRequest request){ //1.准備好參與簽名的字段 /* *以http://localhost/test.do?a=b&c=d為例 *request.getRequestURL的結果是http://localhost/test.do *request.getQueryString的返回值是a=b&c=d */ String urlString = request.getRequestURL().toString(); String queryString = request.getQueryString(); String queryStringEncode = null; String url; if (queryString != null) { queryStringEncode = URLDecoder.decode(queryString); url = urlString + "?" + queryStringEncode; } else { url = urlString; } String nonceStr=UUID.randomUUID().toString(); //隨機數 long timeStamp = System.currentTimeMillis() / 1000; //時間戳參數 String signedUrl = url; String accessToken = null; String ticket = null; String signature = null; //簽名 //2.進行簽名,獲取signature try { accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); ticket=AuthHelper.getJsapiTicket(accessToken); signature=getSign(ticket,nonceStr,timeStamp,signedUrl); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("accessToken:"+accessToken); System.out.println("ticket:"+ticket); System.out.println("nonceStr:"+nonceStr); System.out.println("timeStamp:"+timeStamp); System.out.println("signedUrl:"+signedUrl); System.out.println("signature:"+signature); System.out.println("agentId:"+Env.AGENTID); System.out.println("corpId:"+Env.CORP_ID); String configValue = "{jsticket:'" + ticket + "',signature:'" + signature + "',nonceStr:'" + nonceStr + "',timeStamp:'" + timeStamp + "',corpId:'" + Env.CORP_ID + "',agentId:'" + Env.AGENTID + "'}"; System.out.println(configValue); return configValue; } }
3.成員實體類—User

package com.ray.dingtalk.qy.model.contact; import java.util.List; import com.alibaba.fastjson.JSONObject; /**@desc : 用戶類 * * @author: shirayner * @date : 2017年9月28日 上午9:38:25 */ public class User { public String userid; public String name; //必須 public boolean active; public String avatar; public List<Long> department; //必須 public String position; public String mobile; //必須 public String tel; public String workPlace; public String remark; public String email; public String jobnumber; public JSONObject extattr; public boolean isAdmin; public boolean isBoss; public String dingId; /** * @return the userid */ public String getUserid() { return userid; } /** * @param userid the userid to set */ public void setUserid(String userid) { this.userid = userid; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the active */ public boolean isActive() { return active; } /** * @param active the active to set */ public void setActive(boolean active) { this.active = active; } /** * @return the avatar */ public String getAvatar() { return avatar; } /** * @param avatar the avatar to set */ public void setAvatar(String avatar) { this.avatar = avatar; } /** * @return the department */ public List<Long> getDepartment() { return department; } /** * @param department the department to set */ public void setDepartment(List<Long> department) { this.department = department; } /** * @return the position */ public String getPosition() { return position; } /** * @param position the position to set */ public void setPosition(String position) { this.position = position; } /** * @return the mobile */ public String getMobile() { return mobile; } /** * @param mobile the mobile to set */ public void setMobile(String mobile) { this.mobile = mobile; } /** * @return the tel */ public String getTel() { return tel; } /** * @param tel the tel to set */ public void setTel(String tel) { this.tel = tel; } /** * @return the workPlace */ public String getWorkPlace() { return workPlace; } /** * @param workPlace the workPlace to set */ public void setWorkPlace(String workPlace) { this.workPlace = workPlace; } /** * @return the remark */ public String getRemark() { return remark; } /** * @param remark the remark to set */ public void setRemark(String remark) { this.remark = remark; } /** * @return the email */ public String getEmail() { return email; } /** * @param email the email to set */ public void setEmail(String email) { this.email = email; } /** * @return the jobnumber */ public String getJobnumber() { return jobnumber; } /** * @param jobnumber the jobnumber to set */ public void setJobnumber(String jobnumber) { this.jobnumber = jobnumber; } /** * @return the extattr */ public JSONObject getExtattr() { return extattr; } /** * @param extattr the extattr to set */ public void setExtattr(JSONObject extattr) { this.extattr = extattr; } /** * @return the isAdmin */ public boolean isAdmin() { return isAdmin; } /** * @param isAdmin the isAdmin to set */ public void setAdmin(boolean isAdmin) { this.isAdmin = isAdmin; } /** * @return the isBoss */ public boolean isBoss() { return isBoss; } /** * @param isBoss the isBoss to set */ public void setBoss(boolean isBoss) { this.isBoss = isBoss; } /** * @return the dingId */ public String getDingId() { return dingId; } /** * @param dingId the dingId to set */ public void setDingId(String dingId) { this.dingId = dingId; } @Override public String toString() { return "User[userid:" + userid + ", name:" + name + ", active:" + active + ", " + "avatar:" + avatar + ", department:" + department + ", position:" + position + ", mobile:" + mobile + ", email:" + email + ", extattr:" + extattr; } }
4.部門實體類—Department

package com.ray.dingtalk.qy.model.contact; /**@desc : * * @author: shirayner * @date : 2017年10月18日 下午2:14:20 */ public class Department { //部門id private long id; //是 部門名稱。長度限制為1~64個字符。不允許包含字符‘-’‘,’以及‘,’。 private String name; //是 父部門id。根部門id為1 private String parentid; //否 在父部門中的次序值。order值小的排序靠前 private String order; //否 是否創建一個關聯此部門的企業群,默認為false private Boolean createDeptGroup; //否 是否隱藏部門, true表示隱藏, false表示顯示 private Boolean deptHiding; //否 可以查看指定隱藏部門的其他部門列表,如果部門隱藏,則此值生效, //取值為其他的部門id組成的的字符串,使用 | 符號進行分割。總數不能超過200。 private String deptPerimits; //否 可以查看指定隱藏部門的其他人員列表,如果部門隱藏,則此值生效,取值為其他的人員userid組成的的字符串, //使用| 符號進行分割。總數不能超過200。 private String userPerimits; //否 是否本部門的員工僅可見員工自己, 為true時,本部門員工默認只能看到員工自己 private Boolean outerDept; //否 本部門的員工僅可見員工自己為true時,可以配置額外可見部門,值為部門id組成的的字符串, //使用|符號進行分割。總數不能超過200。 private String outerPermitDepts; //否 本部門的員工僅可見員工自己為true時,可以配置額外可見人員,值為userid組成的的字符串, //使用|符號進行分割。總數不能超過200。 private String outerPermitUsers; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getParentid() { return parentid; } public void setParentid(String parentid) { this.parentid = parentid; } public String getOrder() { return order; } public void setOrder(String order) { this.order = order; } public Boolean getCreateDeptGroup() { return createDeptGroup; } public void setCreateDeptGroup(Boolean createDeptGroup) { this.createDeptGroup = createDeptGroup; } public Boolean getDeptHiding() { return deptHiding; } public void setDeptHiding(Boolean deptHiding) { this.deptHiding = deptHiding; } public String getDeptPerimits() { return deptPerimits; } public void setDeptPerimits(String deptPerimits) { this.deptPerimits = deptPerimits; } public String getUserPerimits() { return userPerimits; } public void setUserPerimits(String userPerimits) { this.userPerimits = userPerimits; } public Boolean getOuterDept() { return outerDept; } public void setOuterDept(Boolean outerDept) { this.outerDept = outerDept; } public String getOuterPermitDepts() { return outerPermitDepts; } public void setOuterPermitDepts(String outerPermitDepts) { this.outerPermitDepts = outerPermitDepts; } public String getOuterPermitUsers() { return outerPermitUsers; } public void setOuterPermitUsers(String outerPermitUsers) { this.outerPermitUsers = outerPermitUsers; } public long getId() { return id; } public void setId(long id) { this.id = id; } }
5.成員管理業務類—UserService

package com.ray.dingtalk.qy.service.contact; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ray.dingtalk.qy.model.contact.User; import com.ray.dingtalk.qy.util.HttpHelper; /**@desc : 成員管理業務類 * * @author: shirayner * @date : 2017年9月28日 上午9:53:51 */ public class UserService { //1.獲取成員詳情 接口 private static final String GET_USER_URL="https://oapi.dingtalk.com/user/get?access_token=ACCESS_TOKEN&userid=ID"; //2.創建成員 接口 private static final String CREATE_USER_URL="https://oapi.dingtalk.com/user/create?access_token=ACCESS_TOKEN"; //3.更新成員 private static final String UPDATE_USER_URL="https://oapi.dingtalk.com/user/update?access_token=ACCESS_TOKEN"; //4.刪除成員 private static final String DELETE_USER_URL="https://oapi.dingtalk.com/user/delete?access_token=ACCESS_TOKEN&userid=ID"; //5.批量刪除成員 private static final String BATCHDELETE_USER_URL="https://oapi.dingtalk.com/user/batchdelete?access_token=ACCESS_TOKEN"; //6.獲取部門成員(simplelist) private static final String LIST_DEPARTMENTUSER_URL="https://oapi.dingtalk.com/user/simplelist?access_token=ACCESS_TOKEN&department_id=DEPARTMENTID"; //7.獲取部門成員(詳情) private static final String LIST_DEPARTMENTUSERDETAIL_URL="https://oapi.dingtalk.com/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENTID"; //8.獲取管理員列表 private static final String LIST_ADMIN_URL="https://oapi.dingtalk.com/user/get_admin?access_token=ACCESS_TOKEN"; //9.根據unionid獲取成員的userid private static final String GET_USERID_BYUNIONID_URL="https://oapi.dingtalk.com/user/getUseridByUnionid?access_token=ACCESS_TOKEN&unionid=UNIONID"; //10.通過CODE換取用戶身份 private static final String GET_USERINFO_BYCODE_URL="https://oapi.dingtalk.com/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE"; /** 1.根據userid獲取成員詳情 * @desc :獲取成員詳情 * 參考文檔: https://open-doc.dingtalk.com/docs/doc.htm?spm=0.0.0.0.jjSfQQ&treeId=371&articleId=106816&docType=1#s0 * @param accessToken * @param userId * return JSONObject 返回用戶詳情 * @throws Exception */ public JSONObject getUser(String accessToken, String userId) throws Exception { //1.獲取請求url String url=GET_USER_URL.replace("ACCESS_TOKEN", accessToken).replace("ID", userId); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取User if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /**2.創建成員 * @desc : * * @param accessToken * @param user * @return 返回用戶id * @throws Exception String */ public String createUser(String accessToken,User user) throws Exception { //1.准備POST請求參數 Object data=JSON.toJSON(user); System.out.println(data); //2.獲取請求url String url=CREATE_USER_URL.replace("ACCESS_TOKEN", accessToken); //3.發起POST請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doPost(url, data); System.out.println("jsonObject:"+jsonObject.toString()); //4.解析結果,獲取UserId String userId=""; if (null != jsonObject) { userId=jsonObject.getString("userid"); //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return userId; } /**3.更新成員 * @desc : * 參數說明(如果非必須的字段未指定,則釘釘后台不改變該字段之前設置好的值) * @param accessToken * @param user * @return * @throws Exception String */ public void updateUser(String accessToken,User user) throws Exception { //1.准備POST請求參數 Object data=JSON.toJSON(user); System.out.println(data); //2.獲取請求url String url=UPDATE_USER_URL.replace("ACCESS_TOKEN", accessToken); //3.發起POST請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doPost(url, data); System.out.println("jsonObject:"+jsonObject.toString()); //4.解析結果 if (null != jsonObject) { //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } /** 4.刪除成員 * * @param accessToken * @param userId void * @throws Exception */ public JSONObject deleteUser(String accessToken, String userId) throws Exception { //1.獲取請求url String url=DELETE_USER_URL.replace("ACCESS_TOKEN", accessToken).replace("ID", userId); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取User if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 5.批量刪除成員 * @desc : * * @param accessToken * @param user * @throws Exception void */ public void batchDeleteUser(String accessToken,Map< String , List<String> > userIdlistMap) throws Exception { //1.准備POST請求參數 Object data=JSON.toJSON(userIdlistMap); System.out.println(data); //2.獲取請求url String url=BATCHDELETE_USER_URL.replace("ACCESS_TOKEN", accessToken); //3.發起POST請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doPost(url, data); System.out.println("jsonObject:"+jsonObject.toString()); //4.解析結果 if (null != jsonObject) { //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } /** 6.獲取部門成員(simplelist) * @desc : * * @param accessToken * @param departmentId * return userList 用戶列表 * @throws Exception void */ public JSONObject listDepartmentUser(String accessToken, String departmentId) throws Exception { //1.獲取請求url String url=LIST_DEPARTMENTUSER_URL.replace("ACCESS_TOKEN", accessToken).replace("DEPARTMENTID", departmentId); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取User if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 7.獲取部門成員(詳情) * @desc : * * @param accessToken * @param departmentId * return userList 用戶列表 * @throws Exception void */ public JSONObject listDepartmentUserDetail(String accessToken, String departmentId) throws Exception { //1.獲取請求url String url=LIST_DEPARTMENTUSERDETAIL_URL.replace("ACCESS_TOKEN", accessToken).replace("DEPARTMENTID", departmentId); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取User if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //4.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /**8.獲取管理員列表 * @desc : * * @param accessToken * @return adminList 管理員列表 * @throws Exception JSONObject */ public JSONObject listAdmin(String accessToken) throws Exception { //1.獲取請求url String url=LIST_ADMIN_URL.replace("ACCESS_TOKEN", accessToken); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取adminList if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 9.根據unionid獲取成員的userid * @desc : * * @param accessToken * @param unionId * @return 用戶id * @throws Exception JSONObject */ public String getUserIdByUnionId(String accessToken, String unionId) throws Exception { //1.獲取請求url String url=GET_USERID_BYUNIONID_URL.replace("ACCESS_TOKEN", accessToken).replace("UNIONID", unionId); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取User if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject.getString("userid"); } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 10.通過CODE換取用戶身份 * @desc :釘釘服務器返回的用戶信息為: * userid 員工在企業內的UserID * deviceId 手機設備號,由釘釘在安裝時隨機產生 * is_sys 是否是管理員 * sys_level 級別,0:非管理員 1:超級管理員(主管理員) 2:普通管理員(子管理員) 100:老板 * * @param accessToken * @param code * @throws Exception void */ public JSONObject getUserInfo(String accessToken,String code) throws Exception { //1.獲取請求url String url=GET_USERINFO_BYCODE_URL.replace("ACCESS_TOKEN", accessToken).replace("CODE", code); //2.發起GET請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println("jsonObject:"+jsonObject.toString()); //3.解析結果,獲取User if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } }
6.部門管理業務類—DepartmentServcie

package com.ray.dingtalk.qy.service.contact; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ray.dingtalk.qy.model.contact.Department; import com.ray.dingtalk.qy.util.HttpHelper; /**@desc : 部門管理業務類 * * @author: shirayner * @date : 2017年10月18日 下午12:39:21 */ public class DepartmentServcie { //1.獲取部門列表 private static final String LIST_DEPARTMENT_URL="https://oapi.dingtalk.com/department/list?access_token=ACCESS_TOKEN&id=ID"; //2.獲取部門詳情 private static final String GET_DEPARTMENTDETAIL_URL="https://oapi.dingtalk.com/department/get?access_token=ACCESS_TOKEN&id=ID"; //3.創建部門 private static final String CREATE_DEPARTMENT_URL="https://oapi.dingtalk.com/department/create?access_token=ACCESS_TOKEN"; //4.更新部門 private static final String UPDATE_DEPARTMENT_URL="https://oapi.dingtalk.com/department/update?access_token=ACCESS_TOKEN"; //5.刪除部門 private static final String DELETE_DEPARTMENT_URL="https://oapi.dingtalk.com/department/delete?access_token=ACCESS_TOKEN&id=ID"; //6.查詢部門的所有上級父部門路徑 private static final String LIST_PARENTDEPTS_BYDEPT_URL="https://oapi.dingtalk.com/department/list_parent_depts_by_dept?access_token=ACCESS_TOKEN&id=ID"; //7.查詢指定用戶的所有上級父部門路徑 private static final String LIST_PARENTDEPTS_BYUSER_URL="https://oapi.dingtalk.com/department/list_parent_depts?access_token=ACCESS_TOKEN&userId=USERID"; /** 1.獲取部門列表 * @desc :獲取指定部門下的部門列表 * * @param accessToken * @param departementId 父部門id * @return * @throws Exception JSONObject */ public JSONObject listDepartment(String accessToken,String departmentId) throws Exception { //1.准備請求url String url=LIST_DEPARTMENT_URL.replace("ACCESS_TOKEN", accessToken).replace("ID", departmentId); //2.調用接口,發送請求 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println(jsonObject); //3.解析請求結果 if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 2.獲取部門詳情 * @desc : * * @param accessToken * @param departementId 部門id * @return * @throws Exception JSONObject */ public JSONObject getDepartmentDetail(String accessToken,String departmentId) throws Exception { //1.准備請求url String url=GET_DEPARTMENTDETAIL_URL.replace("ACCESS_TOKEN", accessToken).replace("ID", departmentId); //2.調用接口,發送請求 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println(jsonObject); //3.解析請求結果 if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 3.創建部門 * @desc : * * @param accessToken * @param department * @return * @throws Exception String */ public String createDepartment(String accessToken,Department department) throws Exception { //1.准備POST請求參數 Object data=JSON.toJSON(department); System.out.println(data); //2.獲取請求url String url=CREATE_DEPARTMENT_URL.replace("ACCESS_TOKEN", accessToken); //3.發起POST請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doPost(url, data); System.out.println("jsonObject:"+jsonObject.toString()); //4.解析結果,獲取UserId String departmentId=""; if (null != jsonObject) { departmentId=jsonObject.getString("id"); //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return departmentId; } /** 4.更新部門 * @desc : * * @param accessToken * @param department 其中id是必須的 * @return * @throws Exception String */ public void updateDepartment(String accessToken,Department department) throws Exception { //1.准備POST請求參數 Object data=JSON.toJSON(department); System.out.println(data); //2.獲取請求url String url=UPDATE_DEPARTMENT_URL.replace("ACCESS_TOKEN", accessToken); //3.發起POST請求,獲取返回結果 JSONObject jsonObject=HttpHelper.doPost(url, data); System.out.println("jsonObject:"+jsonObject.toString()); //4.解析結果 if (null != jsonObject) { //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } /**5.刪除部門 * @desc : * * @param accessToken * @param departmentId * @throws Exception void */ public void deleteDepartment(String accessToken,String departmentId) throws Exception { //1.准備請求url String url=DELETE_DEPARTMENT_URL.replace("ACCESS_TOKEN", accessToken).replace("ID", departmentId); //2.調用接口,發送請求 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println(jsonObject); //3.解析請求結果 if (null != jsonObject) { //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } } /** 6.查詢部門的所有上級父部門路徑 * @desc : * 返回的結果按順序依次為其所有父部門的ID,直到根部門 * @param accessToken * @param departementId 部門id * @return * @throws Exception JSONObject */ public JSONObject listParentDepartementsByDept(String accessToken,String departmentId) throws Exception { //1.准備請求url String url=LIST_PARENTDEPTS_BYDEPT_URL.replace("ACCESS_TOKEN", accessToken).replace("ID", departmentId); //2.調用接口,發送請求 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println(jsonObject); //3.解析請求結果 if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } /** 7.查詢指定用戶的所有上級父部門路徑 * @desc : * 返回的結果按順序依次為其所有父部門的ID,直到根部門 * @param accessToken * @param departementId 部門id * @return * @throws Exception JSONObject */ public JSONObject listParentDepartementsByUser(String accessToken,String userID) throws Exception { //1.准備請求url String url=LIST_PARENTDEPTS_BYUSER_URL.replace("ACCESS_TOKEN", accessToken).replace("USERID", userID); //2.調用接口,發送請求 JSONObject jsonObject=HttpHelper.doGet(url); System.out.println(jsonObject); //3.解析請求結果 if (null != jsonObject) { //4.請求成功,則返回jsonObject if (0==jsonObject.getInteger("errcode")) { return jsonObject; } //5.錯誤消息處理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); throw new Exception("error code:"+errCode+", error message:"+errMsg); } } return null; } }
7.成員管理測試類—UserServiceTest

package com.ray.dingtalk.qy.service.contact; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import com.ray.dingtalk.qy.auth.AuthHelper; import com.ray.dingtalk.qy.config.Env; import com.ray.dingtalk.qy.model.contact.User; /**@desc : 成員管理測試類 * * @author: shirayner * @date : 2017年9月28日 上午10:09:34 */ public class UserServiceTest { /** * @desc :1.獲取成員 * * @throws Exception void */ @Test public void testGetUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String userId="manager6777"; UserService us=new UserService(); us.getUser(accessToken, userId); } /** * @desc :2.創建成員 * * @throws Exception void */ @Test public void testCreateUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); User user=new User(); user.setName("測試2"); //王子明 List<Long> departmentList=new ArrayList<Long>(); departmentList.add(new Long(53191107)); user.setDepartment(departmentList); user.setUserid("ceishi2");; user.setMobile("18771419624"); //18771419627 UserService us=new UserService(); String userId=us.createUser(accessToken, user); System.out.println("userId:"+userId); } /** 3.更新成員 * @desc :參數說明(如果非必須的字段未指定,則釘釘后台不改變該字段之前設置好的值) * * @throws Exception void */ @Test public void testUpdateUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); User user=new User(); user.setName("測試專用"); List<Long> departmentList=new ArrayList<Long>(); departmentList.add(new Long(1)); user.setDepartment(departmentList); user.setMobile("13764363757"); user.setUserid("142322032127997575"); user.setPosition("網管"); UserService us=new UserService(); us.updateUser(accessToken, user); } /** 4.刪除成員 * @desc : * * @throws Exception void */ @Test public void testDeleteUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String userId="142322032127997575"; UserService us=new UserService(); us.deleteUser(accessToken, userId); } /** 5.批量刪除成員 * @desc : * * @throws Exception void */ @Test public void testBatchDeleteUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); //1.1為構造JSon做准備:["ceishi1","ceishi2"] List<String> userIdlist=new ArrayList<String>(); userIdlist.add("ceishi1"); userIdlist.add("ceishi2"); //1.2為構造JSon做准備:{"useridlist":["ceishi1","ceishi2"]} Map< String , List<String> > userIdListMap=new HashMap< String, List<String> >(); userIdListMap.put("useridlist", userIdlist); UserService us=new UserService(); us.batchDeleteUser(accessToken, userIdListMap); } /** 6.獲取部門成員(simplelist) * @desc : * * @throws Exception void */ @Test public void testListDepartmentUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String departmentId="1"; UserService us=new UserService(); us.listDepartmentUser(accessToken, departmentId); } /** 7.獲取部門成員(詳情) * @desc : * * @throws Exception void */ @Test public void testListDepartmentUserDetail() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String departmentId="1"; UserService us=new UserService(); us.listDepartmentUserDetail(accessToken, departmentId); } /** 8.獲取管理員列表 * @desc : * * @throws Exception void */ @Test public void testListAdmin() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); UserService us=new UserService(); us.listAdmin(accessToken); } }
8.部門管理測試類—DepartmentServcieTest

package com.ray.dingtalk.qy.service.contact; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test; import com.alibaba.fastjson.JSONObject; import com.ray.dingtalk.qy.auth.AuthHelper; import com.ray.dingtalk.qy.config.Env; import com.ray.dingtalk.qy.model.contact.Department; /**@desc : 部門管理測試類 * * @author: shirayner * @date : 2017年10月18日 下午1:31:32 */ public class DepartmentServcieTest { private static final Logger log = LogManager.getLogger(DepartmentServcieTest.class); /** 1.獲取部門列表 * @throws Exception * @desc : * void */ @Test public void testListDepartement() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String departmentId="1"; DepartmentServcie departmentServcie= new DepartmentServcie(); JSONObject jsonObject=departmentServcie.listDepartment(accessToken, departmentId); log.info(jsonObject); } /** 2.獲取部門詳情 * @throws Exception * @desc : * void */ @Test public void testGetDepartementDetail() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String departmentId="1"; DepartmentServcie departmentServcie= new DepartmentServcie(); JSONObject jsonObject=departmentServcie.getDepartmentDetail(accessToken, departmentId); log.info(jsonObject); } /** 3.創建部門 * @throws Exception * @desc : * void */ @Test public void testCreateDepartment() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); Department department =new Department(); department.setName("HEC北京分公司"); department.setParentid("1"); DepartmentServcie departmentServcie= new DepartmentServcie(); String departmentId=departmentServcie.createDepartment(accessToken, department); log.info(departmentId); } /** 4.更新部門 * * @throws Exception * @desc : * void */ @Test public void testUpdateDepartment() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); Department department =new Department(); department.setName("HEC大漢分公司"); department.setId(53125124); DepartmentServcie departmentServcie= new DepartmentServcie(); departmentServcie.updateDepartment(accessToken, department); } /** 5.刪除部門 * @throws Exception * @desc : * void */ @Test public void testDeleteDepartement() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String departmentId="53181144"; DepartmentServcie departmentServcie= new DepartmentServcie(); departmentServcie.deleteDepartment(accessToken, departmentId); } /** 6.查詢部門的所有上級父部門路徑 * @throws Exception * @desc : * void */ @Test public void testListParentDepartementsByDept() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String departmentId="53191107"; DepartmentServcie departmentServcie= new DepartmentServcie(); JSONObject jsonObject=departmentServcie.listParentDepartementsByDept(accessToken, departmentId); log.info(jsonObject.get("parentIds")); } /** 7.查詢指定用戶的所有上級父部門路徑 * @throws Exception * @desc : * void */ @Test public void testListParentDepartementsByUser() throws Exception { String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET); String userID="ceishi2"; DepartmentServcie departmentServcie= new DepartmentServcie(); JSONObject jsonObject=departmentServcie.listParentDepartementsByUser(accessToken, userID); log.info(jsonObject.get("department")); } }