假設一下,我現(xiàn)在想把公眾號的菜單欄設置成這樣的:
我們可以寫一個Main方法,來更改公眾號的菜單欄,代碼如下:
public class Menu {
public static void main(String[] args) {
IService iService = new WxService();
WxMenu menu = new WxMenu();
List<WxMenu.WxMenuButton> btnList = new ArrayList<>();
//飆升功能
WxMenu.WxMenuButton btn1 = new WxMenu.WxMenuButton();
btn1.setName("分類");
List<WxMenu.WxMenuButton> subList = new ArrayList<>();
WxMenu.WxMenuButton btn1_1 = new WxMenu.WxMenuButton();
btn1_1.setType(WxConsts.MENU_BUTTON_CLICK);
btn1_1.setKey(MenuKey.HOT_SONG);
btn1_1.setName("飆升榜");
WxMenu.WxMenuButton btn1_2 = new WxMenu.WxMenuButton();
btn1_2.setType(WxConsts.MENU_BUTTON_CLICK);
btn1_2.setKey(MenuKey.TOP_500);
btn1_2.setName("TOP500");
WxMenu.WxMenuButton btn1_3 = new WxMenu.WxMenuButton();
btn1_3.setType(WxConsts.MENU_BUTTON_CLICK);
btn1_3.setKey(MenuKey.NET_HOT_SONG);
btn1_3.setName("網(wǎng)絡紅歌");
WxMenu.WxMenuButton btn1_4 = new WxMenu.WxMenuButton();
btn1_4.setType(WxConsts.MENU_BUTTON_CLICK);
btn1_4.setKey(MenuKey.HUAYU_SONG);
btn1_4.setName("華語新歌");
WxMenu.WxMenuButton btn1_5 = new WxMenu.WxMenuButton();
btn1_5.setType(WxConsts.MENU_BUTTON_CLICK);
btn1_5.setKey(MenuKey.XINAO_SONG);
btn1_5.setName("洗腦神曲");
WxMenu.WxMenuButton btn2 = new WxMenu.WxMenuButton();
btn2.setType(WxConsts.MENU_BUTTON_CLICK);
btn2.setKey(MenuKey.CHANGE_NEWS);
btn2.setName("換一組");
WxMenu.WxMenuButton btn3 = new WxMenu.WxMenuButton();
btn3.setType(WxConsts.MENU_BUTTON_CLICK);
btn3.setKey(MenuKey.HELP);
btn3.setName("幫助");
subList.addAll(Arrays.asList(btn1_1, btn1_2, btn1_3, btn1_4, btn1_5));
btn1.setSub_button(subList);
//將三個按鈕設置進btnList
btnList.add(btn1);
btnList.add(btn2);
btnList.add(btn3);
//設置進菜單類
menu.setButton(btnList);
//調(diào)用API即可
try {
//參數(shù)1--menu ,參數(shù)2--是否是個性化定制。如果是個性化菜單欄,需要設置MenuRule
iService.createMenu(menu, false);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
}
菜單欄的參數(shù)設置,請參考官方文檔 - 菜單欄的創(chuàng)建, 菜單欄的按鈕有分很多種類型(type),例如click,view等。詳情建議先看官方文檔。
假設需求如下: 我只接收菜單欄類型為:Click,且Key為MenuKey.HELP的消息,其他一律放棄不接收。
正常來說,常規(guī)寫法應該是加一個if判斷,例如:
if("CLICK".equals(message.event) && MenuKey.HELP.equals(message.eventKey)){
doSomething();
}
這樣的寫法會隨著需求增多,而越來越龐大臃腫。
而wx-tools使用消息路由的方式去過濾處理消息,寫法如下:
@PostMapping
public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
// 創(chuàng)建一個路由器 WxMessageRouter router = new WxMessageRouter(iService); try { // 微信服務器推送過來的是XML格式。 WxXmlMessage wx = XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream()); System.out.println("消息:\n " + wx.toString()); router.rule().event(WxConsts.EVT_CLICK).eventKey(MenuKey.HELP).handler(HelpDocHandler.getInstance()).end(); // 把消息傳遞給路由器進行處理 WxXmlOutMessage xmlOutMsg = router.route(wx); if (xmlOutMsg != null) // 因為是明文,所以不用加密,直接返回給用戶 out.print(xmlOutMsg.toXml());。
} catch (Exception e) { e.printStackTrace(); } finally { out.close(); }
}
- HelpDocHandler.java代碼如下:
> Handler代碼采用單例模式,為了解決消息重試的問題。但由于網(wǎng)絡問題導致返回結(jié)果慢了。會自動重試,返回多條信息。當然,這種做法不建議你們使用,因為這樣寫,同一時間僅僅允許一個線程進來處理,并不適合多線程環(huán)境。
> 因為這個音樂爬蟲項目是做給我女票使用的,用戶僅僅只有一個。所以我可以這么做,而你不們作為項目,不可以!??!好了繼續(xù)~
> 官方關于消息重試的機制[點擊這里查看](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453)。
public class HelpDocHandler implements WxMessageHandler {
private static HelpDocHandler instance = null;
private boolean isRun = false;
private HelpDocHandler(){}
public static synchronized HelpDocHandler getInstance(){ if (instance == null) { instance = new HelpDocHandler(); } return instance; }
private synchronized boolean getIsRun() { return isRun; }
private synchronized void setRun(boolean run) { isRun = run; }
@Override public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService iService) throws WxErrorException { WxXmlOutMessage response = null; if (!getIsRun()) { setRun(true); response = execute(wxMessage); setRun(false); } return response; }
private WxXmlOutMessage execute(WxXmlMessage wxMessage) { return WxXmlOutMessage.TEXT().content(ResponseConst.HELP).toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build(); } }
- 接下來測試一下,點擊公眾號的幫助按鈕,正常返回幫助說明。而點擊其他按鈕,均無反應。
這樣我們就成功利用消息路由和創(chuàng)建第一個規(guī)則(Rule)去過濾消息,并處理返回了。
是不是很簡單~2333
現(xiàn)在我們嘗試使用wx-tools其他特性,添加更多的功能進去吧~gogogo
更多建議: