微信测试账号 (4)-菜单管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangb_java/article/details/78454226

进入公众号后,最下面一排的位置可以设置菜单按钮。

菜单结构

这是微信官网给的一个菜单结构示例,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方法,代码就不写了。注意:每次创建菜单的时候,会自动覆盖之前已有的菜单,所以除非你想置空菜单,才会调用删除接口。

猜你喜欢

转载自blog.csdn.net/wangb_java/article/details/78454226