企业微信通讯录同步

news/2024/12/14 12:01:36/
/*** 获取部门》用户信息* 该接口已失效,企业微信于2022.8月份对接口进行了调整,原使用该接口仍可以使用;新的IP调用该接口将被拒绝。** @return*/public void getAllwxUser() {log.info("begin-----执行---获取员工信息-----getUser");List<Map<String, Object>> userList = new ArrayList<Map<String, Object>>();HashMap<String, Object> user = null;// 1、查询出access_Token的值String access_token = getAccessToken(CORPID, APP_SECRET);log.info("access_token=" + access_token);log.info("=====2、获取部门集合数据 start=====");// 2、获取部门列表信息(不填则是查询出所有的部门列表)List<String> depts = getDepartmentList(access_token, "");log.info("=====2、获取部门集合数据 end 数量:" + depts.size() + "=====");// 3、根据部门信息去获取成员的详细信息(查询到的数据)log.info("=====3、获取用户集合数据 start=====");List<SystemUserFu> users = getDepartmentUserDetails(depts, access_token);log.info("=====3、获取用户集合数据 end 数量:" + users.size() + "=====");//4、对查询到的信息数据进行拼接插入log.info("=====4、insertUserDetailsNew start=====");int insertCount = insertUserDetailsNew(users);log.info("=====4、insertUserDetailsNew end 数量:" + insertCount + "=====");}

2、获取token

    /*** 获取扫码token** @param corpId* @param corpSecret* @return*/public String getAccessToken(String corpId, String corpSecret) {String url = String.format(ACCESSTOKE_URL, corpId, corpSecret);UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);URI uri = builder.build().encode().toUri();String resp = restTemplate.getForObject(uri, String.class);JSONObject jsonObject = JSONObject.parseObject(resp);String access_token = jsonObject.getString("access_token");return access_token;}

3、获取部门列表

