微信公众号开发(四)—— 自定义菜单的创建

自定义菜单创建接口

1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

1. 根据 XML 消息,创建按钮和菜单的 Po 类

这里写图片描述

根据微信文档,XML 的正确的格式需要包含:最外层是一个菜单类,中间包括着 click 和 view 的按钮类,其他类型做法类似。

创建按钮 Po 类 button

public class Button {
    //菜单类型
    private String type;
    //菜单名称
    private String name;
    //可以包含多个菜单项(二级菜单数组,个数应为1~5个)

创建 click 和 view 类型的 button

public class ClickButton extends Button{
    //click等点击类型必须
    private String key;

public class ViewButton extends Button{
    //view类型的路径
    private String url;

以及最外层的 menu

public class Menu {
    //菜单中包含的button
    private Button[] button;

2. 组装一个 menu

1、click:点击推事件
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

按照按钮类型创建相应的菜单,如下:

点击按钮

ClickButton button11 = new ClickButton();
        button11.setName("click菜单");
        button11.setType("click");
        button11.setKey("11");

跳转按钮

ViewButton button21 = new ViewButton();
        button21.setName("view菜单");
        button21.setType("view");
        button21.setUrl("http://www.baidu.com");

菜单包含多层可以嵌套

Button button = new Button();
        button.setName("菜单组");
        button.setSub_button(new Button[]{button31,button32});  

最后将按钮组装到菜单中

public static Menu initMenu(){
        Menu menu = new Menu();
        /**
        创建需要的按钮
        **/
        menu.setButton(new Button[]{...添加按钮});
        return menu;

3. 创建菜单

public static int createMenu(String token,String menu) throws ParseException, IOException{
        int result = 0;
        String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);
        JSONObject jsonObject = doPostStr(url, menu);
        if(jsonObject != null){
            result = jsonObject.getInt("errcode");
        }
        return result;
    }
public class WeixinTest {
    public static void main(String[] args) {

        String menu = JSONObject.fromObject(WeiXinUtil.initMenu()).toString();
        try {
            AccessToken token = WeiXinUtil.getAccessToken();
            System.out.println("票据"+token.getToken());
            System.out.println("有效时间"+token.getExpiresIn());

            int result = WeiXinUtil.createMenu(token.getToken(), menu);
            if(result == 0){
                System.out.println("创建菜单成功");
            }else{
                System.out.println("错误码:" + result);
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

票据
MS_vadelbHZaduVfhzaOIW0rqWB2mbU8tN4vJhUwh6DYmtwsF3VYdRsyNU52CgqyROSI22WHwMmeYe3nW9kausVqCoDs9x1LDKbKYXttXEIN9eeXCP0TBNKegZsygLlATUJgAJAHIX
有效时间7200
创建菜单成功

原文地址:https://www.cnblogs.com/shuiyj/p/13185241.html