[039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

引言及内容概要

距离写上一篇文章《自定义菜单的创建及菜单事件响应》整整过了两个月的时间,那时公众平台还没有开放view类型的菜单。在不久前,微信公众平台悄悄开放了view类型的菜单,却没有在首页发布任何通知,貌似微信团队很喜欢这么干。一个偶然的机会,我留意到API文档的自定义菜单接口发生了变化,增加了对菜单view类型的说明:

view(访问网页):

 用户点击view类型按钮后,会直接跳转到开发者指定的url中。

于是我在第一时间更新了小q机器人(微信号:xiaoqrobot)的菜单,在一级菜单“更多”下增加了二级菜单“使用帮助”,点击该菜单项会直接跳转到网页,如下图所示。

最近也有不少网友问起这种类型的菜单是如何创建的,本篇文章就为大家介绍下view类型的自定义菜单该如何创建。

自定义菜单的两种类型(click和view)

公众平台API文档中给出了自定义菜单的json结构示例,我从中截取两个菜单项的json代码,一个是click类型,另一个是view类型,如下所示。

[html] view plaincopy

  1. {
  2. "type":"click",
  3. "name":"今日歌曲",
  4. "key":"V1001_TODAY_MUSIC"
  5. },
  6. {
  7. "type":"view",
  8. "name":"歌手简介",
  9. "url":"http://www.qq.com/"
  10. }

从上面可以看出,两种类型的菜单除了type值不同之外,属性也有差别。click类型的菜单有key属性,而view类型的菜单没有key属性,与之对应的是url属性。通过上一篇的学习我们知道,key值是用于判断用户点击了哪个click类型的菜单项。而view类型的菜单没有key属性,目前无法在公众账号后台判断是否有用户点击了view类型的菜单项,也就没办法知道哪个用户点击了view类型的菜单项。

建立view类型的菜单对象

View类型的菜单有3个属性:type、name和url。在上一篇文章中,我们创建了菜单项的基类Button,Button类只有一个属性name。View类型的菜单对象也需要继承Button类,代码如下:

[java] view plaincopy

  1. package org.liufeng.weixin.pojo;
  2. /**
  3. * view类型的菜单
  4. *
  5. * @author liuyq
  6. * @date 2013-04-10
  7. */
  8. public class ViewButton extends Button {
  9. private String type;
  10. private String url;
  11. public String getType() {
  12. return type;
  13. }
  14. public void setType(String type) {
  15. this.type = type;
  16. }
  17. public String getUrl() {
  18. return url;
  19. }
  20. public void setUrl(String url) {
  21. this.url = url;
  22. }
  23. }

创建带view类型的菜单示例

我们对前一篇文章中给出的菜单创建代码进行调整,增加view类型的菜单项,完整的菜单创建代码如下:

[java] view plaincopy

  1. package org.liufeng.weixin.main;
  2. import org.liufeng.weixin.pojo.AccessToken;
  3. import org.liufeng.weixin.pojo.Button;
  4. import org.liufeng.weixin.pojo.CommonButton;
  5. import org.liufeng.weixin.pojo.ComplexButton;
  6. import org.liufeng.weixin.pojo.Menu;
  7. import org.liufeng.weixin.pojo.ViewButton;
  8. import org.liufeng.weixin.util.WeixinUtil;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. /**
  12. * 菜单管理器类
  13. *
  14. * @author liufeng
  15. * @date 2013-08-08
  16. */
  17. public class MenuManager {
  18. private static Logger log = LoggerFactory.getLogger(MenuManager.class);
  19. public static void main(String[] args) {
  20. // 第三方用户唯一凭证
  21. String appId = "000000000000000000";
  22. // 第三方用户唯一凭证密钥
  23. String appSecret = "00000000000000000000000000000000";
  24. // 调用接口获取access_token
  25. AccessToken at = WeixinUtil.getAccessToken(appId, appSecret);
  26. if (null != at) {
  27. // 调用接口创建菜单
  28. int result = WeixinUtil.createMenu(getMenu(), at.getToken());
  29. // 判断菜单创建结果
  30. if (0 == result)
  31. log.info("菜单创建成功!");
  32. else
  33. log.info("菜单创建失败,错误码:" + result);
  34. }
  35. }
  36. /**
  37. * 组装菜单数据
  38. *
  39. * @return
  40. */
  41. private static Menu getMenu() {
  42. CommonButton btn11 = new CommonButton();
  43. btn11.setName("天气预报");
  44. btn11.setType("click");
  45. btn11.setKey("11");
  46. CommonButton btn12 = new CommonButton();
  47. btn12.setName("公交查询");
  48. btn12.setType("click");
  49. btn12.setKey("12");
  50. CommonButton btn13 = new CommonButton();
  51. btn13.setName("周边搜索");
  52. btn13.setType("click");
  53. btn13.setKey("13");
  54. CommonButton btn14 = new CommonButton();
  55. btn14.setName("历史上的今天");
  56. btn14.setType("click");
  57. btn14.setKey("14");
  58. CommonButton btn15 = new CommonButton();
  59. btn15.setName("电影排行榜");
  60. btn15.setType("click");
  61. btn15.setKey("32");
  62. CommonButton btn21 = new CommonButton();
  63. btn21.setName("歌曲点播");
  64. btn21.setType("click");
  65. btn21.setKey("21");
  66. CommonButton btn22 = new CommonButton();
  67. btn22.setName("经典游戏");
  68. btn22.setType("click");
  69. btn22.setKey("22");
  70. CommonButton btn23 = new CommonButton();
  71. btn23.setName("美女电台");
  72. btn23.setType("click");
  73. btn23.setKey("23");
  74. CommonButton btn24 = new CommonButton();
  75. btn24.setName("人脸识别");
  76. btn24.setType("click");
  77. btn24.setKey("24");
  78. CommonButton btn25 = new CommonButton();
  79. btn25.setName("聊天唠嗑");
  80. btn25.setType("click");
  81. btn25.setKey("25");
  82. CommonButton btn31 = new CommonButton();
  83. btn31.setName("Q友圈");
  84. btn31.setType("click");
  85. btn31.setKey("31");
  86. CommonButton btn33 = new CommonButton();
  87. btn33.setName("幽默笑话");
  88. btn33.setType("click");
  89. btn33.setKey("33");
  90. CommonButton btn34 = new CommonButton();
  91. btn34.setName("用户反馈");
  92. btn34.setType("click");
  93. btn34.setKey("34");
  94. CommonButton btn35 = new CommonButton();
  95. btn35.setName("关于我们");
  96. btn35.setType("click");
  97. btn35.setKey("35");
  98. ViewButton btn32 = new ViewButton();
  99. btn32.setName("使用帮助");
  100. btn32.setType("view");
  101. btn32.setUrl("http://liufeng.gotoip2.com/xiaoqrobot/help.jsp");
  102. ComplexButton mainBtn1 = new ComplexButton();
  103. mainBtn1.setName("生活助手");
  104. mainBtn1.setSub_button(new Button[] { btn11, btn12, btn13, btn14, btn15 });
  105. ComplexButton mainBtn2 = new ComplexButton();
  106. mainBtn2.setName("休闲驿站");
  107. mainBtn2.setSub_button(new Button[] { btn21, btn22, btn23, btn24, btn25 });
  108. ComplexButton mainBtn3 = new ComplexButton();
  109. mainBtn3.setName("更多");
  110. mainBtn3.setSub_button(new Button[] { btn31, btn33, btn34, btn35, btn32 });
  111. /**
  112. * 这是公众号xiaoqrobot目前的菜单结构,每个一级菜单都有二级菜单项<br>
  113. *
  114. * 在某个一级菜单下没有二级菜单的情况,menu该如何定义呢?<br>
  115. * 比如,第三个一级菜单项不是“更多体验”,而直接是“幽默笑话”,那么menu应该这样定义:<br>
  116. * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 });
  117. */
  118. Menu menu = new Menu();
  119. menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
  120. return menu;
  121. }
  122. }

119~122行代码就是用于创建view类型菜单项的。上面的菜单结构也是小q机器人(微信号:xiaoqrobot)目前在使用的,读者可以对照着理解。

补充:居然还有些网友问我上面的自定义菜单创建代码在哪里调用,问我为什么不把调用的代码也公开?搞的我都有点不好意思了。上面的菜单创建代码是写在main方法中,直接在开发工具中运行一下就可以了,这应该是最最基础的Java知识了。另外,菜单只要创建一次,会一直存在的,不需要每次启动应用程序都去创建菜单。当然,你也可以把菜单的创建代码集成到项目中,并非一定要放在main方法中。程序是死的,人是活的,解决方法往往有很多种,怎么方便实用就怎么来!

如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰!

时间: 2024-08-27 18:38:40

[039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)的相关文章

微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应 参考文章:http://blog.csdn.net/lyq8479/article/details/9841371

[038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3)使用QQ登录的公众号,可以升级为邮箱登录: 4)使用邮箱登录的公众号,可以修改登录邮箱: 5)编辑图文消息可选填作者: 6)群发消息可以同步到腾讯微博. 其中,大家议论最多的当属前两条,就是关于帐号类型和自定义菜单的更新,我这里做几点补充说明: 1)目前公众号类型分为两种:服务号和订阅号,8月5日

