welcome to xlongwei.com

欢迎大家一起学习、交流、分享


QQ:9167702333 邮箱:admin@xlongwei.com

微信公众号菜单封装


分类 Java   关键字 分享   标签 java   algorithm   发布 hongwei  1464059544540
注意 转载须保留原文链接,译文链接,作者译者等信息。  
微信公众号菜单接口参数是基于json的,因此前端js可以非常方便地操作菜单(包括生成、解析、修改、删除等),如果使用Java调用接口则菜单的处理比较麻烦,这里介绍一下微信公众号菜单封装类Menu。

封装Menu类时,首先想到的是链式语法可以非常方便地创建菜单,例如:
new Menu().addButton("菜单1").addSubButton("子菜单1","click","menu1").addSubButtonView("子菜单2","url").parent().addButton("菜单2").parent();
创建一级子菜单后进入二级子菜单操作,parent()回到上级菜单,Menu.toString()得到自定义菜单接口参数。因此有了以下的接口
class Menu {
Button addButton(String name);
}
class Button {
Button addSubButton(String name, String type, String value);//由于二级子菜单已创建完成,因此返回一级子菜单
Button addSubButtonView(String name, String url);//其实是addSubButton的变异
Menu parent();
}

接口定义好后,就需要数据来承载实现逻辑
private List<Button> buttons = new LinkedList<>();//1-3个,子菜单是有序的,因此使用LinkedList

然后最重要的就是和json格式互转,
public String toString() { return toJSON().toJSONString(); }
/** {"button":[]},创建菜单时提交的数据 */
public static Menu fromString(String button) { return fromJSON(JSON.parseObject(button)); }
/** {"menu":{"button": []}},自定义菜单接口返回的数据是这个 */
public static Menu fromMenu(String menu) { return fromJSON(JSON.parseObject(menu).getJSONObject("menu")); }
public JSONObject toJSON() {
JSONObject json = new JSONObject();
JSONArray array = new JSONArray();
json.put("button", array);
for(Button button : buttons) {
array.add(button.toJSON());//子菜单自己格式化菜单内容
}
return json;
}
public static Menu fromJSON(JSONObject json) {
JSONArray buttons = json.getJSONArray("button");
Menu menu = new Menu();
for(int i=0; i< buttons.size(); i++) {
Button button = Button.fromJSON(menu, buttons.getJSONObject(i));
if(button != null) menu.buttons.add(button);
}
return menu;
}

这样就可以将已有的自定义菜单解析为Menu对象,因此又可以提供接口直接修改此菜单
Menu menu = Menu.fromMenu(String menu);//menu为自定义菜单查询接口返回的内容
class Menu {
Button getButton(String name);
Button getButton(int index); //子菜单是有序的,得到Button后就可以调用setType等方法直接修改菜单
}
class Button {
SubButton getSubButton(int index);//二级子菜单修改
Button remove();//删除当前二级子菜单,回到上级子菜单,此时可以继续getSubButton(name)
}

参考:WeixinUtil ,后续还会用html和js实现一个demo,js控制菜单内容是非常方便而灵活的。