首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

微信公眾平台開發實戰:Java 獲取用戶基本資訊完整教程

     編輯:Java 相關知識

前言

微信公眾平台開發中,獲取用戶基本資訊(暱稱、頭像、性別、地區等)是基礎且關鍵的需求。本文詳細記錄從官方 API 文檔解讀、實體類設計、Access Token 管理、HTTPS 請求封裝到完整可運行代碼的全過程實作。

一、業務流程與 API 解析

1.1 核心流程

  1. 用戶關注公眾號或發生互動,公眾號獲得用戶 OpenID。
  2. 後端服務使用 Access Token 與 OpenID 呼叫「獲取用戶基本資訊」介面。
  3. 微信伺服器回傳 JSON 格式用戶資料,解析後映射至實體類。

1.2 官方介面規格

  • 請求方式:HTTPS GET
  • 請求地址:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
  • 必要參數:access_token(介面憑證)、openid(用戶標識)
  • 可選參數:lang(語言版本,預設 zh_CN)

1.3 回傳資料結構範例

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

二、核心代碼實作

2.1 實體類定義

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 省略...
}

2.2 Access Token 實體與獲取工具

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

2.3 獲取用戶資訊業務邏輯

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

四、生產環境關鍵優化建議

  • Token 快取與自動刷新:Access Token 有效期 2 小時,建議使用單例模式或分散式快取管理,背景執行緒定期刷新。
  • 錯誤碼處理:完善處理 errcode(如 40001 無效憑證、45009 頻率限制),實作指數退避重試。
  • HTTPS 效能:啟用連線池,複用 HttpsURLConnection 或改用 HttpClient/OkHttp。
  • 資料安全:敏感資訊(AppSecret、用戶 OpenID)嚴禁硬編碼與日誌輸出。
  • UnionID 機制:同一開放平台下多應用需打通用戶體系時,必須使用 unionid。

結語

掌握微信用戶資訊獲取流程,是開發個性化服務、精準營銷、用戶畫像的基石。本文提供的完整代碼結構可直接應用於生產項目,配合上述優化建議即可構建穩健的微信後端服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved