玩玩微信公众号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),临时二维码的生成方式参照官方接 ...
随机推荐
- Node.js爬虫-爬取慕课网课程信息
第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...
- 9.并发包非阻塞队列ConcurrentLinkedQueue
jdk1.7.0_79 队列是一种非常常用的数据结构,一进一出,先进先出. 在Java并发包中提供了两种类型的队列,非阻塞队列与阻塞队列,当然它们都是线程安全的,无需担心在多线程并发环境所带来的不可 ...
- 收集一些工作中常用的经典SQL语句
作为一枚程序员来说和数据库打交道是不可避免的,现收集一下工作中常用的SQL语句,希望能给大家带来一些帮助,当然不全面,欢迎补充! 1.执行插入语句,获取自动生成的递增的ID值 INSERT INTO ...
- DataTable数据导出Excel 并且下载
public string Excel(System.Data.DataTable dt) { //模板的路径 string strUploadPath = HttpContext.Current.S ...
- Python os模块实例之遍历目录及子目录指定扩展名的文件
需求:在该目录下有很多子目录(如下图,截图了部分),现要从该目录和所有子目录下找到所有扩展名为.meta的文件,并获取文件中第二行guid的值(': '后面的),然后将所有guid的值输出到另一文件中 ...
- MFC简单绘制安卓机器人
原始日期:2014-03-29 20:35 众所周知,google的安卓机器人形象十分经典,包括眼睛的位置,胳膊以及天线的位置都是有固定位置和比例的,而且是最恰当的,看起来最美.而微软基础类库MFC绘 ...
- linux发行版和内核的关系
转自:http://m.blog.csdn.net/article/details?id=50595230 Linux内核是计算机操作系统的核心.一个完整的 Linux发行版包括了内核与一些其他与文件 ...
- css里面position:relative与position:absolute的区别
position:absolute这个是绝对定位:是相对于浏览器的定位.比如:position:absolute:left:20px;top:80px; 这个容器始终位于距离浏览器左20px,距离浏览 ...
- Spring 学习一
Spring工作机制及为什么要用? 1.springmvc将所有的请求都提交给DispacherServlet,他会委托应用系统的其他模块负责对请求进行真正的处理工作. 2.DispacherServ ...
- kbengine新手教程
KBEngine服务端引擎开源项目地址(github):https://github.com/kbengine/kbengine引擎下载与编译:http://kbengine.org/cn/docs/ ...