微信公众平台开发实战Java版之微信获取用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。
公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
开发者可通过OpenID来获取用户基本信息。请使用https协议。
我们可以看看官方的文档:获取用户的基本信息。
接口调用请求说明
http请求方式:GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
参数
是否必须
说明
access_token
是
调用接口凭证
openid
是
普通用户的标识,对当前公众号唯一
lang
否
返回国家地区语言版本,zh_CN简体,zh_TW繁体,en英语
返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{
"subscribe":1,
"openid":"o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname":"Band",
"sex":1,
"language":"zh_CN",
"city":"广州",
"province":"广东",
"country":"中国",
"headimgurl":"http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time":1382694957,
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark":"",
"groupid":0
}
参数说明
参数
说明
subscribe
用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
openid
用户的标识,对当前公众号唯一
nickname
用户的昵称
sex
用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
city
用户所在城市
country
用户所在国家
province
用户所在省份
language
用户的语言,简体中文为zh_CN
headimgurl
用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
subscribe_time
用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
unionid
只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)
remark
公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
groupid
用户所在的分组ID
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalidappid"}
根据上面的信息,我们定义一个用户信息类来存放用户的基本信息。
packagecom.souvc.weixin.pojo;
/**
*类名:WeixinUserInfo</br>
*描述:微信用户的基本信息</br>
*开发人员:souvc</br>
*创建时间:2015-11-27</br>
*发布版本:V1.0</br>
*/
publicclassWeixinUserInfo{
//用户的标识
privateStringopenId;
//关注状态(1是关注,0是未关注),未关注时获取不到其余信息
privateintsubscribe;
//用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
privateStringsubscribeTime;
//昵称
privateStringnickname;
//用户的性别(1是男性,2是女性,0是未知)
privateintsex;
//用户所在国家
privateStringcountry;
//用户所在省份
privateStringprovince;
//用户所在城市
privateStringcity;
//用户的语言,简体中文为zh_CN
privateStringlanguage;
//用户头像
privateStringheadImgUrl;
publicStringgetOpenId(){
returnopenId;
}
publicvoidsetOpenId(StringopenId){
this.openId=openId;
}
publicintgetSubscribe(){
returnsubscribe;
}
publicvoidsetSubscribe(intsubscribe){
this.subscribe=subscribe;
}
publicStringgetSubscribeTime(){
returnsubscribeTime;
}
publicvoidsetSubscribeTime(StringsubscribeTime){
this.subscribeTime=subscribeTime;
}
publicStringgetNickname(){
returnnickname;
}
publicvoidsetNickname(Stringnickname){
this.nickname=nickname;
}
publicintgetSex(){
returnsex;
}
publicvoidsetSex(intsex){
this.sex=sex;
}
publicStringgetCountry(){
returncountry;
}
publicvoidsetCountry(Stringcountry){
this.country=country;
}
publicStringgetProvince(){
returnprovince;
}
publicvoidsetProvince(Stringprovince){
this.province=province;
}
publicStringgetCity(){
returncity;
}
publicvoidsetCity(Stringcity){
this.city=city;
}
publicStringgetLanguage(){
returnlanguage;
}
publicvoidsetLanguage(Stringlanguage){
this.language=language;
}
publicStringgetHeadImgUrl(){
returnheadImgUrl;
}
publicvoidsetHeadImgUrl(StringheadImgUrl){
this.headImgUrl=headImgUrl;
}
}
我们先来看看获取用户信息的接口:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
根据分析,获取用户的基本信息需要一个token。
packagecom.souvc.weixin.pojo;
/**
*类名:Token</br>
*描述:凭证</br>
*开发人员:souvc</br>
*创建时间:2015-11-27</br>
*发布版本:V1.0</br>
*/
publicclassToken{
//接口访问凭证
privateStringaccessToken;
//凭证有效期,单位:秒
privateintexpiresIn;
publicStringgetAccessToken(){
returnaccessToken;
}
publicvoidsetAccessToken(StringaccessToken){
this.accessToken=accessToken;
}
publicintgetExpiresIn(){
returnexpiresIn;
}
publicvoidsetExpiresIn(intexpiresIn){
this.expiresIn=expiresIn;
}
}
https请求,需要的信任管理器
packagecom.souvc.weixin.util;
importjava.security.cert.CertificateException;
importjava.security.cert.X509Certificate;
importjavax.net.ssl.X509TrustManager;
/**
*类名:MyX509TrustManager</br>
*描述:信任管理器</br>
*开发人员:souvc</br>
*创建时间:2015-11-27</br>
*发布版本:V1.0</br>
*/
publicclassMyX509TrustManagerimplementsX509TrustManager{
//检查客户端证书
publicvoidcheckClientTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{
}
//检查服务器端证书
publicvoidcheckServerTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{
}
//返回受信任的X509证书数组
publicX509Certificate[]getAcceptedIssuers(){
returnnull;
}
}
封装了一个公共类:
packagecom.souvc.weixin.util;
importjava.io.BufferedReader;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.UnsupportedEncodingException;
importjava.net.ConnectException;
importjava.net.URL;
importjavax.net.ssl.HttpsURLConnection;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.SSLSocketFactory;
importjavax.net.ssl.TrustManager;
importnet.sf.json.JSONException;
importnet.sf.json.JSONObject;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importcom.souvc.weixin.pojo.Token;
/**
*类名:CommonUtil</br>
*描述:通用工具类</br>
*开发人员:souvc</br>
*创建时间:2015-11-27</br>
*发布版本:V1.0</br>
*/
publicclassCommonUtil{
privatestaticLoggerlog=LoggerFactory.getLogger(CommonUtil.class);
//凭证获取(GET)
publicfinalstaticStringtoken_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
*发送https请求
*
*@paramrequestUrl请求地址
*@paramrequestMethod请求方式(GET、POST)
*@paramoutputStr提交的数据
*@returnJSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
publicstaticJSONObjecthttpsRequest(StringrequestUrl,StringrequestMethod,StringoutputStr){
JSONObjectjsonObject=null;
try{
//创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[]tm={newMyX509TrustManager()};
SSLContextsslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null,tm,newjava.security.SecureRandom());
//从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactoryssf=sslContext.getSocketFactory();
URLurl=newURL(requestUrl);
HttpsURLConnectionconn=(HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
//设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
//当outputStr不为null时向输出流写数据
if(null!=outputStr){
OutputStreamoutputStream=conn.getOutputStream();
//注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
//从输入流读取返回内容
InputStreaminputStream=conn.getInputStream();
InputStreamReaderinputStreamReader=newInputStreamReader(inputStream,"utf-8");
BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);
Stringstr=null;
StringBufferbuffer=newStringBuffer();
while((str=bufferedReader.readLine())!=null){
buffer.append(str);
}
//释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream=null;
conn.disconnect();
jsonObject=JSONObject.fromObject(buffer.toString());
}catch(ConnectExceptionce){
log.error("连接超时:{}",ce);
}catch(Exceptione){
log.error("https请求异常:{}",e);
}
returnjsonObject;
}
/**
*获取接口访问凭证
*
*@paramappid凭证
*@paramappsecret密钥
*@return
*/
publicstaticTokengetToken(Stringappid,Stringappsecret){
Tokentoken=null;
StringrequestUrl=token_url.replace("APPID",appid).replace("APPSECRET",appsecret);
//发起GET请求获取凭证
JSONObjectjsonObject=httpsRequest(requestUrl,"GET",null);
if(null!=jsonObject){
try{
token=newToken();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
}catch(JSONExceptione){
token=null;
//获取token失败
log.error("获取token失败errcode:{}errmsg:{}",jsonObject.getInt("errcode"),jsonObject.getString("errmsg"));
}
}
returntoken;
}
/**
*URL编码(utf-8)
*
*@paramsource
*@return
*/
publicstaticStringurlEncodeUTF8(Stringsource){
Stringresult=source;
try{
result=java.net.URLEncoder.encode(source,"utf-8");
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据内容类型判断文件扩展名
*
*@paramcontentType内容类型
*@return
*/
publicstaticStringgetFileExt(StringcontentType){
StringfileExt="";
if("image/jpeg".equals(contentType))
fileExt=".jpg";
elseif("audio/mpeg".equals(contentType))
fileExt=".mp3";
elseif("audio/amr".equals(contentType))
fileExt=".amr";
elseif("video/mp4".equals(contentType))
fileExt=".mp4";
elseif("video/mpeg4".equals(contentType))
fileExt=".mp4";
returnfileExt;
}
}
获取用户基本信息的方法:
/**
*获取用户信息
*
*@paramaccessToken接口访问凭证
*@paramopenId用户标识
*@returnWeixinUserInfo
*/
publicstaticWeixinUserInfogetUserInfo(StringaccessToken,StringopenId){
WeixinUserInfoweixinUserInfo=null;
//拼接请求地址
StringrequestUrl="https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
requestUrl=requestUrl.replace("ACCESS_TOKEN",accessToken).replace("OPENID",openId);
//获取用户信息
JSONObjectjsonObject=CommonUtil.httpsRequest(requestUrl,"GET",null);
if(null!=jsonObject){
try{
weixinUserInfo=newWeixinUserInfo();
//用户的标识
weixinUserInfo.setOpenId(jsonObject.getString("openid"));
//关注状态(1是关注,0是未关注),未关注时获取不到其余信息
weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));
//用户关注时间
weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));
//昵称
weixinUserInfo.setNickname(jsonObject.getString("nickname"));
//用户的性别(1是男性,2是女性,0是未知)
weixinUserInfo.setSex(jsonObject.getInt("sex"));
//用户所在国家
weixinUserInfo.setCountry(jsonObject.getString("country"));
//用户所在省份
weixinUserInfo.setProvince(jsonObject.getString("province"));
//用户所在城市
weixinUserInfo.setCity(jsonObject.getString("city"));
//用户的语言,简体中文为zh_CN
weixinUserInfo.setLanguage(jsonObject.getString("language"));
//用户头像
weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
}catch(Exceptione){
if(0==weixinUserInfo.getSubscribe()){
log.error("用户{}已取消关注",weixinUserInfo.getOpenId());
}else{
interrorCode=jsonObject.getInt("errcode");
StringerrorMsg=jsonObject.getString("errmsg");
log.error("获取用户信息失败errcode:{}errmsg:{}",errorCode,errorMsg);
}
}
}
returnweixinUserInfo;
}
测试的方法:注意将以下替换为自己的appid和秘钥。
publicstaticvoidmain(Stringargs[]){
//获取接口访问凭证
StringaccessToken=CommonUtil.getToken("xxxx","xxxx").getAccessToken();
/**
*获取用户信息
*/
WeixinUserInfouser=getUserInfo(accessToken,"ooK-yuJvd9gEegH6nRIen-gnLrVw");
System.out.println("OpenID:"+user.getOpenId());
System.out.println("关注状态:"+user.getSubscribe());
System.out.println("关注时间:"+user.getSubscribeTime());
System.out.println("昵称:"+user.getNickname());
System.out.println("性别:"+user.getSex());
System.out.println("国家:"+user.getCountry());
System.out.println("省份:"+user.getProvince());
System.out.println("城市:"+user.getCity());
System.out.println("语言:"+user.getLanguage());
System.out.println("头像:"+user.getHeadImgUrl());
}
效果如下:
OpenID:ooK-yuJvd9gEegH6nRIen-gnLrVw
关注状态:1
关注时间:1449021142
昵称:风少
性别:1
国家:中国
省份:广东
城市:广州
语言:zh_CN
头像:http://wx.qlogo.cn/mmopen/lOZIEvyfCa7aZQ7CkiamdpQicUDnGDEC0nzb7ZALjdl3TzFVFEHWM1AFqEXnicNIDeh0IQYTt0NrIP06ibg4W5WflASfFfX9qqib0/0
以上内容给大家介绍了微信公众平台开发实战Java版之微信获取用户基本信息,希望本文分享对大家今后的工作学习有所帮助,同时感谢大家一直以来对毛票票网站的支持。