­

Java微信公眾平台開發(九)–微信自定義菜單的創建實現 (一)使用網頁調試工具生成菜單(二)採用代碼實現菜單的生成

  • 2019 年 10 月 5 日
  • 筆記

  自定義菜單這個功能在我們普通的編輯模式下是可以直接在後台編輯的,但是一旦我們進入開發模式之後我們的自定義菜單就需要自己用代碼實現,所以對於剛開始接觸的人來說可能存在一定的疑惑,這裡我說下平時我們在開發模式下常用的兩種自定義菜單的實現方式:①不用寫實現代碼,直接用網頁測試工具Post json字符串生成菜單;②就是在我們的開發中用代碼實現菜單生成!(參考文檔:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html )在自定義菜單中菜單的類型分為兩種,一種為view的視圖菜單,點擊之後直接跳轉到url頁面;還有一種是click類型的點擊型,後端通過點擊事件類型給與不同的相應;後面新增了各種特色功能的菜單其本質都還是Click類型的菜單,所以生成的規則都是一樣的,其生成菜單的方式都是向微信服務器post json字符串生成菜單,下面講述菜單生成的方法和規則!(參考文檔:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html )在自定義菜單中菜單的類型分為兩種,一種為view的視圖菜單,點擊之後直接跳轉到url頁面;還有一種是click類型的點擊型,後端通過點擊事件類型給與不同的相應;後面新增了各種特色功能的菜單其本質都還是Click類型的菜單,所以生成的規則都是一樣的,其生成菜單的方式都是向微信服務器post json字符串生成菜單,下面講述菜單生成的方法和規則!

(一)使用網頁調試工具生成菜單

我們通過連接(https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95&form=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3%20/menu/create )進入到網頁調試工具,如下圖:

在這裡我們生成菜單的時候只需要我們賬號的有效token和json字符串即可,這裡的json字符串可以參照文檔中的案例做出修改得到,我這裡給出的一個案例如下:

 1 {   2     "button": [   3         {   4             "name": "博客",   5             "type": "view",   6             "url": "https://www.cnblogs.com/gede"   7         },   8         {   9             "name": "菜單",  10             "sub_button": [  11                 {  12                     "key": "text",  13                     "name": "回復圖文",  14                     "type": "click"  15                 },  16                 {  17                     "name": "博客",  18                     "type": "view",  19                     "url": "https://www.cnblogs.com/gede"  20                 }  21             ]  22         },  23         {  24             "key": "text",  25             "name": "回復圖文",  26             "type": "click"  27         }  28     ]  29 }

我們填入響應的token,點擊檢查問題如果返回結果Ok就可以了。到這裡我們採用web測試工具生成菜單的方式就完成了,下面接着介紹用代碼生成菜單!

(二)採用代碼實現菜單的生成

前面我們有說道在菜單中有view和click兩種類型的事件,這裡我們首先在代碼中建立兩種類型對應的java實體,view類型建立實體ViewButton.java如下:

 1 package com.gede.wechat.menu;   2 /**   3 * @author gede   4 * @version date:2019年5月28日 下午7:02:43   5 * @description :   6 */   7 public class ViewButton {   8     private String type;   9     private String name;  10     private String url;  11  12     public String getType() {  13         return type;  14     }  15  16     public void setType(String type) {  17         this.type = type;  18     }  19  20     public String getName() {  21         return name;  22     }  23  24     public void setName(String name) {  25         this.name = name;  26     }  27  28     public String getUrl() {  29         return url;  30     }  31  32     public void setUrl(String url) {  33         this.url = url;  34     }  35  36 }

同樣的建立click的實體ClickButton.java如下:

 1 package com.gede.wechat.menu;   2 /**   3 * @author gede   4 * @version date:2019年5月28日 下午7:03:02   5 * @description :   6 */   7 public class ClickButton {   8     private String type;   9     private String name;  10     private String key;  11  12     public String getType() {  13         return type;  14     }  15  16     public void setType(String type) {  17         this.type = type;  18     }  19  20     public String getName() {  21         return name;  22     }  23  24     public void setName(String name) {  25         this.name = name;  26     }  27  28     public String getKey() {  29         return key;  30     }  31  32     public void setKey(String key) {  33         this.key = key;  34     }  35  36 }

