微信公眾平臺開發實戰Java版之微信獲取使用者基本資訊
公眾號可通過本介面來根據OpenID獲取使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和關注時間。
開發者可通過OpenID來獲取使用者基本資訊。請使用https協議。
我們可以看看官方的文件:獲取使用者的基本資訊。
介面呼叫請求說明
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
引數說明
返回說明
正常情況下,微信會返回下述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
}
引數說明:
錯誤時微信會返回錯誤碼等資訊,JSON資料包示例如下(該示例為AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
根據上面的資訊,我們定義一個使用者資訊類來存放使用者的基本資訊。
package com.souvc.weixin.pojo;
/**
* 類名: WeixinUserInfo </br>
* 描述: 微信使用者的基本資訊 </br>
* 開發人員: souvc </br>
* 建立時間: 2015-11-27 </br>
* 釋出版本:V1.0 </br>
*/
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;
}
}
我們先來看看獲取使用者資訊的介面:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
根據分析,獲取使用者的基本資訊需要一個token。
package com.souvc.weixin.pojo;
/**
* 類名: Token </br>
* 描述: 憑證 </br>
* 開發人員: souvc </br>
* 建立時間: 2015-11-27 </br>
* 釋出版本:V1.0 </br>
*/
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 </br>
* 描述:信任管理器 </br>
* 開發人員: souvc </br>
* 建立時間: 2015-11-27 </br>
* 釋出版本:V1.0 </br>
*/
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 </br>
* 描述: 通用工具類 </br>
* 開發人員: souvc </br>
* 建立時間: 2015-11-27 </br>
* 釋出版本:V1.0 </br>
*/
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());
}
效果如下:OpenID:ooK-yuJvd9gEegH6nRIen-gnLrVw
關注狀態:1
關注時間:1449021142
暱稱:風少
性別:1
國家:中國
省份:廣東
城市:廣州
語言:zh_CN
頭像:http://wx.qlogo.cn/mmopen/lOZIEvyfCa7aZQ7CkiamdpQicUDnGDEC0nzb7ZALjdl3TzFVFEHWM1AFqEXnicNIDeh0IQYTt0NrIP06ibg4W5WflASfFfX9qqib0/0
相關推薦
微信公眾平臺開發實戰Java版之微信獲取使用者基本資訊
在關注者與公眾號產生訊息互動後,公眾號可獲得關注者的OpenID(加密後的微訊號,每個使用者對每個公眾號的OpenID是唯一的。對於不同公眾號,同一使用者的openid不同)。 公眾號可通過本介面來根據OpenID獲取使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和
第八篇 :微信公眾平臺開發實戰Java版之如何網頁授權獲取使用者基本資訊
第一部分:微信授權獲取基本資訊的介紹 我們首先來看看官方的文件怎麼說: 如果使用者在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取使用者基本資訊,進而實現業務邏輯。 關於網頁授權回撥域名的說明 1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的開發者中心頁配置授權
第九篇 :微信公眾平臺開發實戰Java版之如何實現自定義分享內容
第一部分:微信JS-SDK介紹 微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。 通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信使用者提供更優質的網頁
第六篇 :微信公眾平臺開發實戰Java版之如何自定義微信公眾號選單
我們來了解一下 自定義選單建立介面: 自定義選單查詢介面: 自定義選單刪除介面: 自定義選單介面可實現多種型別按鈕,如下: 1、click:點選推事件 使用者點選click型別按鈕後,微信伺服器會通過訊息介面推送訊息型別為event 的結構給開發者(參考訊息介面指
第一篇:微信公眾平臺開發實戰Java版之瞭解微信公眾平臺基礎知識以及資料準備
相信很多人或多或少聽說了微信公眾平臺的火熱。但是開發還是有一點門檻,鑑於挺多朋友問我怎麼開發,問多了,自己平時也進行以下總結。 所以下面給大家分享一下我的經驗: 第一部分 介紹微信公眾號的一些簡單介紹以及微信扮演的一些角色,微信公眾號的重要性。 1. 微信公眾號是什麼? 官網
第五篇 :微信公眾平臺開發實戰Java版之如何獲取公眾號的access_token以及快取access_token
一、access_token簡介 為了使第三方開發者能夠為使用者提供更多更有價值的個性化服務,微信公眾平臺 開放了許多介面,包括自定義選單介面、客服介面、獲取使用者資訊介面、使用者分組介面、群發介面等, 開發者在呼叫這些介面時,都需要傳入一個相同的引數 access_token,它是公眾賬號的全域性唯一票
第三篇 :微信公眾平臺開發實戰Java版之請求訊息,響應訊息以及事件訊息類的封裝
微信伺服器和第三方伺服器之間究竟是通過什麼方式進行對話的? 下面,我們先看下圖: 其實我們可以簡單的理解: (1)首先,使用者向微信伺服器傳送訊息; (2)微信伺服器接收到使用者的訊息處理之後,通過開發者配置的URL和Token 來找到第三方伺服器,並以XML形式向第三方伺服器傳送訊息
第四篇 :微信公眾平臺開發實戰Java版之完成訊息接受與相應以及訊息的處理
溫馨提示: 這篇文章是依賴前幾篇的文章的。 首先,我們看看原來寫的dopost方法: /** * 處理微信伺服器發來的訊息 */ public void doPost(HttpServletRequest request, Http
第七篇 :微信公眾平臺開發實戰Java版之如何獲取微信使用者基本資訊
在關注者與公眾號產生訊息互動後,公眾號可獲得關注者的OpenID(加密後的微訊號,每個使用者對每個公眾號的OpenID是唯一的。對於不同公眾號,同一使用者的openid不同)。 公眾號可通過本介面來根據OpenID獲取使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和關注時間。 開發者可通過Ope
第二篇 :微信公眾平臺開發實戰Java版之開啟開發者模式,接入微信公眾平臺開發
第一部分:微信公眾號對接的基本介紹 一、填寫伺服器配置資訊的介紹 登入微信公眾平臺官網後,進入到公眾平臺後臺管理頁面。 選擇 公眾號基本設定-》基本配置 ,點選“修改配置”按鈕,填寫伺服器地址(URL)、Token和EncodingAESKey。 微信公眾號配置介面: 以上
微信公眾平臺開發實戰Java版之如何獲取公眾號的access_token以及快取access_token
一、access_token簡介 為了使第三方開發者能夠為使用者提供更多更有價值的個性化服務,微信公眾平臺 開放了許多介面,包括自定義選單介面、客服介面、獲取使用者資訊介面、使用者分組介面、群發介面等, 開發者在呼叫這些介面時,都需要傳入一個相同的引數 access_token,它是公眾賬號的全域性唯一票據,
微信公眾平臺開發教程Java版(六) 事件處理(選單點選/關注/取消關注)
前言: 事件處理是非常重要的,這一章講講常見的事件處理 1、關注/取消關注 2、選單點選 事件型別介紹: 在微信中有事件請求是訊息請求中的一種。請求型別為:event 而event事件型別又分多種事件型別,具體分關注:subscribe取消關注:unsubscribe自定義選單點選:CLICK 根
微信公眾號開發——網頁授權 (頁面分享 、獲取使用者基本資訊)
第一步:要用到的介面文件如下 第二步:使用網頁服務,公眾號需要如下配置 1.設定 授權回撥頁面域名 2.設定 JS介面安全域名設定(點選公眾號左邊選單 公眾號設定 進入設定頁面 點選 功能設定) 上程式碼 BLL呼叫程式先貼
微信公眾平臺開發教程(一) 微信公眾賬號註冊流程
身份證 logs 政府 提交 註意 bsp 訪問服務器 定義 htm 具體的操作步驟 1、註冊公眾賬號 註冊地址:http://mp.weixin.qq.com/ 1)首先需要郵箱註冊: 2)郵箱激活。郵箱將會收到激活郵件,點擊激活鏈接即可。 3)需要登記個人信息。這裏需
微信公眾平臺開發[4] —— ThinkPHP 框架下微信支付
提示:文章佈局尷尬症患者,請轉移>>>MarkDown文章連結 <<< 宣告:原文主要摘自白俊遙部落格 ,部分內容針對個人事例已作修改,主要用
【備忘】【No5】微信公眾平臺開發入門到實戰開發視訊教程(Java+PHP)
(1)微信入門視訊 共14節課 (2)微信公眾平臺搭建與開發揭祕 共50節課 (3)深入淺出微信公眾平臺實戰開發(微網站、LBS雲、Api介面呼叫、服務號高階介面) 共16節課 (4)微信公眾平臺搭建與開發揭祕50集 (5)兄弟連24集 微信開發VIP教程 (6)微信jav
Java微信公眾平臺開發之OAuth2.0網頁授權
col nts har 順序 pan getcount iba unionid syn 根據官方文檔點擊查看在微信公眾號請求用戶網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 接口權限 - 網頁服務 - 網頁帳號 - 網頁授權獲取用戶基本信息”的配置選項中,修改授權
java微信公眾平臺開發
http style 消息發送 req gets 信號 多說 接收消息 servle 微信公眾平臺的開發,總體說來也是簡單的,就是先大概看下微信公眾平臺接口文檔。 請先大概瀏覽一下API手冊,我們會發現,推送給微信服務器的數據有兩種:xml的形式,和json的形式. 那麽
JAVA帶你一步一步實現微信公眾號開發(一)--接入微信公眾平臺
(一)接入流程解析 在我們的開發過程中無論如何最好的參考工具當然是我們的官方文件了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html 通過上面我們可以看出其中接入微信公眾平臺開發,開發者需要按照如下
java微信公眾平臺開發(使用sunny ngrok設定外網url)
使用Sunny-Ngrok贈送的免費域名進行http服務對映 1、首先在本站註冊成為會員 2、開通隧道 在上圖中表單資訊解釋: 隧道名稱:可以隨便填寫,只是為了使用者在往後之後這個隧道是幹嘛的