[037] 微信公众帐号开发教程第13篇-图文消息全攻略

引言及内容概要 已经有几位读者抱怨“柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用”,好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本消息的使用示例,大家就能够照猫画虎的,或许是因为我的绘画功底太差,画出的那只猫本来就不像猫吧…… 本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式.标题取名为“图文消息全攻略”,这绝对不是标题党,是想借此机会把大家对图文消息相关的问题.疑虑.障碍全部清除掉. 图文消息的主要参数说明 通过微信官方

微信公众帐号开发教程第3篇-开发模式启用及接口配置

编辑模式与开发模式 微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在"高级功能"里进行配置,点击"高级功能",将看到如下界面: 从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启.那两种模式有什么区别呢?作为开发人员到底要开启哪一种呢?编辑模式:主要针对非编程人员及信息发布类公众帐号使用.开启该模式后,可以方便地通过界面配置"自定义菜单"和"自动回复的消息".

微信公众帐号开发教程第12篇-符号表情的发送(下)

第11篇文章给出了Unified版本的符号表情(emoji表情)代码表,并且介绍了如何在微信公众帐号开发模式下发送emoji表情,还在文章结尾出,卖了个关子:"小q机器人中使用的一些符号表情,在微信的符号表情选择栏里根本找不到,并且在上篇文章给出的符号表情代码表(Unified版)中也没有,那这些表情是如何发送的呢?"如下面两张图所示的符号表情"情侣"和"公共汽车".          本文主要介绍以下内容:1)如何在微信上使用更多的符号表情(即

[029] 微信公众帐号开发教程第5篇-各种消息的接收与响应

前一篇文章里我们已经把微信公众平台接口中消息及相关操作都进行了封装,本章节将主要介绍如何接收微信服务器发送的消息并做出响应. 明确在哪接收消息 从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息.处理消息和响应消息.   接收.处理.响应消息 下面先来看我已经写好的CoreServlet的完整代码: [java] vie

[040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天

内容概要 本篇文章主要讲解如何在微信公众帐号上实现“历史上的今天”功能.这个例子本身并不复杂,但希望通过对它的学习,读者能够对正则表达式有一个新的认识,能够学会运用现有的网络资源丰富自己的公众账号. 何谓历史上的今天 回顾历史的长河,历史是生活的一面镜子:以史为鉴,可以知兴衰:历史上的每一天,都是喜忧参半:可以了解历史的这一天发生的事件,借古可以鉴今,历史是不能忘记的.查看历史上每天发生的重大事情,增长知识,开拓眼界,提高人文素养. 寻找接口(数据源) 要实现查询“历史上的今天”,首先我们要找到

[028] 微信公众帐号开发教程第4篇-消息及消息处理工具的封装

工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用.这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平台接收到,然后微信平台会将该消息转给你在开发模式接口配置中指定的URL地址. 微信公众平台消息接口 要接收微信平台发送的消息,我们需要先熟悉微信公众平台API中消息接口部分,点此进入,点击后将进入到消息接口指南部分,如下图所示: 在上图左侧可以看到微信公众平台目前开放的接口有三种:消息接口.通用接口和自定义菜单接口.通用

微信公众帐号开发之一(java)

闲来没事,就记录一下微信公众平台的开发吧~ 其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的. 微信公众平台订阅号和服务号的区别网上已经有N多的介绍了,这里就不再说了.从微信公众平台登录之后开始说起吧. 对于开发者来说,开发者模式是最好的选择了.因为在里面可以更自由更灵活的选择消息回复方式.编辑模式只能对特定的字符进行相应的消息回复.而且在开发者模式下可以灵活的创建自定义菜单(前提是你的帐号有提供相应的接口,需要微