一.自定义菜单腾讯官方说明 https://mp.weixin.qq.com/wiki
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
二.JAVA定义Model(没有直接从数据库获取,而是采用自定义数据)
// 省去setter/getter方法
public class WeixinMenu {
private int id; // 主键
private String name; // 菜单名字
private String type; // 消息类型
private String url; // 链接
private String key; // key
private int pid; // 父类ID
private List<WeixinMenu> sub_button; // 列表
}
@Test
public void testMenu(){
try {
List<WeixinMenu> wml = new ArrayList<WeixinMenu>();
WeixinMenu wm1 = new WeixinMenu();
wm1.setId(1);
wm1.setName("学习网站");
wm1.setType("view");
wm1.setUrl("http://www.konghao.org/index");
wml.add(wm1); // 添加第一个 一级菜单
WeixinMenu wm2 = new WeixinMenu();
wm2.setName("测试资源");
List<WeixinMenu> wm2Sub = new ArrayList<WeixinMenu>();
wm1 = new WeixinMenu();
wm1.setId(2);
wm1.setName("事件测试");
wm1.setType("click");
wm1.setKey("A0001");
wm2Sub.add(wm1);
wm1 = new WeixinMenu();
wm1.setId(2);
wm1.setName("扫描测试");
wm1.setType("pic_sysphoto");
wm1.setKey("rselfmenu_1_0");
wm2Sub.add(wm1);
wm2.setSub_button(wm2Sub);
wml.add(wm2); // 添加第二个子菜单
Map<String, List<WeixinMenu>> maps = new HashMap<String, List<WeixinMenu>>();
maps.put("button",wml);
System.out.println(maps);
System.out.println("=========================================");
// 对象转JSON字符串
String json = JsonUtil.getInstance().obj2json(maps);
System.out.println(JsonUtil.getInstance().obj2json(maps));
CloseableHttpClient client = HttpClients.createDefault();
String url = WeixinFinalValue.MENU_ADD;
// System.out.println(RefreshAccessTokenTask.at);
url = url.replace("ACCESS_TOKEN",RefreshAccessTokenTask.at);
HttpPost post = new HttpPost(url);
post.addHeader("Content-Type","application/json");
StringEntity entity = new StringEntity(json, ContentType.create("application/json", "utf-8"));
post.setEntity(entity);
CloseableHttpResponse resp = client.execute(post); // 执行提交POST
int sc = resp.getStatusLine().getStatusCode();
if(sc>=200&&sc<300) {
System.out.println(EntityUtils.toString(resp.getEntity()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
三.测试验证
控制台打印结果:
{button=[com.hd.weixin.model.WeixinMenu@68a06c63, com.hd.weixin.model.WeixinMenu@7c2c0d3e]}
=========================================
{"button":[{"id":1,"name":"学习网站","type":"view","url":"http://www.konghao.org/index","key":null,"pid":0,"sub_button":null},{"id":0,"name":"测试资源","type":null,"url":null,"key":null,"pid":0,"sub_button":[{"id":2,"name":"事件测试","type":"click","url":null,"key":"A0001","pid":0,"sub_button":null},{"id":2,"name":"扫描测试","type":"pic_sysphoto","url":null,"key":"rselfmenu_1_0","pid":0,"sub_button":null}]}]}
{"errcode":0,"errmsg":"ok"} // 微信返回的结果为正确,则自定义菜单成功