這裡創建兩個實體也是為了方便我們在自定義菜單中對json的封裝,在這裡我用代碼的形式封裝了上面給出的同樣的json格式,並調用生成自定義菜單的接口發送到微信服務器,簡單代碼如下:

 1 package com.gede.wechat.menu;   2 import org.springframework.stereotype.Component;   3   4 import com.alibaba.fastjson.JSONObject;   5 import net.sf.json.JSONArray;   6   7 import com.gede.web.util.GlobalConstants;   8 import com.gede.wechat.util.HttpUtils;   9  10 /**  11 * @author gede  12 * @version date:2019年5月28日 下午7:03:24  13 * @description :  14 */  15 @Component  16 public class MenuMain {  17  18     public void createMenu(){  19          ClickButton cbt=new ClickButton();  20             cbt.setKey("image");  21             cbt.setName("回復圖片");  22             cbt.setType("click");  23  24  25             ViewButton vbt=new ViewButton();  26             vbt.setUrl("https://www.cnblogs.com/gede");  27             vbt.setName("博客");  28             vbt.setType("view");  29  30             JSONArray sub_button=new JSONArray();  31             sub_button.add(cbt);  32             sub_button.add(vbt);  33  34  35             JSONObject buttonOne=new JSONObject();  36             buttonOne.put("name", "菜單");  37             buttonOne.put("sub_button", sub_button);  38  39             JSONArray button=new JSONArray();  40             button.add(vbt);  41             button.add(buttonOne);  42             button.add(cbt);  43  44             JSONObject menujson=new JSONObject();  45             menujson.put("button", button);  46             System.out.println(menujson);  47  48             //這裡為請求接口的url   +號後面的是token,這裡就不做過多對token獲取的方法解釋  49             String url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+GlobalConstants.getInterfaceUrl("access_token");  50  51             try{  52                 String rs=HttpUtils.sendPostBuffer(url, menujson.toJSONString());  53                 System.out.println(rs);  54             }catch(Exception e){  55                 System.out.println("請求錯誤!");  56             }  57     }  58 }

這裏面加了@Component組件,可以被掃為spring 的一個bean自動裝配。我們在寫一個簡單的jsp實現響應這裡的createMenue方法。

添加了Component組件掃描後,我們在applicationContext.xml中添加組件掃描包 :<context:component-scan base-package="com.gede.wechat.menu"></context:component-scan>

如果配置文件提示報錯,我們添加content上下文:點開NameSpaces 如下圖:

寫到這裡,我們就差控制器來調用我們的createMenue方法了。我們創建MenueController類,簡單代碼如下:

 1 package com.gede.wechat.controller;   2   3 import static org.springframework.web.bind.annotation.RequestMethod.GET;   4   5 import java.io.PrintWriter;   6   7 import javax.servlet.http.HttpServletRequest;   8 import javax.servlet.http.HttpServletResponse;   9  10 import org.springframework.beans.factory.annotation.Autowired;  11 import org.springframework.stereotype.Controller;  12 import org.springframework.web.bind.annotation.RequestMapping;  13 import org.springframework.web.bind.annotation.RequestMethod;  14 import org.springframework.web.bind.annotation.RequestParam;  15  16 import com.gede.wechat.menu.MenuMain;  17 import com.gede.wechat.util.SignUtil;  18  19 /**  20 * @author gede  21 * @version date:2019年5月28日 下午7:20:08  22 * @description :  23 */  24 @Controller  25 @RequestMapping("/menue")  26 public class MenueController {  27  28     private MenuMain menue;  29     @Autowired  30     public MenueController(MenuMain menue) {  31         super();  32         this.menue = menue;  33     }  34  35     @RequestMapping(value="/",method=GET)  36     public String home(){  37         menue.createMenu();  3839     }  40  41 }

現在運行我們的項目,項目跑起來後,在瀏覽器地址欄輸入:.自己的服務器地址./mychat/menue/create/ 。返回控制台,查看,效果如下:

再來看微信端的效果:

關於文中涉及到的Spring相關知識,大家可以去看我關於Spring的博客。有不懂的也可以留言。