SpringBoot开发微信公众号(五)

自定义菜单的创建

一、自定义菜单

自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。自定义菜单最多有三个一级菜单,名字最多4个汉字,课可参考开发
wendanhttps://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013

1.1 数据结构分析

{
     "button":[
     {	
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {	
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }
{
    "button": [
        {
            "name": "扫码", 
            "sub_button": [
                {
                    "type": "scancode_waitmsg", 
                    "name": "扫码带提示", 
                    "key": "rselfmenu_0_0", 
                    "sub_button": [ ]
                }, 
                {
                    "type": "scancode_push", 
                    "name": "扫码推事件", 
                    "key": "rselfmenu_0_1", 
                    "sub_button": [ ]
                }
            ]
        }, 
        {
            "name": "发图", 
            "sub_button": [
                {
                    "type": "pic_sysphoto", 
                    "name": "系统拍照发图", 
                    "key": "rselfmenu_1_0", 
                   "sub_button": [ ]
                 }, 
                {
                    "type": "pic_photo_or_album", 
                    "name": "拍照或者相册发图", 
                    "key": "rselfmenu_1_1", 
                    "sub_button": [ ]
                }, 
                {
                    "type": "pic_weixin", 
                    "name": "微信相册发图", 
                    "key": "rselfmenu_1_2", 
                    "sub_button": [ ]
                }
            ]
        }, 
        {
            "name": "发送位置", 
            "type": "location_select", 
            "key": "rselfmenu_2_0"
        },
        {
           "type": "media_id", 
           "name": "图片", 
           "media_id": "MEDIA_ID1"
        }, 
        {
           "type": "view_limited", 
           "name": "图文消息", 
           "media_id": "MEDIA_ID2"
        }
    ]
}

1,2 根据json格式的结构,写对应的bean

/**
 * 
 * 类名称: Button
 * 类描述: 按钮
 * @author yuanjun
 * 创建时间:2017年12月8日下午8:35:38
 */
public class Button {
	
	private String name;//菜单标题
	
	private String type;//菜单的响应动作类型
	
	private Button[] sub_button;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Button[] getSub_button() {
		return sub_button;
	}

	public void setSub_button(Button[] sub_button) {
		this.sub_button = sub_button;
	}
	
	
}
/**
 * 
 * 类名称: ClickButton
 * 类描述: 点击类型
 * @author yuanjun
 * 创建时间:2017年12月8日下午8:38:06
 */
public class ClickButton extends Button{
	
	private String key;//菜单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;
	}
	
	
	
	
}
/**
 * 
 * 类名称: Menu
 * 类描述: 菜单
 * @author yuanjun
 * 创建时间:2017年12月8日下午8:40:18
 */
public class Menu {
	
	private Button[] button;

	public Button[] getButton() {
		return button;
	}

	public void setButton(Button[] button) {
		this.button = button;
	}
	
	
}

二、调用接口创建自定义菜单(通过测试开发账号)

import net.sf.json.JSONObject;

import com.yuanjun.weixindemo.bean.Button;
import com.yuanjun.weixindemo.bean.ClickButton;
import com.yuanjun.weixindemo.bean.Menu;
import com.yuanjun.weixindemo.bean.ViewButton;

/**
 * 
 * 类名称: MemuUtil
 * 类描述: 菜单工具
 * @author yuanjun
 * 创建时间:2017年12月8日下午8:42:15
 */
public class MenuUtil {
	
	private static final String CTRATE_MENU_URL  = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
	/**
	 * 创建菜单
	 * @param accessToken 
	 * @param Menu 菜单json格式字符串
	 * @return
	 */
	public static int createMenu(String accessToken,String Menu){
		int result = Integer.MIN_VALUE;
		String url = CTRATE_MENU_URL.replaceAll("ACCESS_TOKEN", accessToken);
		JSONObject json = WeiXinUtil.doPoststr(url, Menu);
		if(json!=null){
			//从返回的数据包中取数据{"errcode":0,"errmsg":"ok"}
			result = json.getInt("errcode");
		}
		return result;
	}
	
	public static String initMenu(){
		String result = "";
		//创建点击一级菜单
		ClickButton button11 = new ClickButton();
		button11.setName("往期活动");
		button11.setKey("11");
		button11.setType("click");
		
		//创建跳转型一级菜单
		ViewButton button21 = new ViewButton();
		button21.setName("百度一下");
		button21.setType("view");
		button21.setUrl("https://www.baidu.com");
		
		//创建其他类型的菜单与click型用法一致
		ClickButton button31 = new ClickButton();
		button31.setName("拍照发图");
		button31.setType("pic_photo_or_album");
		button31.setKey("31");
		
		ClickButton button32 = new ClickButton();
		button32.setName("发送位置");
		button32.setKey("32");
		button32.setType("location_select");
		
		//封装到一级菜单
		Button button = new Button();
		button.setName("菜单");
		button.setType("click");
		button.setSub_button(new Button[]{button31,button32});
		
		//封装菜单
		Menu menu = new Menu();
		menu.setButton(new Button[]{button11,button21,button});
		return JSONObject.fromObject(menu).toString();
	}
}

2.1 后台测试

import com.yuanjun.weixindemo.util.MenuUtil;
import com.yuanjun.weixindemo.util.WeiXinUtil;

public class TestMenu {
	public static void main(String[] args) {
		String accessToken  = WeiXinUtil.getAccess_Token();
		String menu = MenuUtil.initMenu();
		System.out.println(menu);
		int result = MenuUtil.createMenu(accessToken,menu);
		if(result==0){
			System.out.println("菜单创建成功");
		}else{
			System.out.println("错误码"+result);
		}
	}
}



三、效果展示


四、出现的问题说明:

Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in scheme name at index 0:  https://api.weixin.qq.com/cgi-bin/menu/create?access_token=fiE7pddrUUtuJbTMjXTUlS8HurXaougM8G1yQK9RkK3T3YrMkKRgegPxBxfNKkdwcat6KsWQVzV--_1V2YuYdyszJXb3B7BJO1fdec-JSZ8ZUBcAHARMT
	at java.net.URI.create(URI.java:859)
	at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:73)
	at com.yuanjun.weixindemo.util.WeiXinUtil.doPoststr(WeiXinUtil.java:68)
	at com.yuanjun.weixindemo.util.MenuUtil.createMenu(MenuUtil.java:29)
	at com.yuanjun.weixindemo.TestMenu.main(TestMenu.java:10)
Caused by: java.net.URISyntaxException: Illegal character in scheme name at index 0:  https://api.weixin.qq.com/cgi-bin/menu/create?access_token=fiE7pddrUUtuJbTMjXTUlS8HurXaougM8G1yQK9RkK3T3YrMkKRgegPxBxfNKkdwcat6KsWQVzV--_1V2YuYdyszJXb3B7BJO1fdec-JSZ8ZUBcAHARMT
	at java.net.URI$Parser.fail(URI.java:2829)
	at java.net.URI$Parser.checkChars(URI.java:3002)
	at java.net.URI$Parser.checkChar(URI.java:3012)
	at java.net.URI$Parser.parse(URI.java:3028)
	at java.net.URI.<init>(URI.java:595)
	at java.net.URI.create(URI.java:857)
	... 4 more
解决办法:在复制微信的接口URL注意去除空格
错误代码:40055
设置VIew的菜单的跳转路径,需要加上http://

五 源码下载,包含消息,图片回复,创建菜单,智能翻译等

http://download.csdn.net/download/shenbug/10152017



猜你喜欢

转载自blog.csdn.net/shenbug/article/details/78755297
今日推荐