【微信公众号开发】【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在获取微信公众号网页授权和用户信息之前,我们需要先了解微信公众号的几个概念: 1. AppID和AppSecret:AppID是每个公众号独有的身份标识,在开发者中心中可查看;而AppSecret则是用于获取access_token的密钥。 2. 授权作用域:微信网页授权分为静默授权和弹出授权,前者只能获取用户基本信息,后者可以获取用户详细信息。 3. 网页授权流程:用户同意授权后,微信后台会将授权code返回给开发者,开发者可以使用该code获取access_token,并通过access_token获取用户信息。 接下来,我们就可以开始使用JSP获取微信公众号网页授权和用户信息了。 1. 获取授权链接 首先,我们需要构造出授权链接,以便用户点击授权。 String redirect_uri = URLEncoder.encode("http://your.domain.com/callback.jsp", "UTF-8"); String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; 其中,redirect_uri是授权后重定向的回调链接地址,需要进行URLEncode编码;scope=snsapi_userinfo表示需要用户授权获取详细信息。 2. 获取授权code 当用户点击授权后,需要在回调页面(上面代码中的callback.jsp)中获取授权code。 String code = request.getParameter("code"); 3. 获取access_token 利用上一步获取的授权code,构造出获取access_token的链接,并向该链接发送HTTP GET请求,获取access_token。 String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code"; URL url = new URL(tokenUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuffer stringBuffer = new StringBuffer(); while ((line = bufferedReader.readLine()) != null) { stringBuffer.append(line); } JSONObject json = new JSONObject(stringBuffer.toString()); String accessToken = json.getString("access_token"); String openid = json.getString("openid"); 4. 获取用户信息 利用获取到的access_token和openid,可以构造出获取用户信息的链接。 String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; URL url = new URL(userInfoUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuffer stringBuffer = new StringBuffer(); while ((line = bufferedReader.readLine()) != null) { stringBuffer.append(line); } JSONObject json = new JSONObject(stringBuffer.toString()); String nickname = json.getString("nickname"); String headimgurl = json.getString("headimgurl"); 以上就是使用JSP获取微信公众号网页授权和用户信息的流程。需要注意的是,获取用户信息需要用户同意授权获取详细信息,并且在构造链接时需要进行URL编码。另外,在实际开发过程中,建议将获取access_token和获取用户信息的代码封装为工具类,以便重复使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值