公司因小程序项目先上线,公众号后开发,接到上级的安排实现小程序打通任务,看文档后发现:同一开发者账号只要是在微信开放平台绑定小程序与公众号以后,会有一个唯一的unionid,这个unionid腾讯公司下产品共享。这个unionid就是我们进行打通的关键。
先说一下思路:
1.微信小程序与公众号进行绑定后,在小程序调用wx.login()方法后会自动获取unionid,公众号根据官方文档在获取用户基本信息后会拿到相同的unionid,openid,nickname。。。等相关信息;
2.将小程序拿到的unionid进行数据库的更新操作,公众号拿到的unionid等信息,新建数据库表A进行存储;(注:在这一步,因为我们公司的原因,我们的公众号之前就有人关注了,那么在这之前,我通过公众号获取关注用户列表获取openid的列表,进行循环openid列表,在调用公众号获取用户基本信息列表进行储存数据库表A,循环结束后之前关注的人的信息就储存在数据库A,然后在进行,这一步的操作)
3.通过公众号关注/取关的事件相应,来进行数据库表A的增删操作,维护数据的新鲜度;
4.进行关联查询,到这一步我们会发现,通过unionid进行表的关联后我们已经实现数据的互通了
洋洋洒洒的说了一大堆,其实就是公众号的两个接口至关重要(1.关注/取关的事件相应接口 2.获取用户的基本信息接口)
有关于公众号的安全域名配置,服务器域名配置以及获取token就不在这里说了,百度一下一大堆。
代码实现:
第一步,获取公众号用户的openid列表操作,根据opneid进进行用户的基本信息的查询,存入数据库操作(因为我们公司的公众号关注人数只有1000+,所以我只调用了一次获取关注列表的接口)
//主要代码逻辑 //获取token AccessToken accessToken=wxUtils.getAccessToken(); String url="https://api.weixin.qq.com/cgi-bin/user/get?access_token="+accessToken.getAccessToken()+"&next_openid=";//获取所有用户openid JSONObject jsonObject = httpRequest(url, "GET", null); try { if(jsonObject.getString("errcode")!=null){ } }catch(Exception e) { } WeixinUserList userList = (WeixinUserList)JSONObject.toBean(jsonObject, WeixinUserList.class); if(null==userList) { return "无用户"; } userList.getTotal();//关注总人数 //用户openId 列表 WxOpenidInfo wxOpenidInfo=userList.getData(); List<String> openIdList=null; if(null!=wxOpenidInfo) { openIdList=wxOpenidInfo.getOpenid();//公众号返回的openid列表数据 if(null!=openIdList && openIdList.size()>0) { for(String opendid:openIdList) { //获取用户的基本信息(unionid机制) url="https://api.weixin.qq.com/cgi-bin/user/info? access_token="+accessToken.getAccessToken()+"&openid="+opendid+"&lang=zh_CN";//通过openid获取用户信息 jsonObject = httpRequest(url, "GET", null); WeixinUser wxUser=(WeixinUser)JSONObject.toBean(jsonObject, WeixinUser.class); //进行数据库表A的储存操作 int row = gzhService.addGZHUser(wxUser); } } } /** * 用户列表 * @author 一叶知秋plus * */ public class WeixinUserList{ private Integer total;//关注该公众账号的总用户数 private Integer count;//拉取的OPENID个数,最大值为10000 private WxOpenidInfo data;//列表数据,OPENID的列表 private String next_openid;//拉取列表的最后一个用户的OPENID private int errcode;//错误编码 private String errmsg="ok";//错误提示 public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public String getNext_openid() { return next_openid; } public void setNext_openid(String next_openid) { this.next_openid = next_openid; } public WxOpenidInfo getData() { return data; } public void setData(WxOpenidInfo data) { this.data = data; } public int getErrcode() { return errcode; } public void setErrcode(int errcode) { this.errcode = errcode; } public String getErrmsg() { return errmsg; } public void setErrmsg(String errmsg) { this.errmsg = errmsg; } } /** * 用户基本信息 * @author 一叶知秋plus * */ public class WeixinUser { private String subscribe;// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 private String openid;// 用户的标识,对当前公众号唯一 private String nickname;// 用户的昵称 private String sex;// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 private String city;// 用户所在城市 private String country;// 用户所在国家 private String province;// 用户所在省份 private String language;// 用户的语言,简体中文为zh_CN private List<String> tagid_list;//用户被打上的标签ID列表 private String unionid; //用户的unionid private String headimgurl;//用户的头像 public String getHeadimgurl() { return headimgurl; } public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; } public String getUnionid() { return unionid; } public void setUnionid(String unionid) { this.unionid = unionid; } public String getSubscribe() { return subscribe; } public void setSubscribe(String subscribe) { this.subscribe = subscribe; } public String getOpenid() { return openid; } public void setOpenid(String openid) { this.openid = openid; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public List<String> getTagid_list() { return tagid_list; } public void setTagid_list(List<String> tagid_list) { this.tagid_list = tagid_list; } } public class WxOpenidInfo { private List<String> openid; public List<String> getOpenid() { return openid; } public void setOpenid(List<String> openid) { this.openid = openid; } }
步骤二:关注/取关的事件响应接口