wx-tools WxMessageRouter的使用例子

2023-03-22 17:18 更新

2.5.1 創(chuàng)建菜單欄

假設一下,我現(xiàn)在想把公眾號的菜單欄設置成這樣的:

Menu

我們可以寫一個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等。詳情建議先看官方文檔。

2.5.2 創(chuàng)建消息路由并設置第一個規(guī)則(Rule)

假設需求如下: 我只接收菜單欄類型為:Click,且Key為MenuKey.HELP的消息,其他一律放棄不接收。

正常來說,常規(guī)寫法應該是加一個if判斷,例如:

if("CLICK".equals(message.event) &&  MenuKey.HELP.equals(message.eventKey)){
    doSomething();
}

這樣的寫法會隨著需求增多,而越來越龐大臃腫。

而wx-tools使用消息路由的方式去過濾處理消息,寫法如下:

  • 補充WxController中的Post處理方法:
    
    @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
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號