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

微信 Java 開發:Access Token 管理、用戶資訊獲取與模板消息主動推送完整實作

     編輯:Java 程式設計入門

整體流程

  1. 獲取 access_token(有效期 2 小時,需緩存)
  2. 拉取用戶資訊(需 openid)
  3. 調用客服消息/模板消息接口主動推送
  4. 配置 HTTP 客戶端(連線池、HTTPS、代理、信任所有憑證)

核心工具類 WeixinAPIHelper

public class WeixinAPIHelper {
    private static final String TOKEN_URL   = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
    private static final String USER_URL    = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}";
    private static final String SEND_URL    = "https://api.weixin.qq.com/cgi-bin/message/send?access_token={0}";

    private HttpClient httpClient;
    private Log log = LogFactory.getLog(getClass());

    // 初始化 HTTP 客戶端(連線池、SSL 忽略驗證、代理支援)
    public void initWebClient(String proxyHost, int proxyPort) { /* 見原碼 */ }

    /** 獲取 access_token */
    public String getAccessToken(String appid, String secret) {
        String url = MessageFormat.format(TOKEN_URL, appid, secret);
        String resp = executeHttpGet(url);
        return JsonUtils.read(resp, "access_token");
    }

    /** 獲取用戶資訊 */
    public WeixinOpenUser getUserInfo(String token, String openid) {
        String url = MessageFormat.format(USER_URL, token, openid);
        String resp = executeHttpGet(url);
        JsonNode json = JsonUtils.read(resp);
        if (json.get("openid") != null) {
            WeixinOpenUser u = new WeixinOpenUser();
            u.setOpenUserId(json.get("openid").asText());
            u.setState(json.get("subscribe").asText());
            if ("1".equals(u.getState())) {
                u.setUserName(json.get("nickname").asText());
                u.setSex(json.get("sex").asText());
                u.setCity(json.get("city").asText());
                u.setLanguage(json.get("language").asText());
            }
            return u;
        }
        return null;
    }

    /** 發送客服消息 */
    public String sendMessage(String token, String msgJson) {
        String url = MessageFormat.format(SEND_URL, token);
        HttpPost post = new HttpPost(url);
        post.setEntity(new StringEntity(msgJson, "UTF-8"));
        return (String) httpClient.execute(post, new BasicResponseHandler());
    }

    private String executeHttpGet(String url) throws IOException {
        return (String) httpClient.execute(new HttpGet(url), new BasicResponseHandler());
    }
}

關鍵依賴

  • httpclient-4.2.3(或 4.5.x)
  • jackson-2.2.1(JSON 解析)
  • commons-lang(StringUtils)

消息 JSON 結構範例(文本消息)

{
  "touser": "OPENID",
  "msgtype": "text",
  "text": { "content": "Hello from Java!" }
}

生產環境關鍵強化

現代化替代:WxJava / weixin-java-tools

成熟開源 SDK,封裝 Token 管理、消息路由、事件處理、OAuth2、小程序/企業微信/開放平台全覆蓋,強烈建議新專案直接引用:

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>4.6.0</version>
</dependency>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決方案
Token 重複請求單例緩存 + 定時刷新(提前 5 分鐘),雙重檢查鎖
HTTPS 憑證驗證生產不可信任所有憑證,需導入微信根憑證或使用 JDK cacerts
連線池調優setMaxTotal(100)、setDefaultMaxPerRoute(20)、啟用 Keep-Alive
錯誤碼處理解析 errcode,40001/42001 觸發 Token 刷新,45047 忽略(用戶未關注)
異步發送引入 CompletableFuture 或 MQ 解耦,避免阻塞業務執行緒