微信公眾平台開發中,獲取用戶基本資訊(暱稱、頭像、性別、地區等)是基礎且關鍵的需求。本文詳細記錄從官方 API 文檔解讀、實體類設計、Access Token 管理、HTTPS 請求封裝到完整可運行代碼的全過程實作。
OpenID。Access Token 與 OpenID 呼叫「獲取用戶基本資訊」介面。https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CNaccess_token(介面憑證)、openid(用戶標識)lang(語言版本,預設 zh_CN){
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "廣州",
"province": "廣東",
"country": "中國",
"headimgurl": "https://wx.qlogo.cn/.../0",
"subscribe_time": 1382694957,
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL",
"remark": "",
"groupid": 0
}
package com.souvc.weixin.pojo;
public class WeixinUserInfo {
private String openId;
private int subscribe;
private String subscribeTime;
private String nickname;
private int sex; // 1 男, 2 女, 0 未知
private String country;
private String province;
private String city;
private String language;
private String headImgUrl;
// Getter/Setter 省略...
}
public class Token {
private String accessToken;
private int expiresIn; // 單位:秒
// Getter/Setter 省略...
}
public class CommonUtil {
private static final String TOKEN_URL =
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
// 通用 HTTPS 請求方法(支援信任所有憑證)
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
// ... 省略 SSLContext、HttpsURLConnection 完整實作 ...
// 返回解析後的 JSONObject
}
// 獲取 Access Token
public static Token getToken(String appid, String appsecret) {
String url = TOKEN_URL.replace("APPID", appid).replace("APPSECRET", appsecret);
JSONObject json = httpsRequest(url, "GET", null);
if (json != null) {
try {
Token token = new Token();
token.setAccessToken(json.getString("access_token"));
token.setExpiresIn(json.getInt("expires_in"));
return token;
} catch (JSONException e) {
log.error("獲取 token 失敗: {}", json);
}
}
return null;
}
}
public static WeixinUserInfo getUserInfo(String accessToken, String openId) {
String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID"
.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
JSONObject json = CommonUtil.httpsRequest(url, "GET", null);
if (json != null) {
try {
WeixinUserInfo info = new WeixinUserInfo();
info.setOpenId(json.getString("openid"));
info.setSubscribe(json.getInt("subscribe"));
info.setSubscribeTime(json.getString("subscribe_time"));
info.setNickname(json.getString("nickname"));
info.setSex(json.getInt("sex"));
info.setCountry(json.getString("country"));
info.setProvince(json.getString("province"));
info.setCity(json.getString("city"));
info.setLanguage(json.getString("language"));
info.setHeadImgUrl(json.getString("headimgurl"));
return info;
} catch (Exception e) {
if (json.getInt("subscribe") == 0) {
log.warn("用戶 {} 已取消關注", openId);
} else {
log.error("獲取用戶資訊失敗: {}", json);
}
}
}
return null;
}
public static void main(String[] args) {
// 請替換為真實的 AppID 與 AppSecret
String appid = "your_appid";
String appsecret = "your_secret";
// 1. 獲取 Access Token
Token token = CommonUtil.getToken(appid, appsecret);
if (token == null) {
System.err.println("無法獲取 Access Token");
return;
}
// 2. 獲取用戶資訊(需替換為真實 OpenID)
WeixinUserInfo user = getUserInfo(token.getAccessToken(), "ooK-yuJvd9gEegH6nRIen-gnLrVw");
// 3. 輸出結果
if (user != null) {
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());
}
}
Access Token 有效期 2 小時,建議使用單例模式或分散式快取管理,背景執行緒定期刷新。errcode(如 40001 無效憑證、45009 頻率限制),實作指數退避重試。HttpsURLConnection 或改用 HttpClient/OkHttp。unionid。掌握微信用戶資訊獲取流程,是開發個性化服務、精準營銷、用戶畫像的基石。本文提供的完整代碼結構可直接應用於生產項目,配合上述優化建議即可構建穩健的微信後端服務。