06. 微信公众号创建、删除菜单

1. 创建菜单
  1. 官网

  2. 接口

    // post 请求
    https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
    
    • 请求体示例

      [
          {
              "type": "view",
              "name": "百度",
              "url": "http://www.baidu.com"
          },
          {
              "name": "笔记",
              "sub_button": [
                  {
                      "type": "view",
                      "name": "简书",
                      "url": "https://www.jianshu.com/"
                  },
                  {
                      "type": "view",
                      "name": "CSDN",
                      "url": "https://blog.csdn.net/"
                  },
                  {
                      "type": "view",
                      "name": "有道云笔记",
                      "url": "https://note.youdao.com/signIn/index.html"
                  }
              ]
          },
          {
              "name": "娱乐",
              "sub_button": [
                  {
                      "type": "view",
                      "name": "知乎",
                      "url": "https://www.zhihu.com/"
                  },
                  {
                      "type": "view",
                      "name": "微博",
                      "url": "https://passport.weibo.com/"
                  },
                  {
                      "type": "view",
                      "name": "京东",
                      "url": "https://www.jd.com/"
                  },
                  {
                      "type": "view",
                      "name": "淘宝",
                      "url": "https://www.taobao.com/"
                  },
                  {
                      "type": "view",
                      "name": "哔哩哔哩",
                      "url": "https://www.bilibili.com/"
                  }
              ]
          }
      ]
      
  3. 参数说明

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

    1. 请求体菜单菜单按钮

      • 菜单

        import com.fasterxml.jackson.annotation.JsonProperty;
        import lombok.Data;
        import lombok.ToString;
        
        import java.io.Serializable;
        import java.util.List;
        
        /**
         * 微信公众号菜单
         *
         * @author sheng_zs@126.com
         * @date 2021-08-05 14:48
         */
        @Data
        @ToString
        public class WxMenuBean implements Serializable {
            private static final long serialVersionUID = 1L;
        
            /**
             * 必须<br>
             * 一级菜单数组,个数应为1~3个
             */
            @JsonProperty("button")
            private List<WxMenuButtonBean> buttons;
        }
        
      • 菜单按钮

        import com.fasterxml.jackson.annotation.JsonAlias;
        import com.fasterxml.jackson.annotation.JsonProperty;
        import lombok.Data;
        import lombok.ToString;
        
        import java.io.Serializable;
        import java.util.List;
        
        /**
         * 微信公众号菜单按钮
         *
         * @author sheng_zs@126.com
         * @date 2021-08-05 11:43
         */
        @Data
        @ToString
        public class WxMenuButtonBean implements Serializable {
            private static final long serialVersionUID = 1L;
        
            /**
             * 不必须<br>
             * 二级菜单数组,个数应为1~5个
             */
            @JsonProperty("sub_button")
            @JsonAlias({"subButtons", "sub_button"})
            private List<WxMenuButtonBean> subButtons;
        
            /**
             * 必须<br>
             * 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型
             */
            private String type;
        
            /**
             * 必须<br>
             * 菜单标题,不超过16个字节,子菜单不超过60个字节
             */
            private String name;
        
            /**
             * click等点击类型必须<br>
             * 菜单KEY值,用于消息接口推送,不超过128字节
             */
            private String key;
        
            /**
             * view、miniprogram类型必须<br>
             * 网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。
             */
            private String url;
        
            /**
             * media_id类型和view_limited类型必须<br>
             * 调用新增永久素材接口返回的合法media_id
             */
            @JsonProperty("media_id")
            private String mediaId;
        
            /**
             * miniprogram类型必须<br>
             * 小程序的appid(仅认证公众号可配置)
             */
            @JsonProperty("appid")
            private String appId;
        
            /**
             * miniprogram类型必须<br>
             * 小程序的页面路径
             */
            @JsonProperty("pagepath")
            private String pagePath;
        }
        
    2. application.ymlWxMenuConfig程序启动时创建菜单

      • application.yml

        wx:
          mp:
            appID: appID
            appSecret: appSecret
            token: token
            encodingAesKey: 43位encodingAesKey
          menu:
            # 是否自动创建
            enable: false
            # 菜单数据
            buttons:
              - {type: 'view' , name: '百度', url: 'http://www.baidu.com'}
              - {name: '笔记',
                 subButtons:[{type: 'view', name: '简书', url: 'https://www.jianshu.com/'},
                             {type: 'view', name: 'CSDN', url: 'https://blog.csdn.net/'},
                             {type: 'view', name: '有道云笔记', url: 'https://note.youdao.com/signIn/index.html'}
                 ]
              }
              - {name: '娱乐',
                 subButtons:[{type: 'view', name: '知乎', url: 'https://www.zhihu.com/'},
                             {type: 'view', name: '微博', url: 'https://passport.weibo.com/'},
                             {type: 'view', name: '京东', url: 'https://www.jd.com/'},
                             {type: 'view' , name: '淘宝', url: 'https://www.taobao.com/'},
                             {type: 'view' , name: '哔哩哔哩', url: 'https://www.bilibili.com/'}
                 ]
              }
        
      • WxMenuConfig

        import cn.hutool.http.HttpUtil;
        import com.small.nine.wxmp.common.constant.WxConstant;
        import com.small.nine.wxmp.domain.bean.wx.WxMenuBean;
        import com.small.nine.wxmp.domain.bean.wx.WxMenuButtonBean;
        import com.small.nine.wxmp.service.WxService;
        import com.small.nine.wxmp.utils.wx.JsonUtils;
        import lombok.Data;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.boot.context.properties.ConfigurationProperties;
        import org.springframework.context.annotation.Configuration;
        
        import javax.annotation.PostConstruct;
        import javax.annotation.Resource;
        import java.util.List;
        import java.util.Map;
        import java.util.Objects;
        
        /**
         * 微信菜单
         *
         * @author sheng_zs@126.com
         * @date 2021-08-05 14:55
         */
        @Slf4j
        @Data
        @Configuration
        @ConfigurationProperties("wx.menu")
        public class WxMenuConfig {
            /**
             * 是否自动创建
             */
            private Boolean enable;
            /**
             * 菜单
             */
            private List<WxMenuButtonBean> buttons;
        
            @Resource
            private WxService wxService;
        
            /**
             * 创建菜单
             */
            @PostConstruct
            private void createMenu() {
                if (Objects.equals(enable, true)) {
                    WxMenuBean menuBean = new WxMenuBean();
                    menuBean.setButtons(buttons);
                    // 创建菜单
                    String body = JsonUtils.writeValueAsString(menuBean);
                    String post = HttpUtil.post(String.format(WxConstant.URL_MENU_CREATE_POST, wxService.getAccessToken()), body);
                    log.info("自动创建微信公众号菜单\n{}\n创建信息:{}", body, post);
                    Map<String, Object> map = JsonUtils.readValueAsMap(post);
                    Object errCode;
                    if (Objects.isNull(map) || Objects.isNull(errCode = map.get("errcode")) || !Objects.equals(errCode, 0)) {
                        throw new RuntimeException("自动创建微信公众号菜单错误:" + post);
                    }
                }
            }
        }            
        
    3. serviceImpl

      @Override
      public Map<String, Object> createMenu(List<WxMenuButtonBean> beans) {
          WxMenuBean menuBean = new WxMenuBean();
          menuBean.setButtons(beans);
          // 创建菜单
          String body = JsonUtils.writeValueAsString(menuBean);
          String post = HttpUtil.post(String.format(WxConstant.URL_MENU_CREATE_POST, getAccessToken()), body);
          log.info("创建微信公众号菜单\n{}\n创建信息:{}", body, post);
          return JsonUtils.readValueAsMap(post);
      }
      
2. 删除菜单
  1. 官网

  2. 代码

    @Override
    public Map<String, Object> deleteMenu() {
        String result = HttpUtil.get(String.format(WxConstant.URL_MENU_DELETE_GET, getAccessToken()));
        log.info("\n删除微信公众号菜单{}", result);
        return JsonUtils.readValueAsMap(result);
    }
    
  3. 源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值