1.查询出access_Token的值
public String getAccessToken() {String access_token= redisTemplate.opsForValue().get("hbPaymentToken")+"";log.info("---redis get  hbPaymentToken--"+access_token);
if(StringUtils.isBlank(access_token)||access_token.equals("null")||access_token.equals("")){//记住,先去企业微信后台管理端开启api同步权限//corpid---企业微信corpid   //corpsecret  ---企业微信通讯录secretString access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=corpid&corpsecret=corpsecret";//           String access_token_url = wechatOpenProperties.getAccessTokenUrl()+"?corpid=ww17f8d10783494584&corpsecret=i5t-rh8bXeNCgihcYPrG9ZPpWkivzPJ69sv570osk6I";JSONObject jsonObject = JSONObject.parseObject(HttpClientUtil.doGet(access_token_url));access_token = jsonObject.getString("access_token");redisTemplate.opsForValue().set("hbPaymentToken",access_token,7000, TimeUnit.SECONDS);}return access_token;}
//同步通讯录
public  String getUser() {log.info("begin-----执行---更新员工信息-----getUser");List<HashMap<String, Object>> userList = new ArrayList<HashMap<String, Object>>();HashMap<String, Object> user = null;// 1查询出access_Token的值String access_token= getAccessToken() ;// 获取部门列表信息(不填则是查询出所有的部门列表)List<String> depts = getDepartmentList(access_token, "");// 根据部门信息去获取成员的详细信息(查询到的数据)List<WxUserInfo> users = getDepartmentUserDetails(depts, access_token, "0");for (WxUserInfo d : users) {user = new HashMap<String, Object>();user.put("userId", d.getUserId());user.put("name", d.getName());user.put("passWord", "123456");user.put("mobile", d.getMobile());user.put("power", 1);user.put("alias",d.getAlias());user.put("department", d.getDepartment());user.put("email", d.getEmail());user.put("position", d.getPosition());user.put("gender", d.getGender());user.put("status", d.getStatus());user.put("store",d.getStore());user.put("storeId",d.getStoreId());userList.add(user);}// 将其保存到数据库中wxUserInfoMapper.insertWxUserInfo(userList);}/*** 获取部门列表* @param accessToken* @param departmentId* @return*/public List<String> getDepartmentList(String accessToken, String departmentId) {List<String> departments = new ArrayList<String>();// 1.获取请求的urlString getDepartmentList_url = wechatOpenProperties.getDepartmentList_url()+"?access_token="+accessToken+"&id="+departmentId;// 2.调用接口,发送请求,获取成员JSONObject jsonObject = JSONObject.parseObject(HttpClientUtil.doGet(getDepartmentList_url));System.out.println("jsonObject:" + jsonObject.toString());// 3.错误消息处理if (null != jsonObject) {if (0 != jsonObject.getIntValue("errcode")) {log.error("获取部门列表 errcode:{} errmsg:{}",jsonObject.getIntValue("errcode"),jsonObject.get("errmsg"));} else {// 查询成功List<Map<String, Object>> mapListJson = (List)jsonObject.getJSONArray("department");QueryWrapper q = new QueryWrapper();departmentMapper.delete(q);departmentMapper.insertDepartment(mapListJson);if (null != mapListJson) {Department department = new Department();for (int i = 0; i < mapListJson.size(); i++) {Map<String, Object> dept = mapListJson.get(i);if (null != dept.get("id")) {departments.add(dept.get("id").toString());}}}}}return departments;}/*** 获取部门成员详情* @param depts* @param accessToken* @param fetchChild//是否遍历子部门的成员,一般不要遍历,除非你就只获取父级部门或者子部门为空,不然会导致数据重复* @return*/public List<WxUserInfo> getDepartmentUserDetails(List<String> depts, String accessToken, String fetchChild) {List<WxUserInfo> users = new ArrayList<>();for (String deptId : depts) {// 1.获取请求的urlString getDepartmentUserDetails_url = wechatOpenProperties.getDepartmentUserDetails_url()+"?access_token="+accessToken+"&department_id="+deptId+"&fetch_child="+fetchChild;// 2.调用接口,发送请求,获取部门成员JSONObject jsonObject =JSONObject.parseObject(HttpClientUtil.doGet(getDepartmentUserDetails_url));System.out.println("Contact_service----jsonObject:" + jsonObject.toString());// 3.错误消息处理if (null != jsonObject) {if (0 != jsonObject.getIntValue("errcode")) {log.error("获取部门成员详情失败 errcode:{} errmsg:{}",jsonObject.getIntValue("errcode"),jsonObject.get("errmsg"));}else{//查询成功的话//   JSONArray array=jsonObject.getJSONArray("userlist");List<Map<String, Object>> mapListJson = (List)jsonObject.getJSONArray("userlist");if(null!=mapListJson){for(int i=0;i<mapListJson.size();i++){Map<String, Object> de=mapListJson.get(i);//具体字段看自己业务需求WxUserInfo user=new WxUserInfo();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.setAlias(String.valueOf(de.get("alias")));//自定义字段取值,没有忽略JSONObject jsonObject1 = (JSONObject)de.get("extattr");List<JSONObject> attrsListJson = (List)(jsonObject1.getJSONArray("attrs"));for(int j =0;j<attrsListJson.size();j++ ){JSONObject jsonObject2 =attrsListJson.get(j);if(("门店").equals(jsonObject2.getString("name"))){user.setStore(jsonObject2.getString("value"));}if(("门店ID").equals(jsonObject2.getString("name"))){user.setStoreId(jsonObject2.getString("value"));}}                    users.add(user);}}}}}return users;}public class HttpClientUtil {public static String doGet(String url) {CloseableHttpClient httpCilent2 = HttpClients.createDefault();RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)   //设置连接超时时间.setConnectionRequestTimeout(5000) // 设置请求超时时间.setSocketTimeout(5000).setRedirectsEnabled(true)//默认允许自动重定向.build();HttpGet httpGet2 = new HttpGet(url);httpGet2.setConfig(requestConfig);httpGet2.setHeader("Content-Type","application/json;charset=UTF-8");;String srtResult = "";try {HttpResponse httpResponse = httpCilent2.execute(httpGet2);if(httpResponse.getStatusLine().getStatusCode() == 200){srtResult = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");//获得返回的结果}else if(httpResponse.getStatusLine().getStatusCode() == 400){//..........}else if(httpResponse.getStatusLine().getStatusCode() == 500){//.............}} catch (IOException e) {e.printStackTrace();}finally {try {httpCilent2.close();} catch (IOException e) {e.printStackTrace();}}return srtResult;}public static byte[] doGet_entity(String url) {CloseableHttpClient httpCilent2 = HttpClients.createDefault();HttpGet httpGet2 = new HttpGet(url);String srtResult = "";try {HttpResponse httpResponse = httpCilent2.execute(httpGet2);if(httpResponse.getStatusLine().getStatusCode() == 200){return EntityUtils.toByteArray(httpResponse.getEntity());}else if(httpResponse.getStatusLine().getStatusCode() == 400){//..........}else if(httpResponse.getStatusLine().getStatusCode() == 500){//.............}} catch (IOException e) {e.printStackTrace();}finally {try {httpCilent2.close();} catch (IOException e) {e.printStackTrace();}}return null;}public static String doPost(String url, Map<String, Object> paramsMap){CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(180 * 1000).setConnectionRequestTimeout(180 * 1000).setSocketTimeout(180 * 1000).setRedirectsEnabled(true).build();httpPost.setConfig(requestConfig);List<NameValuePair> nvps = new ArrayList<NameValuePair>();for (String key : paramsMap.keySet()) {nvps.add(new BasicNameValuePair(key, String.valueOf(paramsMap.get(key))));}try {httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));HttpResponse response = httpClient.execute(httpPost);String strResult = "";if (response.getStatusLine().getStatusCode() == 200) {strResult = EntityUtils.toString(response.getEntity(), "UTF-8");return strResult;} else {return "Error Response: " + response.getStatusLine().toString();}} catch (Exception e) {e.printStackTrace();return "post failure :caused by-->" + e.getMessage().toString();}finally {if(null != httpClient){try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}}public static String doPostForJson(String url, String jsonParams){CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(180 * 1000).setConnectionRequestTimeout(180 * 1000).setSocketTimeout(180 * 1000).setRedirectsEnabled(true).build();httpPost.setConfig(requestConfig);httpPost.setHeader("Content-Type","application/json;charset=UTF-8");  //try {httpPost.setEntity(new StringEntity(jsonParams,ContentType.create("application/json", "utf-8")));System.out.println("request parameters" + EntityUtils.toString(httpPost.getEntity()));HttpResponse response = httpClient.execute(httpPost);String strResult = "";if (response.getStatusLine().getStatusCode() == 200) {strResult = EntityUtils.toString(response.getEntity(), "UTF-8");return strResult;} else {return "Error Response: " + response.getStatusLine().toString();}} catch (Exception e) {e.printStackTrace();return "post failure :caused by-->" + e.getMessage().toString();}finally {if(null != httpClient){try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}}
}

企业微信通讯录同步-java相关推荐

  1. wechat-0020, 企业微信-通讯录同步

    首先获取access_token,这边只是简单的获取一下,真的做项目的时候,需要定时获取,可以在监听器或servlet中完成获取,并发到缓存中,之后单独开一篇文章.这边先入门 import com.g ...

  2. 企业微信通讯录同步 - Python版

    开发思路 重点关注 基于企业微信API,结合公司组织人员的数据结构,有多种应对场景: 第一优先使用公司组织code 同步至企业微信,前提是公司组织编码规则,适用于企业微信API 关于部门id 的定义( ...

  3. php企业微信通讯录同步设置接收事件服务器

    第一步登陆企业微信pc端管理后台设置好信息,先不要点击保存,会提示失败 随后根据填写的URL编写接口,接口代码如下: //就是第一步图中的token$token = 'xxx';//就是第一步图中的E ...

  4. java解析通讯录xml_企业微信通讯录回调 成员回调 (新增成员和编辑成员)xml解析错误...

    提问前,请确保阅读过项目首页说明以及wiki开发文档相关内容,尤其是常见问题部分.完成内容后,请务必移除包括本句在内的无用内容,以免影响阅读,否则直接关闭,谢谢合作~ 另外如果确认属于bug,而且已明 ...

  5. 企业微信通讯录回调密文解析及微信支付回调密文解析异常处理

    企业微信通讯录回调密文解析及微信支付回调密文解析异常处理 产生异常表现: javax.crypto.IllegalBlockSizeException: Input length must be mu ...

  6. Delphi结合百度图像识别接口进行企业微信通讯录数据采集

    本人水平有限,如有错误,欢迎指正! 思路:企业微信的通讯录采集,通过百度图像识别接口及坐标定位实现. 1.找到企业微信窗口的句柄 2.截取相应区域的图像(不要截过大的区域,以免识别速度慢) 3.将截取 ...

  7. 企业微信通讯录回调模板-XML转JSON-让回调不再难!

    我们在开发企业内部应用时,需要实现内部应用和企业微信的双向同步,即互联互通. 举个例子 同步一:企业内部OA系统在修改内部通讯录时,可以同步企业微信(直接调API接口即可) 同步二:在企业微信后台修改 ...

  8. 学习使用php获取企业微信通讯录管理接口代码

    学习企业微信接口开发之通讯录管理接口 登陆企业微信 具体代码 登陆企业微信 点击管理工具 如下图: 选择通讯录同步 点击开启api接口同步,进入配置页面 获取到对应的Secret,点击查看 点击发送, ...

  9. vue中自定义组件的用法(企业微信通讯录选人)

    组件的好处就是可以重复使用,坏处就是父子组件之间的通信相对比较麻烦,但是掌握了父子组件之间的通信后组件的应用就很简单了.下面是实战,最后是思路. 项目的index.html中引入https://res ...

最新文章

  1. 《Tuning I/O Performance》读后笔记
  2. uvalive 4795 Paperweight
  3. 好看的按钮组件_一个能决定命运的按钮,你敢来挑战吗?
  4. java简单系统_Java简单学生管理系统
  5. VC实现动画应用两则
  6. 设计一个移动应用的本地缓存机制
  7. 分布式理论-BASE理论
  8. 腾讯最新手游《和平精英》上线 魅族李楠评论亮了
  9. 3.2 Hadoop生态
  10. CodeSmith 第一次用,遇到问题了
  11. python语言适用于哪些领域_Python用于哪些领域
  12. 视频教程-华为HCNA网络工程师【从入门到精通】自学视频[肖哥]-华为认证
  13. dell微型计算机换内存条,内存条的更换,详细教您电脑的内存条怎么更换
  14. ERP电商管理系统开发实现功能
  15. 查看matlab当前路径,Matlab 如何查找当前路径下文件夹
  16. 给Ubuntu服务器安装图形化界面
  17. 线程的同步与互斥:互斥锁
  18. OO过时了吗?软件危机还有吗?
  19. 关于上海数据中心新政PUE小于1.3的节能对策解读-孙长青
  20. 阿里云盘小白羊版:一款支持满速上传下载的阿里云盘

热门文章

  1. 清明小长假,“报复性”旅游要来了
  2. 张蕾:北斗链社区发展白皮书
  3. Omni Recover for Mac(苹果手机数据恢复软件)
  4. 根据出生日期得到星座和生肖
  5. java竹青遍野,女神节专辑 ? 世界亏欠女神太多,还好有你来宠
  6. 复试编程c语言,(考研复试)C语言笔记
  7. linux tbz,TBZ文件扩展名 - 什么是.tbz以及如何打开? - ReviverSoft
  8. 汉(海)明码 | “十六宫格法” 破解汉(海)明码相关题目(附软考经典例题)
  9. Android-百度地图定位实现仿钉钉签到打卡功能(附源码)
  10. 下载高通 SDM845 Android 11.0 开源代码