/*** 获取部门列表** @param accessToken* @param departmentId* @return*/public List<String> getDepartmentList(String accessToken, String departmentId) {List<String> departments = new ArrayList<String>();String url = String.format(departmentList_url, accessToken, departmentId);String resp = restTemplate.getForObject(url, String.class);JSONObject jsonObject = JSONObject.parseObject(resp);
//        log.info("jsonObject:" + jsonObject.toString());// 3.错误消息处理if (null != jsonObject) {if (0 != jsonObject.getIntValue("errcode")) {log.info("获取部门列表 errcode:{" + jsonObject.getIntValue("errcode") + "} errmsg:{" + jsonObject.get("errmsg") + "}");} else {// 查询成功List<Map<String, Object>> mapListJson = (List) jsonObject.getJSONArray("department");if (null != mapListJson) {for (int i = 0; i < mapListJson.size(); i++) {Map<String, Object> dept = mapListJson.get(i);//部门id不为空,并且是最上级企业,避免重复获取数据if (null != dept.get("id") && "0".equals(dept.get("parentid").toString())) {departments.add(dept.get("id").toString());}}}}}return departments;}

4、获取用户信息

/*** 获取部门成员详情** @param depts* @param accessToken //是否遍历子部门的成员,一般不要遍历,除非你就只获取父级部门或者子部门为空,不然会导致数据重复* @return*/public List<SystemUserFu> getDepartmentUserDetails(List<String> depts, String accessToken) {List<SystemUserFu> users = new ArrayList<SystemUserFu>();for (String deptId : depts) {log.info("=====deptId:" + deptId);// 1.获取请求的urlString url = String.format(departmentUserList_url, accessToken, deptId, 1);String resp = restTemplate.getForObject(url, String.class);JSONObject jsonObject = JSONObject.parseObject(resp);log.info("=====jsonObject:" + jsonObject.toString().substring(0, 1000));
//            log.info("Contact_service----jsonObject:" + jsonObject.toString());// 3.错误消息处理if (null != jsonObject) {if (0 != jsonObject.getIntValue("errcode")) {log.info("获取部门成员详情失败 errcode:{" + jsonObject.getIntValue("errcode") + "} errmsg:{" + jsonObject.get("errmsg") + "}");} else {// 查询成功的话log.info("=====jsonObject不为空=====");// JSONArray array=jsonObject.getJSONArray("userlist");List<Map<String, Object>> mapListJson = (List) jsonObject.getJSONArray("userlist");log.info("=====mapListJson:长度:" + mapListJson.size() + "=====");if (null != mapListJson) {log.info("=====mapListJson不为空=====");for (int i = 0; i < mapListJson.size(); i++) {Map<String, Object> de = mapListJson.get(i);
//                            if (i < 2) {
//                                log.info("=====mapListJson " + i + " start=====");
//                                for (String key : de.keySet()) {
//                                    log.info("key:" + key + ";val:" + de.get(key) + ";");
//                                }
//                                log.info("=====mapListJson " + i + " end=====");
//
//                            }// 具体字段看自己业务需求SystemUserFu user = new SystemUserFu();user.setUserid(String.valueOf(de.get("userid")));user.setDepartment(String.valueOf(de.get("department")));user.setName(String.valueOf(de.get("name")));user.setPosition(String.valueOf(de.get("position")));user.setMobile(String.valueOf(de.get("mobile")));user.setGender(String.valueOf(de.get("gender")));user.setEmail(String.valueOf(de.get("email")));user.setStatus(String.valueOf(de.get("status")));
//                            user.setOpenuserid(String.valueOf(de.get("open_userid")));//某些企业企业微信存在自建字段,可使用该方法获取自建字段List<Map<String, Object>> attrsJson = (List) JSONObject.parseObject(de.get("extattr").toString()).get("attrs");for (Map<String, Object> userDetailMap : attrsJson) {String name = userDetailMap.get("name").toString();if ("XXX工号".equals(name)) {String gy_code = userDetailMap.get("value").toString();
//                                    log.info("XXX工号:"+gy_code);// 具体字段看自己业务需求user.setUser_code(gy_code);}}users.add(user);}}}}}return users;}

4,拼接批量插入语句(批量插入语句调用数据库连接少,效率高,此处使用的是mysql数据库,别的数据库根据语法自行拼接)

public int insertUserDetailsNew(List<SystemUserFu> systemUserFuList) {StringBuffer insertSql = new StringBuffer();insertSql.append("insert into system_user_fu (name,department,userid,mobile,email,status,user_code,openuserid ) ");insertSql.append(" values ");for (SystemUserFu suf : systemUserFuList) {if (null != suf) {String name = suf.getName();String department = suf.getDepartment();String mobile = suf.getMobile();String email = suf.getEmail();String status = suf.getStatus();String user_code = suf.getUser_code();String userid = suf.getUserid();insertSql.append("('").append(name).append("',");insertSql.append("'").append(department).append("',");insertSql.append("'").append(userid).append("',");insertSql.append("'").append(mobile).append("',");insertSql.append("'").append(email).append("',");insertSql.append("'").append(status).append("',");insertSql.append("'").append(user_code).append("',");insertSql.append("'").append("'),");}}//循环结束,删除最后面的一个“,”号insertSql.deleteCharAt(insertSql.length() - 1);int insertCount = layoutService.getSqlMapper().insert(insertSql.toString());return insertCount;}

导入的公共包

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.io.IOException;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

其他平台自建包,此处不放出代码,根据自己项目情况使用自己的包,放出来仅给开发者参考是我项目的包非开源公共包

import com.xx.config.DynamicDataSource;
import com.xx.core.BaseService;
import com.xx.core.vo.Result;
import com.xx.modules.api.web.WeChatMsgSend;
import com.xx.modules.common.service.LayoutService;
import com.xx.modules.eam.entity.SystemUserFu;
import com.xx.modules.eam.mapper.SystemUserFuMapper;
import com.xx.modules.system.entity.SystemUser;
import com.xx.modules.system.mapper.SystemUserMapper;

相关类解释:SystemUserFu :自定义实体类,根据自己的实体类属性设置参数

layoutService:数据库操作类,根据自己的项目情况,调用dao层操作类
String url = String.format(ACCESSTOKE_URL, corpId, corpSecret);此处的参数为企业微信的管理员界面进行查询获得

http://www.ppmy.cn/news/661574.html

相关文章

同步联系人

从我的旧的N70手机中同步联系人到新的android手机中。 首先&#xff0c;安装Nokia的PC套件&#xff0c;导出手机中的所有联系人到电脑硬盘中。保存成&#xff08;.csv&#xff09;文件形式。 登陆gmail&#xff0c;在Gmail的左边有通讯录一览&#xff0c;可以导入csv文件&…

android版qq通讯录备份通讯录备份,安卓手机怎么备份通讯录 QQ同步助手备份通讯录方法-站长资讯中心...

随着智能手机的普及&#xff0c;智能手机带来的一些问题也日益增多&#xff0c;比如容易出现故障导致手机数据丢失&#xff0c;或者有时候换了手机导致原来手机上的数据没有导出&#xff0c;特别是通讯录/联系人资料。这时候&#xff0c;养成备份习惯的重要性就十分突出。那么怎…

通讯录同步【一】

最近在弄一个android通讯录同步的事&#xff0c;一直想把通讯录中联系人的修改时间拿出来。可是&#xff0c;找了半天&#xff0c;没找到相关的信息&#xff0c;跑到contacts2.db里面看了所有的表和字段&#xff0c;唯一发现了同步时可能会存有时间戳一样的信息&#xff0c;其次…

将纸质的电话号码导入到手机通讯录(二):使用网页版QQ同步助手将电话号码导入到手机通讯录...

第一步中已经获取到了电子版的电话号码&#xff0c;这一步将电子版导入到QQ同步助手中。 1、使用QQ号登陆网页版QQ同步助手&#xff0c;链接为&#xff1a;http://pim.qq.com/pim/login.jsp 2、登陆账号&#xff0c;找到右侧“更多操作”中的“导入联系人”&#xff0c;然后选择…

企业微信开发之通讯录同步

前言&#xff1a; 本文主要是用来拉取企业微信用户数据&#xff0c;企业微信有人员变更等参考我的另一篇文章。 目录 开发文档&#xff1a;http://work.weixin.qq.com/api/doc#10093 步骤&#xff1a; 第一步&#xff1a; 后台管理界面开启通讯录同步 第二步. Acces…

QQ通讯录

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient;namespace 扣扣通讯录 {class Game{public SqlConnection conn new SqlConnection("Data Source.;Initial Catalog…

钉钉通讯录同步

第一步&#xff1a;获取钉钉token private string GetToken() {var token CacheFactory.Cache().GetCache<string>("DDToken");if (!token.IsEmpty()) return token;var url "https://oapi.dingtalk.com/gettoken?corpid" CorpId "&c…

【通讯录教程】如何大批量导入手机号码到手机的通讯录,下面教你方法

很多人遇到一个问题&#xff0c;在做微商、还有整理客户资料等等过程中 有大批量的手机号需要导入到手机的通讯录保存 然后通过通讯录加客户微信&#xff0c;通过支付宝通讯录核实用户信息等等应用中 很多人也知道QQ同步助手也可以完成相应的动作&#xff0c;不过QQ自从8月份…