一般开发中,会开发一个菜单创建和删除的接口,方便修改菜单布局和菜单的内容
先看一下官方文档的介绍
不难看出,创建菜单的接口是post请求,参数是json格式,返回如下
可以通过调用返回结果验证是否创建成功。
/**
* 添加微信公众号菜单
* @return
*/
@RequestMapping(value="/menuAdd",method=RequestMethod.POST)
public String menuAdd(){
boolean b = weiXinService.menuAdd();
if (b) {
return "success";
}
return "unsuccess";
}
注意在访问这个接口的时候是post请求,还有不要用localhost了,因为已经解析过了,要使用解析后的
我们都知道浏览器一般发送get请求,所以可以使用postman请求工具,具体使用方法自行百度
service里面的menuAdd方法
/**
* 添加自定义菜单
*/
@Override
public boolean menuAdd() {
String url = WeiXinUtil.ADD_MENU_URL.replace("ACCESS_TOKEN", WeiXinUtil.getAccessToken());
String menu = JSONObject.fromObject(MsgUtil.initMenu()).toString();
JSONObject result = HttpUtil.doPoststr(url,menu);
if("ok".equals(result.getString("errmsg"))){
logger.info("添加菜单结果:{}", result);
return true;
}
logger.info("添加菜单结果:{}", result);
return false;
}
//添加菜单接口
public static final String ADD_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
这里面注意将对象转为字符串
请求的menu打印出来一定是跟上面一样的,然后初始化menu,上面的参数不难看出,这里面是一个button数组,然后里面有不同类型的button,我这里全部都封装成了对象
首先:button对象
public class Menu {
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.button = button;
}
}
然后button对象
public class Button {
private String type;
private String name;
private Button[] sub_button;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Button[] getSub_button() {
return sub_button;
}
public void setSub_button(Button[] sub_button) {
this.sub_button = sub_button;
}
}
这里的button是可能会有子菜单的,所以有个子菜单集合
还有多种按钮类型
我只写了四种菜单类型
//点击菜单
public class ClickButton extends Button{
private String key;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
//发送位置
public class SendLocalButton extends Button{
private String key;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
//相册选中图片或者拍照
public class SendPicButton extends Button{
private String key;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
//普通的视图
public class ViewButton extends Button{
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
最后一个基本都会用到,比如你要跳转一个项目,直接就把项目地址放到url里面即可
最后:菜单初始化方法
也就是往菜单赋值
/**
* 组装菜单
* @return
*/
public static Menu initMenu(){
Menu menu = new Menu();
ViewButton button11 = new ViewButton();
//注意按钮名字不要太长,不然会报40018错误
button11.setName("搜索");
button11.setType("view");
button11.setUrl("https://www.baidu.com");
//注意链接不要少了https:// 否则会报错40055
SendPicButton button21 = new SendPicButton();
button21.setName("发图");
button21.setType("pic_photo_or_album");
button21.setKey("pic");
SendLocalButton button32 = new SendLocalButton();
button32.setName("发位置");
button32.setType("location_select");
button32.setKey("local");
ClickButton button31 = new ClickButton();
button31.setName("点赞");
button31.setType("click");
button31.setKey("strtest");//事件key
Button button = new Button();
button.setName("click2");
button.setSub_button(new Button[]{button31,button32});
button.setSub_button(new Button[]{button31,button32});
menu.setButton(new Button[]{button11,button21,button});
return menu;
}
使用postman发送请求,请求成功,关注微信公众号,即可发现公众号的菜单改变
注意:如果你之前关注过你的公众号,需要取消然后再关注才能显示
然后是菜单删除接口
/**
* 删除菜单
*/
@Override
public boolean deleteMenu() {
String url = WeiXinUtil.DELETE_MENU_URL.replace("ACCESS_TOKEN", WeiXinUtil.getAccessToken());
JSONObject result = HttpUtil.doGetstr(url);
if("ok".equals(result.getString("errmsg"))){
logger.info("删除菜单结果:{}", result);
return true;
}
logger.info("删除菜单结果:{}", result);
return false;
}
//删除菜单接口
public static final String DELETE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN";
这个相对比较简单,是get请求
当然也有查询接口等,这个我没有过多研究,有兴趣的可以自行研究