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
创建菜单成功