玩玩微信公众号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),临时二维码的生成方式参照官方接 ...
随机推荐
- 数据库MySQL纯净卸载
有些人在安装MySQL后,卸载后再次安装时,一直安装不上去,到最后不得不重装系统来安装MySQL.这里教大家如何将MySQL卸载干净,不影响下次安装. 卸载过程 1.停止mysql服务 2.进行卸载 ...
- css3转盘抽奖
做到一个活动,需要转盘抽奖,于是想到使用css3的动画效果,其中主要包含transition的动画过渡,transform的rotate的旋转效果,在这里只用到2d的旋转, 特别强调的是,因为需要和后 ...
- Linux安装JDK完整步骤
1.检查一下系统中的jdk版本 [root@localhost software]# java -version 显示: openjdk version "1.8.0_102" O ...
- openjdk7之编译和debug
大家也可以看我的博客: openjdk7之编译和debug,这里格式更好. 为了更好的学习JDK.HotSpot等源码,需要能debug JDK.HotSpot等源码.本文主要讲述,怎么编译open ...
- Spring学习(19)--- Schema-based AOP(基于配置的AOP实现) --- 配置切面aspect
Spring所有的切面和通知器都必须放在一个<aop:config>内(可以配置包含多个<aop:config>元素),每个<aop:config>包含pointc ...
- vue init webpack-simple project 报错处理(connect ETIMEDOUT 192.30.253.112)
Failed to download repo vuejs-templates/webpack-simple: connect ETIMEDOUT 192.30.253.113:443 Failed ...
- window.close()方法对谷歌和火狐浏览器无效
在近期的项目中,遇到了一个问题,就是用户到新浪支付进行操作,操作成功后,指定到一个网页,需求是点击确定,关闭该网页.需求出来以后认为这种就是小菜一碟,直接用 window.close()方法就可以实现 ...
- vue-schart : vue.js 的图表组件
介绍 vue-schart 是使用vue.js封装了sChart.js图表库的一个小组件.支持vue.js 1.x & 2.x 仓库地址:https://github.com/lin-xin/ ...
- gawk的用法
GNU gawk工具的功能是将指定文件中符合指定模式(pattern)的行按指定的动作(action)进行格式化处理 语法:gawk [options] [program] [file-lis ...
- Mysql 根据时间戳按年月日分组统计
Mysql 根据时间戳按年月日分组统计create_time时间格式SELECT DATE_FORMAT(create_time,'%Y%u') weeks,COUNT(id) COUNT FROM ...