当前位置: 首页 > news >正文

使用Java语言开发微信公众平台(八)——自定义菜单功能

  随着上一篇文章的结束,我们已经实现了所有消息的类型的回复功能。今天,我们来学习更加高大上,也更加重要的自定义菜单功能。

  、了解自定义菜单

  自定义菜单是微信公众平台最常用也是最重要的功能之一。根据微信平台要求,自定义自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。其中一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

  而自定义菜单可以实现的功能也是多种多样的,根据实现功能的不同,微信自定义菜单按钮共分为10种类型:

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

  、了解自定义菜单的数据结构

  自定义菜单与之前消息回复的XML结构不同,自定义菜单选择时候的是我们更加熟悉的JSON数据结构,官方给出的JSON数据Demo如下:

{

     "button":[

     {

          "type":"click",

          "name":"今日歌曲",

          "key":"V1001_TODAY_MUSIC"

      },

      {

           "name":"菜单",

           "sub_button":[

           {

               "type":"view",

               "name":"搜索",

               "url":"http://www.soso.com/"

            },

            {

               "type":"view",

               "name":"视频",

               "url":"http://v.qq.com/"

            },

            {

               "type":"click",

               "name":"赞一下我们",

               "key":"V1001_GOOD"

            }]

       }]

 }

  稍微解释一下,微信公众平台的定义菜单类型虽然非常之多。但是总结归纳一共有两大类,分别是click类型(点击触发关键字key)的和view类型(点击跳转URL)的。了解了基本的规则后,我们来看一下详细的参数解释:

  稍微思考一下,根据这个JSON结构,我们需要怎样去封装实体类呢?

  自定义菜单实体类的封装

  根据上述解释,我们知道菜单类型有两种:click类型、view类型。那么我们便需要clickButton类、viewButton类。而所有菜单共有属性,我们又需要一个Button类作为父类。这样我们才能组装好一个Button,那么多个按钮组装成的菜单,我们又需要一个Menu类。最终我们总结出来,需要四个类的支持才能完成菜单实体的封装:

  每一个类的属性类型如下:

  ① Button类

  ② ClickButton类

  ③ ViewButton类

  ④ Menu类

  、编写组装菜单方法

  实体类组装完毕后,我们进组WeiXinUtil类,编写自定义菜单的组装方法:

/**

 * 组装菜单

 * @return

 */

public static Menu initMenu(){

Menu menu = new Menu();

ClickButton button11 = new ClickButton();

button11.setName("了解杰瑞教育");

button11.setType("click");

button11.setKey("11");

 

ClickButton button12 = new ClickButton();

button12.setName("加入杰瑞教育");

button12.setType("click");

button12.setKey("12");

 

ViewButton button21 = new ViewButton();

button21.setName("杰瑞教育官网");

button21.setType("view");

button21.setUrl("http://www.jerehedu.com");

 

ViewButton button22 = new ViewButton();

button22.setName("杰瑞教育新闻网");

button22.setType("view");

button22.setUrl("http://www.jredu100.com");

 

ClickButton button31 = new ClickButton();

button31.setName("杰小瑞");

button31.setType("click");

button31.setKey("31");

 

Button button1 = new Button();

button1.setName("杰瑞教育"); //将11/12两个button作为二级菜单封装第一个一级菜单

button1.setSub_button(new Button[]{button11,button12});

 

Button button2 = new Button();

button2.setName("相关网址"); //将21/22两个button作为二级菜单封装第二个二级菜单

button2.setSub_button(new Button[]{button11,button12});

 

menu.setButton(new Button[]{button1,button2,button31});// 将31Button直接作为一级菜单

return menu;

}

  、调用接口生成菜单

    菜单组装完成后,我们需调用官方提供的接口,将自定义菜单发布到微信平台

  由于我们直接已经写好doPost方式调用接口的方法,所以直接编写方法调用接口即可:

  public static int createMenu(String token,String menu) throws ClientProtocolException, IOException {

    int result = 0;

    String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);

    JSONObject jsonObject = doPostStr(url, menu);

    if(jsonObject != null){

      result = jsonObject.getInt("errcode");

    }

    return result;

   }

   其中,我们返回errcode,可以判断创建是否成功:

  、测试类调用方法生成菜单

    完成上述各种功能后,回到我们的测试类,调用方法:

  public static void main(String[] args) throws ClientProtocolException, IOException, KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException {

    AccessToken token = WeiXinUtil.getAccessToken();

    System.out.println("Access_Token为:"+token.getToken());

    System.out.println("有效时间为:"+token.getExpiresIn());

    String menu = JSONObject.fromObject(WeiXinUtil.initMenu()).toString();

    int result = WeiXinUtil.createMenu(token.getToken(), menu);

    if(result==0){

      System.out.println("菜单创建成功!");

    }else{

      System.out.println("菜单创建失败");

    }

   }

  看到控制台结果:

  愉快的看了看手机,效果如下(当然现在只完成展示,还未做点击事件操作):

 

相关文章:

  • SPRING-MVC 访问静态资源
  • IE6下position:fixed不支持问题及其解决方式
  • Erlang库 -- 有意思的库汇总
  • 《大数据算法》一2.3 时间亚线性判定算法概述
  • 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
  • Setfocus - IE 需要使用setTimeout
  • linux 文件名编码批量转换
  • zabbix监控:监控windows进程
  • CGAL4.10 / CGAL4.13编译
  • multiMap by angular
  • Context源码分析
  • [转]CentO下限制SSH登录次数
  • 《软件工艺师:专业、务实、自豪》一3.2 维基百科对软件工艺的定义
  • SIM卡
  • angular select 默认值
  • avalon2.2的VM生成过程
  • Django 博客开发教程 16 - 统计文章阅读量
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript 一些 DOM 的知识点
  • Javascript基础之Array数组API
  • linux学习笔记
  • nginx 负载服务器优化
  • PAT A1050
  • rabbitmq延迟消息示例
  • SpingCloudBus整合RabbitMQ
  • Web设计流程优化:网页效果图设计新思路
  • 复习Javascript专题(四):js中的深浅拷贝
  • 观察者模式实现非直接耦合
  • 近期前端发展计划
  • 什么软件可以剪辑音乐?
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #QT(一种朴素的计算器实现方法)
  • #图像处理
  • (二)JAVA使用POI操作excel
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (一)插入排序
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET gRPC 和RESTful简单对比
  • .net 获取url的方法
  • @TableLogic注解说明,以及对增删改查的影响
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ SNOI 2013 ] Quare
  • []error LNK2001: unresolved external symbol _m
  • [android] 手机卫士黑名单功能(ListView优化)
  • [BT]BUUCTF刷题第4天(3.22)
  • [C++]拼图游戏
  • [CodeForces-759D]Bacterial Melee
  • [CTO札记]盛大文学公司名称对联
  • [C语言]——内存函数
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [ffmpeg] 定制滤波器
  • [hive] posexplode函数