微信公众平台开发实战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版之微信获取用户基本信息,希望本文分享对大家今后的工作学习有所帮助,同时感谢大家一直以来对毛票票网站的支持。