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

微信公眾號測試賬號自定義菜單開發完整指南:按鈕類型、API 調用、Java 實現與調試技巧

     編輯:Java 相關知識

前言

微信公眾號自定義菜單是用戶交互的核心入口。本文系統梳理 10 種按鈕類型、接口調用規範、參數說明、返回碼、Java 實體類設計、菜單構建與創建/查詢完整代碼,並提供測試賬號調試實戰技巧。

一、 10 種按鈕類型詳解

類型名稱觸發動作適用場景版本要求
click點擊推事件推送 Event 事件到開發者服務器,攜帶 key關鍵字回覆、功能觸發全版本
view跳轉 URL打開網頁,可結合網頁授權獲取用戶信息H5 頁面、外部鏈接全版本
scancode_push掃碼推事件調起掃一掃,結果推送給開發者掃碼查詢、溯源iOS 5.4.1+ / Android 5.4+
scancode_waitmsg掃碼推事件並彈「消息接收中」掃碼後彈提示框,等待開發者下發消息需後端處理的掃碼同上
pic_sysphoto彈出系統拍照發圖調起系統相機,拍照後上傳現場拍照上報同上
pic_photo_or_album彈出拍照或相冊發圖選擇器:拍照/從相冊選擇靈活圖片上傳同上
pic_weixin彈出微信相冊發圖調起微信相冊選圖上傳聊天圖片轉發同上
location_select彈出地理位置選擇器選擇位置後上傳經緯度門店查找、打卡簽到同上
media_id下發圖文/圖片/語音/視頻直接下發永久素材(需素材管理接口上傳獲取 media_id)營銷圖文、客服回覆未認證訂閱號專用
view_limited跳轉圖文消息 URL打開永久素材圖文頁面圖文閱讀未認證訂閱號專用

關鍵限制

  • 3~8 華為型按鈕需微信 5.4+ 版本,舊版無響應、無事件推送。
  • 9、10 僅供**未資質認證的訂閱號**使用,**無事件推送**,能力受限。
  • 一級菜單 1~3 個,二級菜單 1~5 個。

二、 接口調用規範

  • 請求方式:POST (HTTPS)
  • 創建菜單:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
  • 查詢菜單:https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
  • 刪除菜單:https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

請求示例 (click + view + 子菜單)

{
  "button": [
    {
      "type": "click",
      "name": "今日歌曲",
      "key": "V1001_TODAY_MUSIC"
    },
    {
      "name": "菜單",
      "sub_button": [
        { "type": "view", "name": "搜索", "url": "https://www.soso.com/" },
        { "type": "view", "name": "視頻", "url": "https://v.qq.com/" },
        { "type": "click", "name": "贊一下我們", "key": "V1001_GOOD" }
      ]
    }
  ]
}

參數說明

參數必填說明
button是一級菜單數組,1~3 個
sub_button否二級菜單數組,1~5 個
type是按鈕類型
name是菜單標題,一級≤16字節,二級≤40字節
keyclick 等必填菜單 KEY,≤128字節,事件推送標識
urlview 必填網頁鏈接,≤1024字節
media_idmedia_id/view_limited 必填永久素材 ID

返回碼

  • 成功:{"errcode":0,"errmsg":"ok"}
  • 失敗示例:{"errcode":40018,"errmsg":"invalid button name size"}

三、 Java 實體類設計(對應 JSON 結構)

// 基礎按鈕
public class Button {
    private String type;
    private String name;
    private Button[] sub_button;
    // getter/setter 省略
}

// click 類按鈕
public class ClickButton extends Button {
    private String key;
    // getter/setter
}

// view 類按鈕
public class ViewButton extends Button {
    private String url;
    // getter/setter
}

// 菜單容器
public class Menu {
    private Button[] button;
    // getter/setter
}

四、 菜單構建與調用完整代碼

import net.sf.json.JSONObject;
import java.util.*;

public class WechatMenuUtil {
    private static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
    private static final String QUERY_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN";

