锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 默认分类
  3. 微信公众号——自定义菜单的创建

微信公众号——自定义菜单的创建

0
  • 默认分类
  • 发布于 2024-09-25
  • 11 次阅读
黄健
黄健

自定义菜单创建微信公众号官方文档

1、自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。

开启自定义菜单后,公众号界面如图所示:

注意:

  1. 自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

  2. 一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以”…“代替。

  3. 创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
    自定义菜单的按钮类型有很多,比如click、view、scancode_push、scancode_waitmsg等

  4. click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;

  5. view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

  6. scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。

  7. scancode_waitmsg:扫码推事件且弹出"消息接收中"提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出"消息接收中"提示框,随后可能会收到开发者下发的消息。

  8. pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。

  9. pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择"拍照"或者"从手机相册选择”。用户选择后即走其他两种流程。

  10. pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。

  11. location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。

  12. media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在"素材管理/新增永久素材"接口上传后获得的合法id。

  13. view_limited:跳转图文消息URL用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在"素材管理/新增永久素材"接口上传后获得的合法id。

请注意,3到8的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。9和10,是专门给第三方平台旗下未微信认证(具体而言,是资质认证未通过)的订阅号准备的事件类型,它们是没有事件推送的,能力相对受限,其他类型的公众号不必使用。

接口调用请求说明

http请求方式:POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

菜单的创建以click、view两种进行示例,其他按钮方式所传入的json数据格式参考自定义菜单创建微信公众号官方文档

2、json字符串所对应的对象封装

click和view的请求示例:

