前言:
1,在关注者与公众号产生消息交互后,公众号可获得关注者的openID(加密后的微信号,用户openID和公众号是一对一的关系。开放平台绑定的公众号可用unionID识别同一用户,之后的章节将会介绍)。
2,公众号可通过本接口来根据openID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
3,用户头像要注意一下,它是一个网页链接,用户更换头像后过一段时间会失效,所以要转为图片存储起来
4,接口获取的微信用户信息需要存储在数据库,但用户体系最好不要用微信的(即不要所有表都依赖于openId,不然迁移公众号或者迁移到其他平台会很难搞)
5,接口获取用户信息是有每日次数限制的(5000000次),测试号(500000次),但是实际开发中发现测试号的次数其实很少,几百左右,用完就会提示超出上限
6,网页授权获取用户信息是没有限制的
正文:
获取用户信息(其中httpRequest方法在第三章)
private static String user_info_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
public static WeixinUserInfo getUserInfo(String accessToken, String openId, String appId) { logger.info("getUserInfo openId : " + openId); WeixinUserInfo weixinUserInfo = null; String requestUrl = String.format(WxConfig.USER_INFO_URL, accessToken, openId); //拼接请求地址 JSONObject jsonObject = HttpRequest.httpRequest(requestUrl, "GET", null); //获取用户信息 if (null != jsonObject) { try { logger.info("getUserInfo : " + jsonObject.toString()); if(jsonObject.containsKey("errcode")){ logger.info(String.format("获取微信用户信息失败,errcode:%s;errmsg:%s", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"))); }else { weixinUserInfo = new WeixinUserInfo(); weixinUserInfo.setOpenId(jsonObject.getString("openid")); // 用户的标识 weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe")); // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息 if (0 == jsonObject.getInt("subscribe")) { logger.info("用户已取消关注," + weixinUserInfo.getOpenId()); }else { weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));// 用户关注时间 weixinUserInfo.setNickname(jsonObject.getString("nickname")); // 昵称 weixinUserInfo.setSex(jsonObject.getInt("sex")); // 用户的性别(1是男性,2是女性,0是未知) weixinUserInfo.setCountry(jsonObject.getString("country")); // 用户所在国家 weixinUserInfo.setProvince(jsonObject.getString("province")); // 用户所在省份 weixinUserInfo.setCity(jsonObject.getString("city")); // 用户所在城市 weixinUserInfo.setLanguage(jsonObject.getString("language")); // 用户的语言,简体中文为zh_CN // 用户头像 String headimgurl = jsonObject.getString("headimgurl"); weixinUserInfo.setHeadImgUrl(downloadHeadImg(headimgurl, openId + ".jpg", appId, "head")); if(jsonObject.containsKey("unionid")){ weixinUserInfo.setUnionId(jsonObject.getString("unionid")); } } } } catch (Exception e) { logger.error("获取微信用户信息异常!", e); } } return weixinUserInfo; }
由url下载图片
private static String downloadHeadImg(String url, String fileName, String appId, String active) throws IOException { logger.info(String.format("downloadHeadImg url:%s fileName:%s appId:%s active:%s", url, fileName, appId, active)); if (StringUtils.isEmpty(url)) { url = "默认头像URL"; } String savePath = "head/"; String filePath = Config.MEDIA_FILE + savePath + fileName; //C:/xx/xx/head/cc.jpg URL imageUrl = new URL(url); URLConnection con = imageUrl.openConnection(); //打开连接 InputStream is = con.getInputStream(); //输入流 byte[] bs = new byte[8192]; //8K的数据缓冲 int len; //读取到的数据长度 File file = new File(filePath); OutputStream os = new FileOutputStream(file); //输出的文件流 //开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } //完毕,关闭所有链接 os.close(); is.close(); String realUrl = Config.REAL_MEDIA_DOMAIN + savePath + fileName; logger.info("downloadHeadImg success, realUrl=" + realUrl); return realUrl; }
用户的基本信息类
public class WeixinUserInfo { private String openId;// 用户的标识 private int subscribe;// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息 private String subscribeTime;// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 private String nickname;// 昵称 private int sex;// 用户的性别(1是男性,2是女性,0是未知) private String country;// 用户所在国家 private String province;// 用户所在省份 private String city;// 用户所在城市 private String language;// 用户的语言,简体中文为zh_CN private String headImgUrl;// 用户头像 private String UnionId;// 联合ID(只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。) public String getOpenId() { return openId; } public void setOpenId(String openId) { this.openId = openId; } public int getSubscribe() { return subscribe; } public void setSubscribe(int subscribe) { this.subscribe = subscribe; } public String getSubscribeTime() { return subscribeTime; } public void setSubscribeTime(String subscribeTime) { this.subscribeTime = subscribeTime; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } 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 getCity() { return city; } public void setCity(String city) { this.city = city; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public String getHeadImgUrl() { return headImgUrl; } public void setHeadImgUrl(String headImgUrl) { this.headImgUrl = headImgUrl; } public String getUnionId() { return UnionId; } public void setUnionId(String unionId) { UnionId = unionId; } }