二十五:微信公衆帳號開發-自定義菜單的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. /** 
  4.  * view類型的菜單 
  5.  *  
  6.  * @author liuyq 
  7.  * @date 2013-04-10 
  8.  */  
  9. public class ViewButton extends Button {  
  10.     private String type;  
  11.     private String url;  
  12.   
  13.     public String getType() {  
  14.         return type;  
  15.     }  
  16.   
  17.     public void setType(String type) {  
  18.         this.type = type;  
  19.     }  
  20.   
  21.     public String getUrl() {  
  22.         return url;  
  23.     }  
  24.   
  25.     public void setUrl(String url) {  
  26.         this.url = url;  
  27.     }  
  28. }  


創建帶view類型的菜單示例

我們對前一篇文章中給出的菜單創建代碼進行調整,增加view類型的菜單項,完整的菜單創建代碼如下:

[java] view plaincopy
  1. package org.liufeng.weixin.main;  
  2.   
  3. import org.liufeng.weixin.pojo.AccessToken;  
  4. import org.liufeng.weixin.pojo.Button;  
  5. import org.liufeng.weixin.pojo.CommonButton;  
  6. import org.liufeng.weixin.pojo.ComplexButton;  
  7. import org.liufeng.weixin.pojo.Menu;  
  8. import org.liufeng.weixin.pojo.ViewButton;  
  9. import org.liufeng.weixin.util.WeixinUtil;  
  10. import org.slf4j.Logger;  
  11. import org.slf4j.LoggerFactory;  
  12.   
  13. /** 
  14.  * 菜單管理器類 
  15.  *  
  16.  * @author liufeng 
  17.  * @date 2013-08-08 
  18.  */  
  19. public class MenuManager {  
  20.     private static Logger log = LoggerFactory.getLogger(MenuManager.class);  
  21.   
  22.     public static void main(String[] args) {  
  23.         // 第三方用戶唯一憑證  
  24.         String appId = "000000000000000000";  
  25.         // 第三方用戶唯一憑證密鑰  
  26.         String appSecret = "00000000000000000000000000000000";  
  27.   
  28.         // 調用接口獲取access_token  
  29.         AccessToken at = WeixinUtil.getAccessToken(appId, appSecret);  
  30.   
  31.         if (null != at) {  
  32.             // 調用接口創建菜單  
  33.             int result = WeixinUtil.createMenu(getMenu(), at.getToken());  
  34.   
  35.             // 判斷菜單創建結果  
  36.             if (0 == result)  
  37.                 log.info("菜單創建成功!");  
  38.             else  
  39.                 log.info("菜單創建失敗,錯誤碼:" + result);  
  40.         }  
  41.     }  
  42.   
  43.     /** 
  44.      * 組裝菜單數據 
  45.      *  
  46.      * @return 
  47.      */  
  48.     private static Menu getMenu() {  
  49.         CommonButton btn11 = new CommonButton();  
  50.         btn11.setName("天氣預報");  
  51.         btn11.setType("click");  
  52.         btn11.setKey("11");  
  53.   
  54.         CommonButton btn12 = new CommonButton();  
  55.         btn12.setName("公交查詢");  
  56.         btn12.setType("click");  
  57.         btn12.setKey("12");  
  58.   
  59.         CommonButton btn13 = new CommonButton();  
  60.         btn13.setName("周邊搜索");  
  61.         btn13.setType("click");  
  62.         btn13.setKey("13");  
  63.   
  64.         CommonButton btn14 = new CommonButton();  
  65.         btn14.setName("歷史上的今天");  
  66.         btn14.setType("click");  
  67.         btn14.setKey("14");  
  68.           
  69.         CommonButton btn15 = new CommonButton();  
  70.         btn15.setName("電影排行榜");  
  71.         btn15.setType("click");  
  72.         btn15.setKey("32");  
  73.   
  74.         CommonButton btn21 = new CommonButton();  
  75.         btn21.setName("歌曲點播");  
  76.         btn21.setType("click");  
  77.         btn21.setKey("21");  
  78.   
  79.         CommonButton btn22 = new CommonButton();  
  80.         btn22.setName("經典遊戲");  
  81.         btn22.setType("click");  
  82.         btn22.setKey("22");  
  83.   
  84.         CommonButton btn23 = new CommonButton();  
  85.         btn23.setName("美女電臺");  
  86.         btn23.setType("click");  
  87.         btn23.setKey("23");  
  88.   
  89.         CommonButton btn24 = new CommonButton();  
  90.         btn24.setName("人臉識別");  
  91.         btn24.setType("click");  
  92.         btn24.setKey("24");  
  93.   
  94.         CommonButton btn25 = new CommonButton();  
  95.         btn25.setName("聊天嘮嗑");  
  96.         btn25.setType("click");  
  97.         btn25.setKey("25");  
  98.   
  99.         CommonButton btn31 = new CommonButton();  
  100.         btn31.setName("Q友圈");  
  101.         btn31.setType("click");  
  102.         btn31.setKey("31");  
  103.   
  104.         CommonButton btn33 = new CommonButton();  
  105.         btn33.setName("幽默笑話");  
  106.         btn33.setType("click");  
  107.         btn33.setKey("33");  
  108.           
  109.         CommonButton btn34 = new CommonButton();  
  110.         btn34.setName("用戶反饋");  
  111.         btn34.setType("click");  
  112.         btn34.setKey("34");  
  113.           
  114.         CommonButton btn35 = new CommonButton();  
  115.         btn35.setName("關於我們");  
  116.         btn35.setType("click");  
  117.         btn35.setKey("35");  
  118.           
  119.         ViewButton btn32 = new ViewButton();  
  120.         btn32.setName("使用幫助");  
  121.         btn32.setType("view");  
  122.         btn32.setUrl("http://liufeng.gotoip2.com/xiaoqrobot/help.jsp");  
  123.   
  124.         ComplexButton mainBtn1 = new ComplexButton();  
  125.         mainBtn1.setName("生活助手");  
  126.         mainBtn1.setSub_button(new Button[] { btn11, btn12, btn13, btn14, btn15 });  
  127.   
  128.         ComplexButton mainBtn2 = new ComplexButton();  
  129.         mainBtn2.setName("休閒驛站");  
  130.         mainBtn2.setSub_button(new Button[] { btn21, btn22, btn23, btn24, btn25 });  
  131.   
  132.         ComplexButton mainBtn3 = new ComplexButton();  
  133.         mainBtn3.setName("更多");  
  134.         mainBtn3.setSub_button(new Button[] { btn31, btn33, btn34, btn35, btn32 });  
  135.   
  136.         /** 
  137.          * 這是公衆號xiaoqrobot目前的菜單結構,每個一級菜單都有二級菜單項<br> 
  138.          *  
  139.          * 在某個一級菜單下沒有二級菜單的情況,menu該如何定義呢?<br> 
  140.          * 比如,第三個一級菜單項不是“更多體驗”,而直接是“幽默笑話”,那麼menu應該這樣定義:<br> 
  141.          * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 }); 
  142.          */  
  143.         Menu menu = new Menu();  
  144.         menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });  
  145.   
  146.         return menu;  
  147.     }  
  148. }  

119~122行代碼就是用於創建view類型菜單項的。上面的菜單結構也是小q機器人(微信號:xiaoqrobot)目前在使用的,讀者可以對照着理解。

補充:居然還有些網友問我上面的自定義菜單創建代碼在哪裏調用,問我爲什麼不把調用的代碼也公開?搞的我都有點不好意思了。上面的菜單創建代碼是寫在main方法中,直接在開發工具中運行一下就可以了,這應該是最最基礎的Java知識了。另外,菜單隻要創建一次,會一直存在的,不需要每次啓動應用程序都去創建菜單。當然,你也可以把菜單的創建代碼集成到項目中,並非一定要放在main方法中。程序是死的,人是活的,解決方法往往有很多種,怎麼方便實用就怎麼來!


如果覺得文章對你有所幫助,請通過留言或關注微信公衆帳號xiaoqrobot來支持柳峯!

謝謝柳峯老師:轉載地址:http://blog.csdn.net/lyq8479/article/details/12588067
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章