开启左侧

企微提取用户unionid

[复制链接]
在线会员 jQGCPeAbH 发表于 2022-12-30 14:58:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
媒介

营业需要 需要按照提炼企业微疑统统职工所具有客户 也即是提炼unionid 特此写个一站式东西类 一次性天生

pom
  1. <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency>
复造代码
东西类
  1. package ins.platfrom.test;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import ins.platfrom.dao.WXUserVoMapper;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import java.util.*;/**
  2. * 企微职工所绑定用户提炼
  3. * @author zhangle
  4. * @create 2021-04-21 10:41
  5. */@Slf4j@ServicepublicclassQiWeiTest{/**
  6.      * 微疑token大众变质
  7.      */private  String access_token;/**
  8.      * HTTP线程池 那个假设需要代办署理需要设置 瞅尔专客
  9.      * https://blog.csdn.net/HezhezhiyuLe/article/details/92395041
  10.      */@Autowiredprivate RestTemplate bean;/**
  11.      * 终极得到用户疑息保留交心  自界说不必 简略
  12.      */@Autowiredprivate WXUserVoMapper wxUserVoMapper;/**
  13.      * corpid  corpsecret 挖自己的公司
  14.      * 获得token get
  15.      * https://work.weixin.qq.com/api/doc/90000/90135/91039 参照文档
  16.      */privatefinal String tokenurl ="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=10086&corpsecret=10010";/**
  17.      * 获得部分 post  可简略ID 没有挖默认推与目前权力下看来部分
  18.      * https://work.weixin.qq.com/api/doc/90000/90135/90208
  19.      */private   String depturl ="https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=";/**
  20.      * 批质获得客户概略 post
  21.      * https://work.weixin.qq.com/api/doc/90000/90135/92994
  22.      */private  String userurl ="https://qyapi.weixin.qq.com/cgi-bin/externalcontact/batch/get_by_user?access_token=";/**
  23.      * 企微目前最下权力获得部分统统成员 department_id=1 fetch_child=1 递回 =0目前部分
  24.      * https://work.weixin.qq.com/api/doc/90000/90135/90200
  25.      */private  String deptuserurl ="https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?fetch_child=1&department_id=";/**
  26.      * 1
  27.      * 获得企微token
  28.      * @return token
  29.      */public String getToken(){
  30.         String tokenstr = bean.getForEntity(tokenurl, String.class).getBody();
  31.         log.info("获得token:"+tokenstr);
  32.         JSONObject tokenjson =parseStr(tokenstr);
  33.         access_token=tokenjson.get("access_token").toString();return access_token;}/**
  34.      * 0
  35.      */publicvoidstart(){//获得token
  36.         access_token=getToken();//得到女节面
  37.         Set<String> treeDept =findTreeDept();if(treeDept==null||treeDept.size()==0){
  38.             log.info("盘问部分为空");return;}//迭代女节面for(String deptparent : treeDept){//女节面下统统职工 递回
  39.             Set<String> deptUserByDId =findDeptUserByDId(deptparent);int unionidByUserId =findUnionidByUserId(deptUserByDId);
  40.             log.info("目前"+deptparent+"部分职工客户人数:"+unionidByUserId);}}/**
  41.      * 2
  42.      * 获得目前企微最下节面部分ID
  43.      * 当自己没有是目前公家号最下权力即不成以检察统统部分时使用
  44.      * @return 最下女节面
  45.      */public Set<String>findTreeDept(){
  46.         String deptstr = bean.getForEntity(depturl+access_token, String.class).getBody();
  47.         deptstr=iflegal(deptstr);if(deptstr==null||"".equals(deptstr)){
  48.             log.info("获得部分失利");return null;}
  49.         JSONObject jsonObject =parseStr(deptstr);//获得统统部分
  50.         String dept = jsonObject.get("department").toString();
  51.         List<JSONObject> departments = JSON.parseArray(dept, JSONObject.class);returnrecursiondept(departments);}/**
  52.      * 鉴别微疑交心前去可否正当
  53.      * @param resp
  54.      * @return
  55.      */public String iflegal(String resp){if(resp.contains(""errcode":0")){return resp;}
  56.         log.info("得敗預警:"+resp);if(resp.contains(""errcode":40014")||resp.contains(" "errcode":42001")){getToken();
  57.             log.info("规复:"+access_token);}return null;}/**
  58.      * 变换企微前去数据为json工具
  59.      * @param str
  60.      * @return
  61.      */public JSONObject parseStr(String str){return JSON.parseObject(str);}/**
  62.      * 盘问部分女ID
  63.      * @param departments以后 企微权力下统统部分包括 女子级
  64.      * @return 最下女节面
  65.      */public Set<String>recursiondept(List<JSONObject> departments){
  66.         Set<String> deptid =newHashSet<>();
  67.         Set<String> treedept =newHashSet<>();for(JSONObject department : departments){
  68.             deptid.add(department.getString("id"));}for(JSONObject department : departments){
  69.             String parentid = department.getString("parentid");//找没有到女ID即为最下节面if(!deptid.contains(parentid)){
  70.                 treedept.add(department.getString("id"));}}return treedept;}/**
  71.      * 3
  72.      * 颠末部分ID盘问目前部分职工 递回获得目前部分统统职工
  73.      * @param deptId 部分ID
  74.      * @return
  75.      */public Set<String>findDeptUserByDId(String deptId){//获得目前部分下的统统职工 包罗子节面
  76.         String deptuserstr = bean.getForEntity(deptuserurl+deptId+"&access_token="+access_token, String.class).getBody();
  77.         deptuserstr=iflegal(deptuserstr);if(deptuserstr==null||"".equals(deptuserstr)){
  78.             log.info("获得部分成员失利");return null;}
  79.         JSONObject jsonObject =parseStr(deptuserstr);
  80.         String dept = jsonObject.get("userlist").toString();
  81.         List<JSONObject> departments = JSON.parseArray(dept, JSONObject.class);if(departments==null||departments.size()==0){return null;}//来沉
  82.         Set<String> userids =newHashSet<>();for(JSONObject department : departments){
  83.             userids.add(department.getString("userid"));}
  84.         log.info("用户ID总额:"+userids.size());return userids;}/**
  85.      * 4
  86.      * 企微职工颠末职工ID查找用户unionid
  87.      * @param userids以后 部分统统职工
  88.      * @return
  89.      */publicintfindUnionidByUserId(Set<String> userids){//用户unionid汇合 统统用户包括 重复  假设女级部分仄止有多个 用户可以会重复 倡议把职员再次汇总 尔是因为肯定女级只需一个有最年夜权力才这样写int count=0;int size = userids.size();//来沉总用户(一个客户减了N个职工) 那个保存值多少十万出成就 SQL写对于减主键一把便胜利
  90.         Set<String> unionids =newHashSet<>();int formum=0;for(String userid : userids){
  91.             formum++;if(formum%1000==0){
  92.                 log.info("轮回到:"+formum+"/"+unionids.size()+"/"+size);}//及时革新token避免 生效
  93.             Set<String> personnelUsers =handleUserByUserId(userid,userurl+access_token);
  94.             unionids.addAll(personnelUsers);
  95.             count+=personnelUsers.size();}//用户unionid汇合有值便保留 能够按照营业需要 自止决定保存 IO SQL
  96.         ArrayList<String> unionidarr =newArrayList<>();for(String unionid : unionids){
  97.             unionidarr.add(unionid);//按照自己数据库才气分批次拔出 一次拔出 多少十万简单IO溢出if(unionidarr.size()==1000){
  98.                 Integer insertnum = wxUserVoMapper.insertQiWei(unionidarr);
  99.                 log.info(insertnum+"");
  100.                 unionidarr.clear();}}if(unionidarr.size()>0){
  101.             Integer insertnum = wxUserVoMapper.insertQiWei(unionidarr);
  102.             log.info(insertnum+"");}
  103.         log.info(" 职工总用户数:"+unionids.size()+"穿插成果散:"+count);return unionids.size();}/**
  104.      *处置 单个用户所具有的局部客户
  105.      * @param userid 用户ID
  106.      * @param url 及时链交
  107.      * @return
  108.      */public Set<String>handleUserByUserId(String userid,String url){
  109.         Set<String> unionids =newHashSet<>();
  110.         Map<String, Object> params =newHashMap<>();
  111.         params.put("userid",userid);//企微最年夜分页质
  112.         params.put("limit",100);
  113.         String openid ="";//启顶值 一个职工10W用户for(int i =0; i <1000; i++){
  114.             params.put("cursor",openid);
  115.             String resp = bean.postForEntity(url, params, String.class).getBody();
  116.             resp=iflegal(resp);if(resp == null ||"".equals(resp)){
  117.                 log.info("分歧法前去:"+userid);break;}if(i==999){
  118.                log.info("职工用户超限:"+userid);}
  119.             JSONObject jsonObject =parseStr(resp);//职工客户列表
  120.             List<JSONObject> external_contact_list = JSON.parseArray(jsonObject.get("external_contact_list").toString(), JSONObject.class);if(external_contact_list==null||external_contact_list.size()==0){break;}for(JSONObject customer : external_contact_list){
  121.                 String external_contact = customer.getString("external_contact");if(external_contact==null||"".equals(external_contact)){break;}//用户大略概略
  122.                 JSONObject customercontact =parseStr(external_contact);if(customercontact==null){break;}// 能够拿到 客户微疑名 name 头像 avatar 性别 gender 标记 unionid 范例 type更多概略需要换链交
  123.                 String unionid = customercontact.getString("unionid");if(unionid!=null&&!"".equals(unionid)){
  124.                     unionids.add(unionid);}}
  125.                 String next_cursor = jsonObject.getString("next_cursor");if("".equals(next_cursor)){break;}else{//迭代
  126.                     openid=next_cursor;}}return unionids;}}
复造代码
您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )