此篇文章爲轉載
引言及內容概要
距離寫上一篇文章《自定義菜單的創建及菜單事件響應》整整過了兩個月的時間,那時公衆平臺還沒有開放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/"
- }
建立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/article/details/12588067