[039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
引言及内容概要
距离写上一篇文章《自定义菜单的创建及菜单事件响应》整整过了两个月的时间,那时公众平台还没有开放view类型的菜单。在不久前,微信公众平台悄悄开放了view类型的菜单,却没有在首页发布任何通知,貌似微信团队很喜欢这么干。一个偶然的机会,我留意到API文档的自定义菜单接口发生了变化,增加了对菜单view类型的说明:
view(访问网页):
用户点击view类型按钮后,会直接跳转到开发者指定的url中。
于是我在第一时间更新了小q机器人(微信号:xiaoqrobot)的菜单,在一级菜单“更多”下增加了二级菜单“使用帮助”,点击该菜单项会直接跳转到网页,如下图所示。
最近也有不少网友问起这种类型的菜单是如何创建的,本篇文章就为大家介绍下view类型的自定义菜单该如何创建。
自定义菜单的两种类型(click和view)
公众平台API文档中给出了自定义菜单的json结构示例,我从中截取两个菜单项的json代码,一个是click类型,另一个是view类型,如下所示。
- {
- "type":"click",
- "name":"今日歌曲",
- "key":"V1001_TODAY_MUSIC"
- },
- {
- "type":"view",
- "name":"歌手简介",
- "url":"http://www.qq.com/"
- }
从上面可以看出,两种类型的菜单除了type值不同之外,属性也有差别。click类型的菜单有key属性,而view类型的菜单没有key属性,与之对应的是url属性。通过上一篇的学习我们知道,key值是用于判断用户点击了哪个click类型的菜单项。而view类型的菜单没有key属性,目前无法在公众账号后台判断是否有用户点击了view类型的菜单项,也就没办法知道哪个用户点击了view类型的菜单项。
建立view类型的菜单对象
View类型的菜单有3个属性:type、name和url。在上一篇文章中,我们创建了菜单项的基类Button,Button类只有一个属性name。View类型的菜单对象也需要继承Button类,代码如下:
- package org.liufeng.weixin.pojo;
- /**
- * view类型的菜单
- *
- * @author liuyq
- * @date 2013-04-10
- */
- public class ViewButton extends Button {
- private String type;
- 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;
- }
- }
创建带view类型的菜单示例
我们对前一篇文章中给出的菜单创建代码进行调整,增加view类型的菜单项,完整的菜单创建代码如下:
- package org.liufeng.weixin.main;
- import org.liufeng.weixin.pojo.AccessToken;
- import org.liufeng.weixin.pojo.Button;
- import org.liufeng.weixin.pojo.CommonButton;
- import org.liufeng.weixin.pojo.ComplexButton;
- import org.liufeng.weixin.pojo.Menu;
- import org.liufeng.weixin.pojo.ViewButton;
- import org.liufeng.weixin.util.WeixinUtil;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * 菜单管理器类
- *
- * @author liufeng
- * @date 2013-08-08
- */
- public class MenuManager {
- private static Logger log = LoggerFactory.getLogger(MenuManager.class);
- public static void main(String[] args) {
- // 第三方用户唯一凭证
- String appId = "000000000000000000";
- // 第三方用户唯一凭证密钥
- String appSecret = "00000000000000000000000000000000";
- // 调用接口获取access_token
- AccessToken at = WeixinUtil.getAccessToken(appId, appSecret);
- if (null != at) {
- // 调用接口创建菜单
- int result = WeixinUtil.createMenu(getMenu(), at.getToken());
- // 判断菜单创建结果
- if (0 == result)
- log.info("菜单创建成功!");
- else
- log.info("菜单创建失败,错误码:" + result);
- }
- }
- /**
- * 组装菜单数据
- *
- * @return
- */
- private static Menu getMenu() {
- CommonButton btn11 = new CommonButton();
- btn11.setName("天气预报");
- btn11.setType("click");
- btn11.setKey("11");
- CommonButton btn12 = new CommonButton();
- btn12.setName("公交查询");
- btn12.setType("click");
- btn12.setKey("12");
- CommonButton btn13 = new CommonButton();
- btn13.setName("周边搜索");
- btn13.setType("click");
- btn13.setKey("13");
- CommonButton btn14 = new CommonButton();
- btn14.setName("历史上的今天");
- btn14.setType("click");
- btn14.setKey("14");
- CommonButton btn15 = new CommonButton();
- btn15.setName("电影排行榜");
- btn15.setType("click");
- btn15.setKey("32");
- CommonButton btn21 = new CommonButton();
- btn21.setName("歌曲点播");
- btn21.setType("click");
- btn21.setKey("21");
- CommonButton btn22 = new CommonButton();
- btn22.setName("经典游戏");
- btn22.setType("click");
- btn22.setKey("22");
- CommonButton btn23 = new CommonButton();
- btn23.setName("美女电台");
- btn23.setType("click");
- btn23.setKey("23");
- CommonButton btn24 = new CommonButton();
- btn24.setName("人脸识别");
- btn24.setType("click");
- btn24.setKey("24");
- CommonButton btn25 = new CommonButton();
- btn25.setName("聊天唠嗑");
- btn25.setType("click");
- btn25.setKey("25");
- CommonButton btn31 = new CommonButton();
- btn31.setName("Q友圈");
- btn31.setType("click");
- btn31.setKey("31");
- CommonButton btn33 = new CommonButton();
- btn33.setName("幽默笑话");
- btn33.setType("click");
- btn33.setKey("33");
- CommonButton btn34 = new CommonButton();
- btn34.setName("用户反馈");
- btn34.setType("click");
- btn34.setKey("34");
- CommonButton btn35 = new CommonButton();
- btn35.setName("关于我们");
- btn35.setType("click");
- btn35.setKey("35");
- ViewButton btn32 = new ViewButton();
- btn32.setName("使用帮助");
- btn32.setType("view");
- btn32.setUrl("http://liufeng.gotoip2.com/xiaoqrobot/help.jsp");
- ComplexButton mainBtn1 = new ComplexButton();
- mainBtn1.setName("生活助手");
- mainBtn1.setSub_button(new Button[] { btn11, btn12, btn13, btn14, btn15 });
- ComplexButton mainBtn2 = new ComplexButton();
- mainBtn2.setName("休闲驿站");
- mainBtn2.setSub_button(new Button[] { btn21, btn22, btn23, btn24, btn25 });
- ComplexButton mainBtn3 = new ComplexButton();
- mainBtn3.setName("更多");
- mainBtn3.setSub_button(new Button[] { btn31, btn33, btn34, btn35, btn32 });
- /**
- * 这是公众号xiaoqrobot目前的菜单结构,每个一级菜单都有二级菜单项<br>
- *
- * 在某个一级菜单下没有二级菜单的情况,menu该如何定义呢?<br>
- * 比如,第三个一级菜单项不是“更多体验”,而直接是“幽默笑话”,那么menu应该这样定义:<br>
- * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 });
- */
- Menu menu = new Menu();
- menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
- return menu;
- }
- }
119~122行代码就是用于创建view类型菜单项的。上面的菜单结构也是小q机器人(微信号:xiaoqrobot)目前在使用的,读者可以对照着理解。
补充:居然还有些网友问我上面的自定义菜单创建代码在哪里调用,问我为什么不把调用的代码也公开?搞的我都有点不好意思了。上面的菜单创建代码是写在main方法中,直接在开发工具中运行一下就可以了,这应该是最最基础的Java知识了。另外,菜单只要创建一次,会一直存在的,不需要每次启动应用程序都去创建菜单。当然,你也可以把菜单的创建代码集成到项目中,并非一定要放在main方法中。程序是死的,人是活的,解决方法往往有很多种,怎么方便实用就怎么来!
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰!
[039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)的更多相关文章
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用QQ表情, ...
- 微信公众帐号开发教程第4篇-----开发模式启用及接口配置Java
欢迎加入群:347245650 345531810 进行讨论相互交流 我的微信号:572839485 我的微信公众账号 我的微社区欢迎关注 索取源码←请点击 图床:没有服务器 拖拽图片 外网即 ...
- [034] 微信公众帐号开发教程第10篇-解析接口中的消息创建时间CreateTime(转)
从微信公众平台的消息接口指南中能够看出,每种类型的消息定义中,都包括有CreateTime參数,它表示消息的创建时间,例如以下图所看到的: 上图是消息接口指南中4.1-文本消息的定义.注意Create ...
- 微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙 - V2EX
微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙 - V2EX 微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙
- 微信公众帐号开发之一(java)
闲来没事,就记录一下微信公众平台的开发吧~ 其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的. 微信公众平台订阅号和服 ...
- 微信公众帐号开发-消息创建时间long型与标准时间的互相转换
/** * */ package com.hd.admin.wxmeet.utils; /** * @author jymcpp * */ import java.text.DateFor ...
- 微信公众账号开发教程(四)自定义菜单(含实例源码)——转自http://www.cnblogs.com/yank/p/3418194.html
微信公众账号开发教程(四)自定义菜单 请尊重作者版权,如需转载,请标明出处. 应大家强烈要求,将自定义菜单功能课程提前. 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了 ...
- 欢迎大家关注我的微信公众帐号小q机器人(xiaoqrobot)(转)
一个偶然的机会让我接触到了微信公众平台,赶紧加了几个交流群了解下相关情况,突然间发现好像全部的APP开发人员都在研究微信公众帐号的开发,而我显得有些落舞了.至于为什么热度会这么高,我想一个数字足以说明 ...
随机推荐
- Openstack 目录
[一] OpenStack 基础环境 [二] OpenStack 认证服务 KeyStone [三] OpenStack 镜像服务 Glance [四] OpenStack 计算服务 Nova [五] ...
- 国内IT技术博客对比
今天我想就自己对用了国内几个IT行业领先的博客做一个心得体会的总结: 我总共是用了三个,第一个是新浪,第二个是CSDN,第三个是博客园: 当然期间有自己搭建过wordpress,也用了一段时间,但是感 ...
- keepalived+haproxy-部署高可用负载均衡
环境: 准备两台机子,安装haproxy及keepalive都一样,只是配置不一样而已. 这里只说明一台机子上安装haproxy及keepalive. ======================== ...
- STL 常见容器
vector: 是一种在结尾处高效插入.删除的容器,本质上是一个动态数组,可以自动维护数组的空间分配.它也允许在开头和中间插入.删除数据,但是效率极低. <span style="fo ...
- 出力csv
public static void ExportResultLog(System.Data.DataTable dt, string fileName, string path) { if (!Sy ...
- JavaScript事件总结
JavaScript 事件总结 本文总结自<JavaScript高级程序设计>以及自己平时的经验,针对较新浏览器以及 DOM3 级事件标准(2016年8月),对少部分内容作了更正,增加 ...
- Javascript 计算分页
var getPageData = function (last_page, current_page) { var numberLinks = []; var i = 0; for (i; i &l ...
- PythonCrawl自学日志(2)
一.Scrapy环境的安装 1.配套组件的安装 由于开发环境是在VS2015Community中编码,默认下载的python3.5,系统是windows8.1,为此需要安装的组件有如下列表: 所有的组 ...
- I2C总线模拟(郭天祥视屏)
电路图 思路 1.向EEPROM中通过I2C总线写入一个字节 2.通过I2C总线读出写入的字节 3.如果写入和读出成功点亮发光二极管 程序 #include <REGX51.H> #def ...
- iOS序列化与反序列化
1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一 ...