{
     "button":[
     {  
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

通过这段示例可以看出创建按钮需传入一段json字符串,而且一个button键对应按钮所形成的数组(一级菜单),在按钮数组中还存在sub_button键所对应的子按钮数组(二级菜单);所以最外层可以创建为WxButton类,在类中只有一个属性,属性名为button,类型为List。观察发现每个按钮都有name字段,所以创建一个BaseButton抽象类,再类中只提供一个属性,属性名为name,类型为String。每个不同类型的按钮都继承自BaseButton类去构建不同类型的pojo类;如果菜单中包含二级菜单,就创建类继承自BaseButton并提供一个名为sub_button的List类型的属性,来代表一级菜单并包含子菜单这种情形。

参数说明

| 参数 | 是否必须 | 说明 |
|————|—————————–|———————————————————————-|
| button | 是 | 一级菜单数组,个数应为1\~3个 |
| sub_button | 否 | 二级菜单数组,个数应为1\~5个 |
| type | 是 | 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型 |
| name | 是 | 菜单标题,不超过16个字节,子菜单不超过60个字节 |
| key | click等点击类型必须 | 菜单KEY值,用于消息接口推送,不超过128字节 |
| url | view、miniprogram类型必须 | 网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。 |
| media_id | media_id类型和view_limited类型必须 | 调用新增永久素材接口返回的合法media_id |
| appid | miniprogram类型必须 | 小程序的appid(仅认证公众号可配置) |
| pagepath | miniprogram类型必须 | 小程序的页面路径 |

3、Java示例

3.1、创建抽象类BaseButton

public class BaseButton {
    /**
     * 菜单名字
     */
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BaseButton(String name) {
        this.name = name;
    }
}

3.2、创建类型为Click的ClickButton类,并继承自BaseButton

public class ClickButton extends BaseButton{
    /**
     * 菜单类型
     */
    private String type = "click";
    /**
     * 唯一键
     */
    private String key;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public ClickButton(String name, String key) {
        super(name);
        this.key = key;
    }
}

3.3、创建按钮类型为View的ViewButton类,并继承自BaseButton

public class ViewButton extends BaseButton {
    /**
     * 菜单类型
     */
    private String type = "view";
    /**
     * 跳转地址
     */
    private String url;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public ViewButton(String name, String url) {
        super(name);
        this.url = url;
    }
}

3.4、创建有子菜单的菜单,类名为SubButton,继承自BaseButton

public class SubButton extends BaseButton{
    private List<BaseButton> sub_button = new ArrayList<>();

    public List<BaseButton> getSub_button() {
        return sub_button;
    }

    public void setSub_button(List<BaseButton> sub_button) {
        this.sub_button = sub_button;
    }

    public SubButton(String name) {
        super(name);
    }
}

3.5、创建名为WxButton的类用于生成最终json字符串的类

public class WxButton {

    private List<BaseButton> button = new ArrayList<>();

    public List<BaseButton> getButton() {
        return button;
    }

    public void setButton(List<BaseButton> button) {
        this.button = button;
    }
}

4、利用封装的pojo创建自定义菜单

常见名为CreatButtonUtil,在main方法中调用creatWxButton私有类方法进行菜单的创建

4.1、 将所需要用到的文字定义为静态常量

private static final String CREAT_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";

    private static final String ONE_MENU_TITLE = "查找路线";
    public static final String ONE_MENU_TITLEKEY = "查找路线KEY";

    private static final String TWO_MENU_TITLE = "产品服务";
    private static final String TWO_MENU_SUBTITLE_ONE = "服务范围";
    private static final String TWO_MENU_SUBTITLE_ONEURL = "http://www.epochyoosure.com/fangan/";
    private static final String TWO_MENU_SUBOTITLE_TWO = "服务项目";
    private static final String TWO_MENU_SUBTITLE_TWOURL = "http://www.epochyoosure.com/a/youxuechanpin/";
    private static final String TWO_MENU_SUBTITLE_THREE = "新闻资讯";
    private static final String TWO_MENU_SUBTITLE_THREEURL = "http://www.epochyoosure.com/zixun/";

    private static final String THREE_MENU_TITLE = "艾派格";
    private static final String THREE_SUBTITLE_ONE = "私人订制";
    private static final String THREE_SUBTITLE_ONEKEY = "私人订制KEY";
    private static final String THREE_SUBTITLE_TWO = "关于我们";
    private static final String THREE_MENU_SUBTITLE_THREEURL = "http://www.epochyoosure.com/index.html";

4.2、创建creatWxButton私有类方法,在方法中创建菜单对象,并将对象转为json字符串, 调用NetManagerUtil所提供的post方法请求网络,传入所需要的参数,创建菜单

private static void creatWxButton() {
        //第一个菜单
        ClickButton oneButton = new ClickButton(ONE_MENU_TITLE,ONE_MENU_TITLEKEY);
        //第二个菜单
        SubButton twoButton = new SubButton(TWO_MENU_TITLE);
        //第二个菜单的子菜单
        ViewButton oneSubButton = new ViewButton(TWO_MENU_SUBTITLE_ONE,TWO_MENU_SUBTITLE_ONEURL);
        ViewButton twoSubButton = new ViewButton(TWO_MENU_SUBOTITLE_TWO,TWO_MENU_SUBTITLE_TWOURL);
        ViewButton threeSubButton = new ViewButton(TWO_MENU_SUBTITLE_THREE,TWO_MENU_SUBTITLE_THREEURL);
        twoButton.getSub_button().add(threeSubButton);
        twoButton.getSub_button().add(twoSubButton);
        twoButton.getSub_button().add(oneSubButton);
        //第三个菜单
        SubButton threeButton = new SubButton(THREE_MENU_TITLE);
        //第三个菜单的子菜单
        ClickButton subButtonOne = new ClickButton(THREE_SUBTITLE_ONE,THREE_SUBTITLE_ONEKEY);
        ViewButton subButtonTwo = new ViewButton(THREE_SUBTITLE_TWO,THREE_MENU_SUBTITLE_THREEURL);
        threeButton.getSub_button().add(subButtonOne);
        threeButton.getSub_button().add(subButtonTwo);
        //添加到button对象中
        WxButton wxButton = new WxButton();
        wxButton.getButton().add(oneButton);
        wxButton.getButton().add(twoButton);
        wxButton.getButton().add(threeButton);
        //转json
        String jsonStr = JSONObject.toJSONString(wxButton);
        //替换token
        String url = CREAT_MENU_URL.replace("ACCESS_TOKEN", GetWxAccessTokenUtil.getAccessToken2());
        //调用网络请求
        NetManagerUtil.post(url,jsonStr);
    }

4.3、在类中编写main方法进行测试:

public static void main(String[] args) {
        creatWxButton();
    }

返回结果

正确时的返回JSON数据包如下:

{"errcode":0,"errmsg":"ok"}

错误时的返回JSON数据包如下(示例为无效菜单名长度):

{"errcode":40018,"errmsg":"invalid button name size"}

当然还可以在 微信公众平台接口调试工具 里面手动添加,修改。后续再更新手动添加的文章。。。

原文链接: https://onlyou.blog.csdn.net//article/details/102592980

标签: #知识库 257
相关文章
最全的办公楼智能化解决方案

最全的办公楼智能化解决方案 2024-10-16 08:40

办公楼综合体智能化如何建设?有哪些系统?近几年,办公楼智能化的项目越来越多,不少项目经理都参与其它,同事办公楼综合体也是弱电系统涉及的最多的项目之一,本期我们一起来看下,最全的办公楼项目智能化设计方案。

规范标准查询、下载网站 2024-10-12 16:41

我们在工作中经常需要用到各种各样的规范标准,这里给大家介绍一些免费查询和下载规范的网站,个人亲测可用。 标准查找查新网站 工标网: http://www.csres.com/ 中国国家标准化管理委员会:http://openstd.samr.gov.cn/bzgk/gb/index 全国标准信息公共

【计算机网络】网络层协议解析 2024-10-08 11:24

网络层的两种服务 IPv4 * 分类编址 划分子网 无分类地址 IPv4地址应用 IP数据报的发送和转发过程 * 主机发送IP数据报 路由器转发IP数据报 IPv4数据报首部格式 ICMP网际控制报文协议 虚拟专用网VPN与

FFmpeg教程(超级详细版) 2024-10-08 11:24

一、参考资料 通过ffmpeg把图片转换成视频 FFmpeg命令(一)、使用filter_complex命令拼接视频 FFmpeg 视频处理入门教程给新手的 20 多个 FFmpeg 命令示例 FFmpeg命令行转码

计算机网络:物理层 —— 数据的传输方式 2024-10-08 11:24

文章目录 * 传输方式 * 串行传输 * 串行传输方式 特点 应用 并行传输 * 特点 应用 网卡的串/并转换 同步传输 * 同步时钟频率的误差问题 特点 应用<

授权码机制 V2.1 2024-10-07 10:26

大家好,我是机灵鹤。 根据读者朋友们反馈的问题和建议,对 授权码 V2.0 版本做了一些优化。 优化内容主要解决了以下几个问题: 优化了授权机制中的时间校验逻辑,避免用户通过回调本地时间来绕过授权机制的问题。 封装和简化了授权接口,开发者可以更方便地接入到自己的程序中。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.