Java企業微信開發_04_自定義菜單
阿新 • • 發佈:2017-08-21
組裝 sys 測試 搜索 我們 測試類 ray 翻譯 請求
一、本節要點
1.菜單相關實體類的封裝
參考官方文檔中的請求包的內容,對菜單相關實體類進行封裝。
這裏需要格外註意的是,企業微信中請求包的數據是Json字符串格式的,而不是xml格式。關於json序列化的問題請參考上一節 Java企業微信開發_03_通訊錄同步
2.創建菜單的接口
public static String create_menu_url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&agentid=AGENTID";
註意此處的 ACCESS_TOKEN 與通訊錄那裏的 ACCESS_TOKEN 不同,記住只有通訊錄 ACCESS_TOKEN 才會用到通訊錄密鑰。其他地方用的都是應用密鑰。
還有雖然企業微信和微信公眾號開發的接口不同,但是大體思路是相通的。
二、代碼實現
1.實體類
按照企業微信官方文檔中關於自定義菜單的請求包的說明,定義好實體類。
1.1 按鈕的基類——Button
package com.ray.pojo.menu; /** * @desc : 按鈕的基類 * * @author: shirayner * @date : 2017-8-20 下午9:29:43 */ public class Button { private String name;View Codepublic String getName() { return name; } public void setName(String name) { this.name = name; } }
1.2 普通按鈕(子按鈕) ——CommonButton
package com.ray.pojo.menu; /** * @desc : 普通按鈕(子按鈕) * * @author: shirayner * @date : 2017-8-20 下午9:29:58View Code*/ public class CommonButton extends Button { private String type; private String key; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } }
1.3 復雜按鈕(父按鈕) ——ComplexButton
package com.ray.pojo.menu; /** * @desc : 復雜按鈕(父按鈕) * * @author: shirayner * @date : 2017-8-20 下午9:30:17 */ public class ComplexButton extends Button { private Button[] sub_button; public Button[] getSub_button() { return sub_button; } public void setSub_button(Button[] sub_button) { this.sub_button = sub_button; } }View Code
1.4 view類型的菜單 ——ViewButton
package com.ray.pojo.menu; /** * @desc : view類型的菜單 * * @author: shirayner * @date : 2017-8-20 下午9:30:44 */ 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 Code
1.5 菜單——Menu
package com.ray.pojo.menu; /** * @desc : 菜單 * * @author: shirayner * @date : 2017-8-20 下午9:30:31 */ public class Menu { private Button[] button; public Button[] getButton() { return button; } public void setButton(Button[] button) { this.button = button; } }View Code
2.業務類
業務類主要是java對象序列化,獲取accessToken以拼接請求ur,發送http請求調用接口。
2.1菜單業務類——MenuService
package com.ray.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.ray.pojo.menu.Button; import com.ray.pojo.menu.CommonButton; import com.ray.pojo.menu.ComplexButton; import com.ray.pojo.menu.Menu; import com.ray.pojo.menu.ViewButton; import com.ray.util.WeiXinUtil; import net.sf.json.JSONObject; public class MenuService { private static Logger log = LoggerFactory.getLogger(MenuService.class); // 菜單創建(POST) 限100(次/天) public static String create_menu_url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&agentid=AGENTID"; /** * 1.創建菜單 * * @param menu 菜單實例 * @param accessToken 有效的access_token * @return 0表示成功,其他值表示失敗 */ public void createMenu(String accessToken,Menu menu,int agentId) { //1.獲取json字符串:將Menu對象轉換為json字符串 Gson gson = new Gson(); String jsonMenu =gson.toJson(menu); //使用gson.toJson(user)即可將user對象順序轉成json System.out.println("jsonMenu:"+jsonMenu); //2.獲取請求的url create_menu_url = create_menu_url.replace("ACCESS_TOKEN", accessToken) .replace("AGENTID", String.valueOf(agentId)); //3.調用接口,發送請求,創建菜單 JSONObject jsonObject = WeiXinUtil.httpRequest(create_menu_url, "POST", jsonMenu); System.out.println("jsonObject:"+jsonObject.toString()); //4.錯誤消息處理 if (null != jsonObject) { if (0 != jsonObject.getInt("errcode")) { log.error("創建菜單失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); } } } /** * 2.組裝菜單數據 * * @return */ public Menu getMenu() { ViewButton btn11 = new ViewButton(); btn11.setName("JSSDK測試"); btn11.setType("view"); btn11.setUrl("http://5hcn2d.natappfree.cc/WeiXin_SanFenBaiXue/index.jsp"); CommonButton btn12 = new CommonButton(); btn12.setName("使用幫助"); btn12.setType("click"); btn12.setKey("12"); CommonButton btn13 = new CommonButton(); btn13.setName("翻譯功能"); btn13.setType("click"); btn13.setKey("13"); ViewButton btn14 = new ViewButton(); btn14.setName("上傳圖片"); btn14.setType("view"); btn14.setUrl("http://5hcn2d.natappfree.cc/WeiXin_SanFenBaiXue/uploadimg.jsp"); ViewButton btn15 = new ViewButton(); btn15.setName("上傳圖片2"); btn15.setType("view"); btn15.setUrl("http://5hcn2d.natappfree.cc/WeiXin_SanFenBaiXue/index2.jsp"); 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 }); /** * 這是企業號目前的菜單結構,每個一級菜單都有二級菜單項<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; } }View Code
3.測試類
調用業務類,創建菜單
3.1菜單測試類——MenuTest
package com.ray.test; import org.junit.Test; import com.ray.pojo.menu.Menu; import com.ray.service.MenuService; import com.ray.util.WeiXinParamesUtil; import com.ray.util.WeiXinUtil; public class MenuTest { @Test public void testCreateMenu(){ //1.組裝菜單 MenuService ms=new MenuService(); Menu menu=ms.getMenu(); //2.獲取access_token:根據企業id和應用密鑰獲取access_token String accessToken=WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken(); System.out.println("accessToken:"+accessToken); //3.創建菜單 ms.createMenu( accessToken, menu, WeiXinParamesUtil.agentId); } }View Code
三、菜單事件的響應
菜單的事件響應,可歸為 消息推送之被動回復消息 的一種(個人理解,望指正)。會在後續博客中補充。
四、參考資料
1.企業微信官方文檔:https://work.weixin.qq.com/api/doc#10786
2.柳峰:[038] 微信公眾帳號開發教程第14篇-自定義菜單的創建及菜單事件響應
Java企業微信開發_04_自定義菜單