java获取微信版本号_第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息...

本文主要是介绍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"}

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

用户的基本信息类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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请求,需要的信任管理器

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

封装了一个公共类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** 获取用户信息

*

*@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和秘钥。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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版之如何获取微信用户基本信息...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800530

相关文章

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.