玩玩微信公众号Java版之五:获取关注用户信息
参数 | 是否必须 | 说明 |
access_token | 是 | 调用接口凭证 |
openid | 是 | 普通用户的标识,对当前公众号唯一 |
lang | 否 | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
参数 | 是否必须 | 说明 |
openid | 是 | 用户的标识,对当前公众号唯一 |
lang | 否 | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |
参数 | 是否必须 | 说明 |
access_token | 是 | 调用接口凭证 |
next_openid | 是 | 第一个拉取的OPENID,不填默认从头开始拉取 |
参数 | 说明 |
total | 关注该公众账号的总用户数 |
count | 拉取的OPENID个数,最大值为10000 |
data | 列表数据,OPENID的列表 |
next_openid | 拉取列表的最后一个用户的OPENID |
/**
* 微信用户信息类
* @author Damon
*/
public class UserInfo
{ // 用户的标识
private String openId; // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
private int subscribe; // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
private int subscribetime; // 昵称
private String nickname; // 用户的性别(1是男性,2是女性,0是未知)
private int sex; // 用户所在国家
private String country; // 用户所在省份
private String province; // 用户所在城市
private String city; // 用户的语言,简体中文为zh_CN
private String language; // 用户头像
private String headimgurl; private String remark; private int groupid; 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 int getSubscribetime()
{
return subscribetime;
} public void setSubscribetime(int 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 getRemark()
{
return remark;
} public void setRemark(String remark)
{
this.remark = remark;
} public int getGroupid()
{
return groupid;
} public void setGroupid(int groupid)
{
this.groupid = groupid;
} }


/**
* 获取公众号关注的用户openid
* @return
*/
public List<String> getUserOpenId(String access_token, String nextOpenid)
{
String path = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
path = path.replace("ACCESS_TOKEN", access_token).replace("NEXT_OPENID", nextOpenid);
System.out.println("path:" + path); List<String> result = null;
try
{
String strResp = WeChatUtil.doHttpsGet(path, "");
System.out.println(strResp); Map map = WeChatUtil.jsonToMap(strResp);
Map tmapMap = (Map) map.get("data"); result = (List<String>) tmapMap.get("openid"); System.out.println(result.toString()); }
catch (HttpException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} return result;
}
获取到openi的信息后,也可以先存储起来(具体看项目需要了),或再等详细信息后才存储,
/**
* 通过用户openid 获取用户信息
* @param userOpenids
* @return
*/
public List<UserInfo> getUserInfo(List<String> userOpenids)
{
// 1、获取access_token
// 使用测试 wx9015ccbcccf8d2f5 02e3a6877fa5fdeadd78d0f6f3048245
WeChatTokenService tWeChatTokenService = new WeChatTokenService();
String tAccess_Token = tWeChatTokenService.getToken("wx9015ccbcccf8d2f5", "02e3a6877fa5fdeadd78d0f6f3048245").getToken(); // 2、封装请求数据
List user_list = new ArrayList<Map>();
for (int i = 0; i < userOpenids.size(); i++)
{
String openid = userOpenids.get(i);
Map tUserMap = new HashMap<String, String>();
tUserMap.put("openid", openid);
tUserMap.put("lang", "zh_CN");
user_list.add(tUserMap);
}
System.out.println(user_list.toString());
Map requestMap = new HashMap<String, List>();
requestMap.put("user_list", user_list);
String tUserJSON = JSONObject.fromObject(requestMap).toString(); // 3、请求调用
String result = getUserInfobyHttps(tAccess_Token, tUserJSON);
System.out.println(result); // 4、解析返回将结果
return parseUserInfo(result);
}
其中详细方法实现如下:
/**
* 解析返回用户信息数据
* @param userInfoJSON
* @return
*/
private List<UserInfo> parseUserInfo(String userInfoJSON)
{
List user_info_list = new ArrayList<UserInfo>(); Map tMapData = WeChatUtil.jsonToMap(userInfoJSON); List<Map> tUserMaps = (List<Map>) tMapData.get("user_info_list"); for (int i = 0; i < tUserMaps.size(); i++)
{
UserInfo tUserInfo = new UserInfo();
tUserInfo.setSubscribe((Integer) tUserMaps.get(i).get("subscribe"));
tUserInfo.setSex((Integer) tUserMaps.get(i).get("sex"));
tUserInfo.setOpenId((String) tUserMaps.get(i).get("openid"));
tUserInfo.setNickname((String) tUserMaps.get(i).get("nickname"));
tUserInfo.setLanguage((String) tUserMaps.get(i).get("language"));
tUserInfo.setCity((String) tUserMaps.get(i).get("city"));
tUserInfo.setProvince((String) tUserMaps.get(i).get("province"));
tUserInfo.setCountry((String) tUserMaps.get(i).get("country"));
tUserInfo.setHeadimgurl((String) tUserMaps.get(i).get("headimgurl"));
tUserInfo.setSubscribetime((Integer) tUserMaps.get(i).get("subscribe_time"));
tUserInfo.setRemark((String) tUserMaps.get(i).get("remark"));
tUserInfo.setGroupid((Integer) tUserMaps.get(i).get("groupid"));
user_info_list.add(tUserInfo);
} return user_info_list;
} /**
* 调用HTTPS接口,获取用户详细信息
* @param access_token
* @param requestData
* @return
*/
private String getUserInfobyHttps(String access_token, String requestData)
{
// 返回报文
String strResp = "";
String path = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN";
path = path.replace("ACCESS_TOKEN", access_token); try
{
strResp = WeChatUtil.doHttpsPost(path, requestData);
}
catch (HttpException e)
{
// 发生致命的异常,可能是协议不对或者返回的内容有问题
System.out.println("Please check your provided http address!" + e);
e.printStackTrace();
}
catch (IOException e)
{
// 发生网络异常
}
catch (Exception e)
{
System.out.println(e);
}
finally
{}
return strResp;
}
测试方法如下:
public static void main(String[] args)
{
WeChatUserService tChatUserService = new WeChatUserService();
tChatUserService.getUserInfo(tChatUserService.getUserOpenId(new WeChatTokenService().getToken("appid", "appSceret").getToken(), ""));
}

可用把最终过去的用户信息存到数据库,后面的就由大家去发挥啦!
玩玩微信公众号Java版之五:获取关注用户信息的更多相关文章
- 玩玩微信公众号Java版之七:自定义微信分享
前面已经学会了微信网页授权,现在微信网页的功能也可以开展起来啦! 首先,我们先来学习一下分享,如何在自己的页面获取分享接口及让小伙伴来分享呢? 今天的主人公: 微信 JS-SDK, 对应官方链接为:微 ...
- 玩玩微信公众号Java版之六:微信网页授权
我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧! 参考官方文档:https://mp.weixin.qq.com/wiki?t=resource ...
- 玩玩微信公众号Java版之四:自定义公众号菜单
序: 微信公众号基本的菜单很难满足个性化及多功能的实现,那么微信能否实现自定菜单呢,具体的功能又如何去实现么?下面就来学习一下微信自定义公众号菜单吧! 自定义菜单接口可实现多种类型按钮,如下: 1.c ...
- 玩玩微信公众号Java版之一:配置微信公众平台服务器信息
在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦! 第一.准备好服务端接口 定义一个http服务接口,主要分为如下几步: 1.创建一个servlet类,用来接收请求: ...
- 玩玩微信公众号Java版之准备
微信自2013年流行起来,现在的发展已经超过了我们的想象,那么对应的公众平台,小程序等都是让人眼前一亮的东西,这里来学习一下微信工作号的对接,实现为Java,希望大家一起学习! 这里大概描述一下所 ...
- 玩玩微信公众号Java版之三:access_token及存储access_token
微信官方参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 基本说明: access_token是 ...
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
- 微信公众号Java接入demo
微信公众号Java接入demo 前不久买了一台服务,本来是用来当梯子用的,后来买了一个域名搭了一个博客网站,后来不怎么在上面写博客一直闲着,最近申请了一个微信公众号就想着弄点什么玩玩.周末没事就鼓捣了 ...
- java 扫描微信公众号二维码,关注并登录逻辑
场景:户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: 系统生成带参数的临时二维码:参数 scene_str 自定义为唯一值(可以是uuid),临时二维码的生成方式参照官方接 ...
随机推荐
- GPU编程--宏观理解篇(1)
GPU编程与CPU编程最大的不同可以概括为以下两点: "The same program is executed on many data elements in parallel" ...
- 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快
前言: 使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合: 1.原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快 2.不包含任何第三方库/框架,可以灵活 ...
- 纯css实现横向下拉菜单
自己最近在捣腾css代码,不光是js能做很多有趣的东西,这货也可以做很多东西,现在把自己的一些作品分享给大家. 做得有点粗糙,大家根据这个思路来,可以自己修改修改. 关于demo:这是一个横向下拉的菜 ...
- Spring学习(21)--- AOP之Advice应用(上)
前置通知(Before advice) 在某个连接点(join point)之前执行的通知,但不能阻止连接点前的执行(除非它抛出异常) 返回后通知(After returning advice) 在某 ...
- scrapy调试时出现 ImportError: No module named win32api
windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...
- PO/VO/POJO/BO/VO图解
- VisualSVN 5.1.7破译License Key
前面手敲一些简要的软件说明:visualSVN server大家都不陌生,服务器上的版本控制系统,一般配套Tortoisesvn(小乌龟)使用.本次介绍的这个visualsvn属于VisualStud ...
- PHP中递归最详解释.
说到递归函数想必会有很多同学感到晕晕的,很难绕,容易绕错,那下面就让我来为大家详解一下. 首先,什么是递归函数呢? 1.所谓递归:指的是在函数内部,调用函数自身的操作.2.递归分两布:递(从最外层函数 ...
- 学习mysql语法--基础篇(二)
前 言 mysql mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: [SQL语句的组成] DML ...
- JS对象创建常用方式及原理分析
====此文章是稍早前写的,本次属于文章迁移@2017.06.27==== 前言 俗话说"在js语言中,一切都对象",而且创建对象的方式也有很多种,所以今天我们做一下梳理 最简单的 ...