进入公众号后,最下面一排的位置可以设置菜单按钮。
菜单结构
这是微信官网给的一个菜单结构示例,json格式。
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
显示效果
代码实现
在spring boot中,可使用List和Map结构分别代表json中的[]和{},然后使用restTemplate请求接口时会自动进行格式转换。
//菜单1
Map button1 = new HashMap();
button1.put("name", "今日歌曲");
button1.put("type", "click");
button1.put("key", "V1001_TODAY_MUSIC");
//菜单2的子菜单
Map subButton1 = new HashMap();
subButton1.put("type", "view");
subButton1.put("name", "搜索");
subButton1.put("url", "http://www.soso.com/");
Map subButton3 = new HashMap();
subButton3.put("type", "click");
subButton3.put("name", "赞一下我们");
subButton3.put("key", "V1001_GOOD");
//菜单2数组
List subList = new ArrayList();
subList.add(subButton1);
subList.add(subButton3);
//菜单2
Map button2 = new HashMap();
button2.put("name", "菜单");
button2.put("sub_button", subList);
//一级菜单
List buttonList = new ArrayList();
buttonList.add(button1);
buttonList.add(button2);
//button参数命名
Map button = new HashMap();
button.put("button", buttonList);
//调用微信创建菜单接口
String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={1}";
String accessToken = "你的access_token";
Map map = restTemplate.postForObject(url, button, Map.class,accessToken);
注意:据微信官网解释,菜单五分钟刷新一次,执行以上代码后,可以取消关注再重新关注才能看到效果。
基本参数说明
button:一级菜单。
sub_button:二级菜单。
name:菜单显示名。
type:菜单类型,view指跳转网页,click指点击事件。
url:view类型菜单跳转的网址。
key:点击菜单时,会触发事件,调用后台被动接口,这个key就是请求参数。
后台响应事件
在第1篇中,我们成功响应了hello world消息,而响应菜单点击事件和响应消息是一回事,只是参数不同而已。以下是接收微信消息的响应接口,getMap用来接收url验证参数,postMap用来接收body业务参数。
@PostMapping(value="/handler")
public Object handler(@RequestParam Map<String,String> getMap,@RequestBody Map<String,String> postMap)
当点击菜单“今日歌曲”时,postMap会收到以下参数:
ToUserName:接收人,即我们公众号的唯一id。
FromUserName:发信人,即用户在公众号中的唯一id。
CreateTime:时间戳。
MsgType:消息类型,此时MsgType=event,说明这是一个事件。
Event:事件类型,此时Event=CLICK,说明是点击事件。
EventKey:这就是菜单中设置的key,此时EventKey=V1001_TODAY_MUSIC。
假如用户再点击菜单“赞我们一下”时,参数和上面一样,只是EventKey=V1001_GOOD。
MsgType和Event和EventKey:所有的消息和事件,正是通过这三个参数以进行不同的响应,比如关注的Event=subscribe,取消关注的Event=unsubscribe。
删除菜单
请求接口url:https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={1} 最后的{1}就是access_token
和创建一样,使用restTemplate的post方法,代码就不写了。注意:每次创建菜单的时候,会自动覆盖之前已有的菜单,所以除非你想置空菜单,才会调用删除接口。