玩玩微信公众号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),临时二维码的生成方式参照官方接 ...
随机推荐
- 一天搞定CSS:边框border--02
每一个标签都是一个盒子,具体见HTML教程 因此,每一个标签有大小,有边框 1.border样式:单一样式 2.border样式:复合样式 border: 粗细 类型 颜色: 3.border方向 4 ...
- Chapter 9:Noise-Estimation Algorithms
作者:桂. 时间:2017-06-14 12:08:57 链接:http://www.cnblogs.com/xingshansi/p/6956556.html 主要是<Speech enha ...
- [0] WCF开发下,提示HTTP 无法注册 URL 进程不具有此命名空间的访问权限
Visual Studio以管理员的身份运行就可以了.
- nodejs构建多房间简易聊天室
1.前端界面代码 前端不是重点,够用就行,下面是前端界面,具体代码可到github下载. 2.服务器端搭建 本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制, ...
- 如何在linux如何安装nginx服务器
1.进入命令窗口: 2.进入nginx.org 网站 下载安装包nginx-1.8.0.tar.gz 3.进入下载的文件夹 4.加压下载的压缩包 tar -zxvf nginx-1.8.0.tar. ...
- Discuz搜索改为指向帖子
安装的版本是DiscuzX2.5,搜索的时候发现默认指向的是门户里的文章搜索,但程序都没有安装门户,只有论坛,所以不能搜索文章. 在网上找了半天终于找到修改的办法了. <input name=& ...
- 小发现之location.search与location.hash问题
背景 用过Vue Router的童鞋应该对路由传参的方式多多少少有些印象,Vue Router支持两种传参方式:query与params:其中query方式就是动态地在路由url后面追加参数,就是ht ...
- Feign使用Hystrix无效原因及解决方法
最近项目重构使用了Spring Boot和Spring Cloud.这两者结合确实给项目带来了方便,同时也遇到了一些问题.其中使用feign作为服务消费,但是断路器hystrix一直不起作用让人很费解 ...
- 安装旧版的docker-engine-1.12.6
执行kubeadm init --api-advertise-addresses=172.16.160.211命令的时候,提示docker版本太新了 想要安装旧版docker,可以使用以下方法: yu ...
- Linux常用操作命令(二)
ab命令压测: ab -n 1 -c 1 -p post.txt -T 'application/x-www-form-urlencoded' -H 'User-U:2Lh72GM2UumEAnZzM ...