自定义菜单概述

公众号底部菜单是用户第一入口:最多三级菜单,一级最多三个,二级最多五个。菜单动作分两类:click 触发事件、view 跳转链接。通过接口创建的菜单,点击事件会推送到你的服务器,形成互动闭环。

菜单接口与消息接口共用一套 access_token。菜单创建、查询、删除都有对应接口,开发环境可以先调用再线上发布。

菜单 = 公众号的门面,事件 = 门面的响应。
菜单能力
  • click点击推送事件。
  • view跳转网页。
  • media回复素材。
  • 个性化按标签分流。
公众号菜单配图:手机轮廓上方悬浮一块半透明面板,面板内是几道几何分隔线,面板上方伸出发光曲线
菜单建好,事件接上,公众号才活起来。

菜单接口调用

创建菜单用 POST 到菜单接口,body 是 JSON 菜单结构。先取 access_token,再提交菜单,返回 errcode 0 表示成功。菜单发布前先查询,确认结构与预期一致。

const menu = {
  button: [
    { type: 'click', name: '在线客服', key: 'K_SERVICE' },
    { type: 'view', name: '官网', url: 'https://example.com' }
  ]
};
// POST /cgi-bin/menu/create?access_token=TOKEN

菜单事件处理

用户点 click 菜单,微信把事件 XML 推送到配置的服务器地址。服务器解析 Event 字段为 CLICK,取出 EventKey,按 key 路由处理:回复文本、图文、跳转等。

switch (msg.Event) {
  case 'CLICK':
    handleClick(msg.EventKey);
    break;
  case 'VIEW':
    logView(msg.EventKey);
    break;
}

消息接口对接

菜单事件和用户消息都走同一个接收接口。接收后校验签名、解析 XML、路由处理、拼装回复。被动回复有 5 秒超时,超过就用客服消息接口主动发。

接入时先在公众平台填服务器 URL 和 Token,保存前微信会发验证请求,服务器按签名规则返回 echostr 即通过。

个性化菜单

按用户标签、性别、地区显示不同菜单:新用户看到引导菜单,会员看到会员中心。个性化菜单接口带 matchrule,创建后先发布再生效。

个性化菜单数量有限制,别滥用。线上长期保留一套通用菜单,个性化菜单临时叠加活动入口,活动结束就删。

菜单维护
  • 通用长期稳定入口。
  • 个性化活动临时分流。
  • 事件每个 key 有处理。
  • 日志点击留痕。