本文主要是介绍java获取微信版本号_第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。
公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
开发者可通过OpenID来获取用户基本信息。请使用https协议。
我们可以看看官方的文档:获取用户的基本信息。
接口调用请求说明
参数说明
参数是否必须说明
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":"invalid appid"}
根据上面的信息,我们定义一个用户信息类来存放用户的基本信息。
用户的基本信息类
packagecom.souvc.weixin.pojo;/*** 类名: WeixinUserInfo
* 描述: 微信用户的基本信息
* 开发人员: souvc
* 创建时间: 2015-11-27
* 发布版本:V1.0 */
public classWeixinUserInfo {//用户的标识
privateString openId;//关注状态(1是关注,0是未关注),未关注时获取不到其余信息
private intsubscribe;//用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
privateString subscribeTime;//昵称
privateString nickname;//用户的性别(1是男性,2是女性,0是未知)
private intsex;//用户所在国家
privateString country;//用户所在省份
privateString province;//用户所在城市
privateString city;//用户的语言,简体中文为zh_CN
privateString language;//用户头像
privateString headImgUrl;publicString getOpenId() {returnopenId;
}public voidsetOpenId(String openId) {this.openId =openId;
}public intgetSubscribe() {returnsubscribe;
}public void setSubscribe(intsubscribe) {this.subscribe =subscribe;
}publicString getSubscribeTime() {returnsubscribeTime;
}public voidsetSubscribeTime(String subscribeTime) {this.subscribeTime =subscribeTime;
}publicString getNickname() {returnnickname;
}public voidsetNickname(String nickname) {this.nickname =nickname;
}public intgetSex() {returnsex;
}public void setSex(intsex) {this.sex =sex;
}publicString getCountry() {returncountry;
}public voidsetCountry(String country) {this.country =country;
}publicString getProvince() {returnprovince;
}public voidsetProvince(String province) {this.province =province;
}publicString getCity() {returncity;
}public voidsetCity(String city) {this.city =city;
}publicString getLanguage() {returnlanguage;
}public voidsetLanguage(String language) {this.language =language;
}publicString getHeadImgUrl() {returnheadImgUrl;
}public voidsetHeadImgUrl(String headImgUrl) {this.headImgUrl =headImgUrl;
}
}
View Code
我们先来看看获取用户信息的接口:
根据分析,获取用户的基本信息需要一个token。
Accesstoken类
packagecom.souvc.weixin.pojo;/*** 类名: Token
* 描述: 凭证
* 开发人员: souvc
* 创建时间: 2015-11-27
* 发布版本:V1.0 */
public classToken {//接口访问凭证
privateString accessToken;//凭证有效期,单位:秒
private intexpiresIn;publicString getAccessToken() {returnaccessToken;
}public voidsetAccessToken(String accessToken) {this.accessToken =accessToken;
}public intgetExpiresIn() {returnexpiresIn;
}public void setExpiresIn(intexpiresIn) {this.expiresIn =expiresIn;
}
}
View Code
https请求,需要的信任管理器
packagecom.souvc.weixin.util;importjava.security.cert.CertificateException;importjava.security.cert.X509Certificate;importjavax.net.ssl.X509TrustManager;/*** 类名: MyX509TrustManager
* 描述:信任管理器
* 开发人员: souvc
* 创建时间: 2015-11-27
* 发布版本:V1.0 */
public class MyX509TrustManager implementsX509TrustManager {//检查客户端证书
public void checkClientTrusted(X509Certificate[] chain, String authType) throwsCertificateException {
}//检查服务器端证书
public void checkServerTrusted(X509Certificate[] chain, String authType) throwsCertificateException {
}//返回受信任的X509证书数组
publicX509Certificate[] getAcceptedIssuers() {return null;
}
}
View Code
封装了一个公共类:
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
* 描述: 通用工具类
* 开发人员: souvc
* 创建时间: 2015-11-27
* 发布版本:V1.0 */
public classCommonUtil {private static Logger log = LoggerFactory.getLogger(CommonUtil.class);//凭证获取(GET)
public final static String token_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对象的属性值)*/
public staticJSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject= null;try{//创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { newMyX509TrustManager() };
SSLContext sslContext= SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, newjava.security.SecureRandom());//从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf =sslContext.getSocketFactory();
URL url= newURL(requestUrl);
HttpsURLConnection conn=(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) {
OutputStream outputStream=conn.getOutputStream();//注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}//从输入流读取返回内容
InputStream inputStream =conn.getInputStream();
InputStreamReader inputStreamReader= new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader= newBufferedReader(inputStreamReader);
String str= null;
StringBuffer buffer= 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(ConnectException ce) {
log.error("连接超时:{}", ce);
}catch(Exception e) {
log.error("https请求异常:{}", e);
}returnjsonObject;
}/*** 获取接口访问凭证
*
*@paramappid 凭证
*@paramappsecret 密钥
*@return
*/
public staticToken getToken(String appid, String appsecret) {
Token token= null;
String requestUrl= token_url.replace("APPID", appid).replace("APPSECRET", appsecret);//发起GET请求获取凭证
JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null !=jsonObject) {try{
token= newToken();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
}catch(JSONException e) {
token= null;//获取token失败
log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}returntoken;
}/*** URL编码(utf-8)
*
*@paramsource
*@return
*/
public staticString urlEncodeUTF8(String source) {
String result=source;try{
result= java.net.URLEncoder.encode(source, "utf-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}returnresult;
}/*** 根据内容类型判断文件扩展名
*
*@paramcontentType 内容类型
*@return
*/
public staticString getFileExt(String contentType) {
String fileExt= "";if ("image/jpeg".equals(contentType))
fileExt= ".jpg";else if ("audio/mpeg".equals(contentType))
fileExt= ".mp3";else if ("audio/amr".equals(contentType))
fileExt= ".amr";else if ("video/mp4".equals(contentType))
fileExt= ".mp4";else if ("video/mpeg4".equals(contentType))
fileExt= ".mp4";returnfileExt;
}
}
View Code
获取用户基本信息的方法:
/*** 获取用户信息
*
*@paramaccessToken 接口访问凭证
*@paramopenId 用户标识
*@returnWeixinUserInfo*/
public staticWeixinUserInfo getUserInfo(String accessToken, String openId) {
WeixinUserInfo weixinUserInfo= null;//拼接请求地址
String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
requestUrl= requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);//获取用户信息
JSONObject jsonObject = 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(Exception e) {if (0 ==weixinUserInfo.getSubscribe()) {
log.error("用户{}已取消关注", weixinUserInfo.getOpenId());
}else{int errorCode = jsonObject.getInt("errcode");
String errorMsg= jsonObject.getString("errmsg");
log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
}returnweixinUserInfo;
}
View Code
测试的方法:注意将以下替换为自己的appid和秘钥。
public static voidmain(String args[]) {//获取接口访问凭证
String accessToken = CommonUtil.getToken("xxxx", "xxxx").getAccessToken();/*** 获取用户信息*/WeixinUserInfo user= 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());
}
View Code
效果如下:
OpenID:ooK-yuJvd9gEegH6nRIen-gnLrVw
关注状态:1关注时间:1449021142昵称:风少
性别:1国家:中国
省份:广东
城市:广州
语言:zh_CN
头像:http://wx.qlogo.cn/mmopen/lOZIEvyfCa7aZQ7CkiamdpQicUDnGDEC0nzb7ZALjdl3TzFVFEHWM1AFqEXnicNIDeh0IQYTt0NrIP06ibg4W5WflASfFfX9qqib0/0
温馨提示:在测试之前,最后看过前几篇,搭建好环境。
其他文章关联:
这篇关于java获取微信版本号_第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!