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

引言及内容概要

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

view(访问网页):

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

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


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


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

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

[html] view plain copy
  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 plain copy
  1. packageorg.liufeng.weixin.pojo;
  2. /**
  3. *view类型的菜单
  4. *
  5. *@authorliuyq
  6. *@date2013-04-10
  7. */
  8. publicclassViewButtonextendsButton{
  9. privateStringtype;
  10. privateStringurl;
  11. publicStringgetType(){
  12. returntype;
  13. }
  14. publicvoidsetType(Stringtype){
  15. this.type=type;
  16. }
  17. publicStringgetUrl(){
  18. returnurl;
  19. }
  20. publicvoidsetUrl(Stringurl){
  21. this.url=url;
  22. }
  23. }


创建带view类型的菜单示例

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

[java] view plain copy
  1. packageorg.liufeng.weixin.main;
  2. importorg.liufeng.weixin.pojo.AccessToken;
  3. importorg.liufeng.weixin.pojo.Button;
  4. importorg.liufeng.weixin.pojo.CommonButton;
  5. importorg.liufeng.weixin.pojo.ComplexButton;
  6. importorg.liufeng.weixin.pojo.Menu;
  7. importorg.liufeng.weixin.pojo.ViewButton;
  8. importorg.liufeng.weixin.util.WeixinUtil;
  9. importorg.slf4j.Logger;
  10. importorg.slf4j.LoggerFactory;
  11. /**
  12. *菜单管理器类
  13. *
  14. *@authorliufeng
  15. *@date2013-08-08
  16. */
  17. publicclassMenuManager{
  18. privatestaticLoggerlog=LoggerFactory.getLogger(MenuManager.class);
  19. publicstaticvoidmain(String[]args){
  20. //第三方用户唯一凭证
  21. StringappId="000000000000000000";
  22. //第三方用户唯一凭证密钥
  23. StringappSecret="00000000000000000000000000000000";
  24. //调用接口获取access_token
  25. AccessTokenat=WeixinUtil.getAccessToken(appId,appSecret);
  26. if(null!=at){
  27. //调用接口创建菜单
  28. intresult=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. privatestaticMenugetMenu(){
  42. CommonButtonbtn11=newCommonButton();
  43. btn11.setName("天气预报");
  44. btn11.setType("click");
  45. btn11.setKey("11");
  46. CommonButtonbtn12=newCommonButton();
  47. btn12.setName("公交查询");
  48. btn12.setType("click");
  49. btn12.setKey("12");
  50. CommonButtonbtn13=newCommonButton();
  51. btn13.setName("周边搜索");
  52. btn13.setType("click");
  53. btn13.setKey("13");
  54. CommonButtonbtn14=newCommonButton();
  55. btn14.setName("历史上的今天");
  56. btn14.setType("click");
  57. btn14.setKey("14");
  58. CommonButtonbtn15=newCommonButton();
  59. btn15.setName("电影排行榜");
  60. btn15.setType("click");
  61. btn15.setKey("32");
  62. CommonButtonbtn21=newCommonButton();
  63. btn21.setName("歌曲点播");
  64. btn21.setType("click");
  65. btn21.setKey("21");
  66. CommonButtonbtn22=newCommonButton();
  67. btn22.setName("经典游戏");
  68. btn22.setType("click");
  69. btn22.setKey("22");
  70. CommonButtonbtn23=newCommonButton();
  71. btn23.setName("美女电台");
  72. btn23.setType("click");
  73. btn23.setKey("23");
  74. CommonButtonbtn24=newCommonButton();
  75. btn24.setName("人脸识别");
  76. btn24.setType("click");
  77. btn24.setKey("24");
  78. CommonButtonbtn25=newCommonButton();
  79. btn25.setName("聊天唠嗑");
  80. btn25.setType("click");
  81. btn25.setKey("25");
  82. CommonButtonbtn31=newCommonButton();
  83. btn31.setName("Q友圈");
  84. btn31.setType("click");
  85. btn31.setKey("31");
  86. CommonButtonbtn33=newCommonButton();
  87. btn33.setName("幽默笑话");
  88. btn33.setType("click");
  89. btn33.setKey("33");
  90. CommonButtonbtn34=newCommonButton();
  91. btn34.setName("用户反馈");
  92. btn34.setType("click");
  93. btn34.setKey("34");
  94. CommonButtonbtn35=newCommonButton();
  95. btn35.setName("关于我们");
  96. btn35.setType("click");
  97. btn35.setKey("35");
  98. ViewButtonbtn32=newViewButton();
  99. btn32.setName("使用帮助");
  100. btn32.setType("view");
  101. btn32.setUrl("http://liufeng.gotoip2.com/xiaoqrobot/help.jsp");
  102. ComplexButtonmainBtn1=newComplexButton();
  103. mainBtn1.setName("生活助手");
  104. mainBtn1.setSub_button(newButton[]{btn11,btn12,btn13,btn14,btn15});
  105. ComplexButtonmainBtn2=newComplexButton();
  106. mainBtn2.setName("休闲驿站");
  107. mainBtn2.setSub_button(newButton[]{btn21,btn22,btn23,btn24,btn25});
  108. ComplexButtonmainBtn3=newComplexButton();
  109. mainBtn3.setName("更多");
  110. mainBtn3.setSub_button(newButton[]{btn31,btn33,btn34,btn35,btn32});
  111. /**
  112. *这是公众号xiaoqrobot目前的菜单结构,每个一级菜单都有二级菜单项<br>
  113. *
  114. *在某个一级菜单下没有二级菜单的情况,menu该如何定义呢?<br>
  115. *比如,第三个一级菜单项不是“更多体验”,而直接是“幽默笑话”,那么menu应该这样定义:<br>
  116. *menu.setButton(newButton[]{mainBtn1,mainBtn2,btn33});
  117. */
  118. Menumenu=newMenu();
  119. menu.setButton(newButton[]{mainBtn1,mainBtn2,mainBtn3});
  120. returnmenu;
  121. }
  122. }

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

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


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

转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值