• 【微信公众号开发】【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;
        }
        
    } 
  • 相关阅读:
    判断数据库内容,在页面显示自定义数据case when
    其他窗体赋值给comboBox实现值的回显,并使赋的值处于选中状态(根据text获取selectedindex)
    DataGridView的按钮列的点击事件
    表单中各种input汇总
    块元素、内敛元素、行内块元素特点、相互转换、取消默认效果
    内联元素,取消间隙和默认效果
    margin-top塌陷
    linux下安装 配置 redis数据库
    redis数据库各种数据类型的增删改查命令
    python与mongodb的交互 增删改差
  • 原文地址:https://www.cnblogs.com/huashengweilong/p/7717826.html
Copyright © 2020-2023  润新知