• [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来支持柳峰!

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


  • 相关阅读:
    巧用border效果
    移动端页面无刷新跳转方法有三种
    word-break和word-wrap的使用和区别
    动态获取移动端视宽,从而结合rem达到适配
    一步一步学习IdentityServer4 (3)自定登录界面并实现业务登录操作
    一步一步学习IdentityServer3 (15) 授权模式那些事
    一步一步学习IdentityServer4 (2) 开始一个简单的事例
    一步一步学习IdentityServer4 (1) 概要配置说明
    Owin 自定义中间件(2)中间件进阶
    一步一步学习IdentityServer3 (14) 启用Https
  • 原文地址:https://www.cnblogs.com/phisy/p/3363409.html
Copyright © 2020-2023  润新知