【微信公众号开发】【7】获取用户信息

前言:

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;
    }
    
} 
原文地址:https://www.cnblogs.com/huashengweilong/p/7717826.html