@[机构同步]机构信息数据同步
企业微信组织机构数据同步,复制即使用
主要介绍如何操作企业微信通讯录的组织信息同步,企业微信改版之后已无法直接获取机构的详细信息,对于此等情况若是想很好的做一份企业微信的通讯录同步功能我们只有本地保存更多数据
公共方法
/**
* 接口返回参数转成map,并且按需求打印日志
*
* @param response
* @param type
* @param isPrint
* @return
*/
private Map<String, Object> responseToMap(HttpResponse<String> response, String type, boolean isPrint) {
Map<String, Object> map = gson.fromJson(response.getBody(), HashMap.class);
if (isPrint)
log.info("type-->{},map-->{}", type, map);
return map;
}
/**
* 实体转Map
*
* @param entity
* @return
* @throws IllegalAccessException
*/
private String entityToJson(Object entity) {
Map<String, Object> map = new HashMap<>();
Class<?> clazz = entity.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
Object value = field.get(entity);
if (name.equals("serialVersionUID"))
continue;
map.put(name, value);
}
} catch (Exception e) {
e.printStackTrace();
}
return gson.toJson(map, new TypeToken<HashMap<String, Object>>() {
}.getType());
}
公共类
@Data
@AllArgsConstructor
public class DepartmentBean implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Long id;//部门id,32位整型,指定时必须大于1。若不填该参数,将自动生成id
private Long order;//在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
private Long parentid;//父部门id,32位整型
private String name_en;//英文名称。同一个层级的部门名称不能重复。
private String name;//部门名称。同一个层级的部门名称不能重复
private Boolean isSync;//本地记录是否已经同步
private String status;//状态 0 禁用,1 正常
}
基本创建、更新、删除方法
private static final String CONTENT_TYPE = "application/json";
private static final String CORPID = "xx";
private static final String CORPSECRET = "xx";
private static final boolean IS_PRINT = true;
private static final String ACCESS_TOKEN = "ACCESS_TOKEN";
private Gson gson = new Gson();
//获取认证
private String TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=CORPID&corpsecret=CORPSECRET";
//创建部门
private String CREATE_DEPT = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN";
//更新部门
private String UPDATE_DEPT = "https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=ACCESS_TOKEN";
//删除部门
private String DELET_DEPT = "https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token=ACCESS_TOKEN&id=ID";
//获取单个部门详情
private String LIST_DEPT = "https://qyapi.weixin.qq.com/cgi-bin/department/simplelist?access_token=ACCESS_TOKEN&id=ID";
/**
* 获取企业微信的token
*
* @return
*/
public String getAccessToken() {
String replaceUrl = TOKEN_URL.replace("CORPID", CORPID).replace("CORPSECRET", CORPSECRET);
HttpResponse<String> response = Unirest.get(replaceUrl)
.asString();
Map<String, Object> map = responseToMap(response, "获取Token", IS_PRINT);
return (String) map.get("access_token");
}
/**
* 创建部门
*
* @param accessToken
*/
public Long createDept(String accessToken, DepartmentBean department) {
String replace = CREATE_DEPT.replace(ACCESS_TOKEN, accessToken);
String json = entityToJson(department);
HttpResponse<String> response = Unirest.post(replace)
.header("Content-Type", CONTENT_TYPE)
.body(json)
.asString();
Map<String, Object> map = responseToMap(response, "创建部门", IS_PRINT);
if ((Double) map.get("code") == 0.0) {
return (Long) map.get("id");
}
return 0L;
}
/**
* 更新部门信息
*
* @param accessToken
* @param department
* @return
*/
public boolean updateUserDept(String accessToken, DepartmentBean department) {
String replaceUrl = UPDATE_DEPT.replace(ACCESS_TOKEN, accessToken);
String json = entityToJson(department);
HttpResponse<String> response = Unirest.post(replaceUrl)
.header("Content-Type", CONTENT_TYPE)
.body(json)
.asString();
Map<String, Object> responseMap = responseToMap(response, "更新部门", true);
Double errcode = (Double) responseMap.get("errcode");
return errcode == 0.0;
}
public boolean deleteDepartment(String accessToken, String deptId) {
String replaceUrl = DELET_DEPT.replace(ACCESS_TOKEN, accessToken)
.replace("ID", deptId);
HttpResponse<String> response = Unirest.get(replaceUrl)
.asString();
Map<String, Object> responseMap = responseToMap(response, "删除部门", IS_PRINT);
Double errCode = (Double) responseMap.get("errcode");
return errCode == 0.0;
}
/**
* 获取子部门ID列表,仅能获取到id ,parentid,order
*
* @param accessToken
* @param deptId 不写就是获取全部
* @return
*/
public List<DepartmentBean> getDeptInfo(String accessToken, String deptId) {
String url = "";
if (!StringUtils.isEmpty(deptId)) {
url = LIST_DEPT.replace("&id=ID", "");
} else {
url = LIST_DEPT.replace("ID", deptId);
}
String replaceUrl = url.replace(ACCESS_TOKEN, accessToken);
HttpResponse<String> response = Unirest.get(replaceUrl).asString();
Map<String, Object> responseMap = responseToMap(response, "获取部门列表", IS_PRINT);
if ((Double) responseMap.get("errcode") != 0.0)
return new ArrayList<>();
List<Map> departmentIdList = (List<Map>) responseMap.get("department_id");
return departmentIdList.stream().map(item -> BeanUtil.toBeanIgnoreError(item, DepartmentBean.class)).collect(Collectors.toList());
}
定时任务数据同步
public class syncWechatDept {
@Autowired
private EnterpriseWeChat weChatUtil;
@Scheduled(cron = "00 00 03 * * *")
public void syncWeChatDept() {
List<DepartmentBean> allDeptList = getAllDeptList();
String accessToken = weChatUtil.getAccessToken();
for (DepartmentBean departmentBean : allDeptList) {
if (departmentBean.getStatus().equals("0")) {//删除
weChatUtil.deleteDepartment(accessToken, departmentBean.getId());
continue;
}
if (departmentBean.getIsSync()) {//更新
boolean b = weChatUtil.updateUserDept(accessToken, departmentBean);
continue;
}
Long dept = weChatUtil.createDept(accessToken, departmentBean);
if (dept != 0L) {
log.info("创建部门成功");
//todo 操作数据库 修改数据库信息
departmentBean.setIsSync(true);
} else {
//todo 操作数据库 修改数据库信息
departmentBean.setIsSync(false);
log.info("创建部门失败---->{}", departmentBean);
}
}
}
private List<DepartmentBean> getAllDeptList() {
//todo 数据库数据查询,根据实际情况
return null;
}
}
需要的依赖 pom坐标
<!--json解析-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.8</version>
</dependency>
<!-- HTTP请求-->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>2.3.17</version>
</dependency>
<!--Hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>