    /** 構建測試菜單 */
    public static Menu initMenu() {
        Menu menu = new Menu();
        
        ClickButton clickBtn = new ClickButton();
        clickBtn.setType("click");
        clickBtn.setName("點擊測試");
        clickBtn.setKey("CLICK_TEST");
        
        ViewButton viewBtn = new ViewButton();
        viewBtn.setType("view");
        viewBtn.setName("跳轉百度");
        viewBtn.setUrl("https://www.baidu.com");
        
        ClickButton scanBtn = new ClickButton();
        scanBtn.setType("scancode_push");
        scanBtn.setName("掃碼測試");
        scanBtn.setKey("SCAN_TEST");
        
        ClickButton locBtn = new ClickButton();
        locBtn.setType("location_select");
        locBtn.setName("位置測試");
        locBtn.setKey("LOC_TEST");
        
        Button subContainer = new Button();
        subContainer.setName("更多功能");
        subContainer.setSub_button(new Button[]{scanBtn, locBtn});
        
        menu.setButton(new Button[]{clickBtn, viewBtn, subContainer});
        return menu;
    }

    /** 創建菜單 */
    public static int createMenu(String menuJson, String accessToken) {
        String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", accessToken);
        JSONObject resp = HttpUtil.doPostStr(url, menuJson); // 需自行實現 HTTP POST
        return resp != null ? resp.getInt("errcode") : -1;
    }

    /** 查詢菜單 */
    public static JSONObject queryMenu(String accessToken) {
        String url = QUERY_MENU_URL.replace("ACCESS_TOKEN", accessToken);
        return HttpUtil.doGetStr(url); // 需自行實現 HTTP GET
    }
}

五、 測試入口

public class WechatMenuTest {
    public static void main(String[] args) {
        // 1. 獲取 access_token(需實現 WechatUtil.getAccessToken())
        AccessToken token = WechatUtil.getAccessToken();
        System.out.println("accessToken: " + token.getToken());
        
        // 2. 構建菜單 JSON
        Menu menu = WechatMenuUtil.initMenu();
        JSONObject menuJson = JSONObject.fromObject(menu);
        System.out.println("菜單 JSON: " + menuJson.toString());
        
        // 3. 創建菜單
        int result = WechatMenuUtil.createMenu(menuJson.toString(), token.getToken());
        if (result == 0) {
            System.out.println("菜單創建成功!");
        } else {
            System.out.println("創建失敗,錯誤碼: " + result);
        }
        
        // 4. 查詢驗證
        JSONObject queried = WechatMenuUtil.queryMenu(token.getToken());
        System.out.println("查詢結果: " + queried);
    }
}

六、 實戰調試技巧

  1. 使用測試賬號:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 獲取測試 appid/secret,每日可重置。
  2. 菜單生效延遲:創建後需**退出公眾號會話列表重新進入**,或拉下刷新會話列表才可見新菜單。
  3. URL 編碼:view 類 url 若帶參數,需 URLEncoder.encode,且域名需在公眾號後台「業務域名」白名單中。
  4. 事件接收驗證:配置開發者服務器 URL,使用 ngrok/內網穿透測試本地接收 click 事件推送。
  5. 素材管理:media_id 型按鈕需先調用「新增永久素材」接口上傳圖文/圖片,獲取合法 media_id。

七、 常見錯誤碼速查

errcodeerrmsg原因解決
40018invalid button name size菜單名長度超限一級≤16字節,二級≤40字節
40019invalid button key sizekey 長度超限key ≤128字節
40020invalid button url sizeurl 長度超限url ≤1024字節
40037invalid template_id size模板 ID 錯誤檢查模板 ID 是否正確
41001access_token missing缺少 access_token檢查 token 獲取邏輯
42001access_token expiredtoken 過期刷新 token(有效期 2h)
45009api freq out of limit調用頻率超限降低調用頻率,緩存 token

八、 總結

微信自定義菜單開發核心在於:

  1. 準確選擇按鈕類型,匹配業務場景與用戶微信版本。
  2. 嚴格遵循 JSON 結構、字段長度、必填規則構建請求體。
  3. 妥善管理 access_token(緩存、定時刷新、併發安全)。
  4. 善用測試賬號與 ngrok 進行本地端到端調試。
  5. 關注菜單生效延遲、域名白名單、素材預上傳等運維細節。

菜單是公眾號的「臉面」,頻繁變更會影響用戶肌肉記憶。建議建立菜單版本管理,灰度發布,監控點擊事件數據,持續優化信息架構。

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