微信公众平台开发实战java版_微信公众平台开发实战Java版之微信获取用户基本信息...

在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。

公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。

开发者可通过OpenID来获取用户基本信息。请使用https协议。

我们可以看看官方的文档:获取用户的基本信息。

接口调用请求说明

http请求方式: GET

参数说明

参数

是否必须

说明

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"}

根据上面的信息,我们定义一个用户信息类来存放用户的基本信息。

package com.souvc.weixin.pojo;

/**

* 类名: WeixinUserInfo

* 描述: 微信用户的基本信息

* 开发人员: souvc

* 创建时间: 2015-11-27

* 发布版本:V1.0

*/

public class WeixinUserInfo {

// 用户的标识

private String openId;

// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息

private int subscribe;

// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间

private String 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;

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 String getSubscribeTime() {

return subscribeTime;

}

public void setSubscribeTime(String 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;

}

}

我们先来看看获取用户信息的接口:

根据分析,获取用户的基本信息需要一个token。

package com.souvc.weixin.pojo;

/**

* 类名: Token

* 描述: 凭证

* 开发人员: souvc

* 创建时间: 2015-11-27

* 发布版本:V1.0

*/

public class Token {

// 接口访问凭证

private String accessToken;

// 凭证有效期,单位:秒

private int expiresIn;

public String getAccessToken() {

return accessToken;

}

public void setAccessToken(String accessToken) {

this.accessToken = accessToken;

}

public int getExpiresIn() {

return expiresIn;

}

public void setExpiresIn(int expiresIn) {

this.expiresIn = expiresIn;

}

}

https请求,需要的信任管理器

package com.souvc.weixin.util;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

/**

* 类名: MyX509TrustManager

* 描述:信任管理器

* 开发人员: souvc

* 创建时间: 2015-11-27

* 发布版本:V1.0

*/

public class MyX509TrustManager implements X509TrustManager {

// 检查客户端证书

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

// 检查服务器端证书

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

// 返回受信任的X509证书数组

public X509Certificate[] getAcceptedIssuers() {

return null;

}

}

封装了一个公共类:

package com.souvc.weixin.util;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.ConnectException;

import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSocketFactory;

import javax.net.ssl.TrustManager;

import net.sf.json.JSONException;

import net.sf.json.JSONObject;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.souvc.weixin.pojo.Token;

/**

* 类名: CommonUtil

* 描述: 通用工具类

* 开发人员: souvc

* 创建时间: 2015-11-27

* 发布版本:V1.0

*/

public class CommonUtil {

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请求

*

* @param requestUrl 请求地址

* @param requestMethod 请求方式(GET、POST)

* @param outputStr 提交的数据

* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)

*/

public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {

JSONObject jsonObject = null;

try {

// 创建SSLContext对象,并使用我们指定的信任管理器初始化

TrustManager[] tm = { new MyX509TrustManager() };

SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, new java.security.SecureRandom());

// 从上述SSLContext对象中得到SSLSocketFactory对象

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(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 = new BufferedReader(inputStreamReader);

String str = null;

StringBuffer buffer = new StringBuffer();

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);

}

return jsonObject;

}

/**

* 获取接口访问凭证

*

* @param appid 凭证

* @param appsecret 密钥

* @return

*/

public static Token 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 = new Token();

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"));

}

}

return token;

}

/**

* URL编码(utf-8)

*

* @param source

* @return

*/

public static String urlEncodeUTF8(String source) {

String result = source;

try {

result = java.net.URLEncoder.encode(source, "utf-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return result;

}

/**

* 根据内容类型判断文件扩展名

*

* @param contentType 内容类型

* @return

*/

public static String 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";

return fileExt;

}

}

获取用户基本信息的方法:

/**

* 获取用户信息

*

* @param accessToken 接口访问凭证

* @param openId 用户标识

* @return WeixinUserInfo

*/

public static WeixinUserInfo 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 = new WeixinUserInfo();

// 用户的标识

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);

}

}

}

return weixinUserInfo;

}

测试的方法:注意将以下替换为自己的appid和秘钥。

public static void main(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());

}

效果如下:

以上内容给大家介绍了微信公众平台开发实战Java版之微信获取用户基本信息,希望本文分享对大家今后的工作学习有所帮助,同时感谢大家一直以来对脚本之家网站的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值