一、自定义菜单接口:
其中3-8是click类型的其他方面应用.
二、需要的参数
参数 | 是否必须 | 说明 |
---|---|---|
button | 是 | 一级菜单数组,个数应为1~3个 |
sub_button | 否 | 二级菜单数组,个数应为1~5个 |
type | 是 | 菜单的响应动作类型 |
name | 是 | 菜单标题,不超过16个字节,子菜单不超过60个字节 |
key | click等点击类型必须 | 菜单KEY值,用于消息接口推送,不超过128字节 |
url | view类型必须 | 网页链接,用户点击菜单可打开链接,不超过1024字节 |
media_id | media_id类型和view_limited类型必须 | 调用新增永久素材接口返回的合法media_id |
三、实战自定义菜单操作
1、建立实体类Button
1 package com.my.pojo.button; 2 3 import java.util.Arrays; 4 5 /** 6 * ///菜单按钮实体类 7 * 8 * @author liuya 9 * 10 */ 11 12 public class Button { 13 14 // 菜单标题 15 private String name; 16 // 菜单类型 17 private String type; 18 // 菜单数组(微信界面最下边的菜单组件个数) 19 private Button[] sub_button; 20 21 public Button() { 22 super(); 23 } 24 25 public Button(String name, String type, Button[] sub_button) { 26 this.name = name; 27 this.type = type; 28 this.sub_button = sub_button; 29 } 30 31 public String getName() { 32 return name; 33 } 34 35 public void setName(String name) { 36 this.name = name; 37 } 38 39 public String getType() { 40 return type; 41 } 42 43 public void setType(String type) { 44 this.type = type; 45 } 46 47 public Button[] getSub_button() { 48 return sub_button; 49 } 50 51 public void setSub_button(Button[] sub_button) { 52 this.sub_button = sub_button; 53 } 54 55 @Override 56 public String toString() { 57 return "Button [name=" + name + ", type=" + type + ", sub_button=" 58 + Arrays.toString(sub_button) + "]"; 59 } 60 61 }
2、建立一个view类型的button
1 package com.my.pojo.button; 2 3 /** 4 * //跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。 5 * 6 * @author liuya 7 * 8 * 9 * 10 * //跳转到网页的button 11 */ 12 13 public class ViewButton extends Button { 14 15 // 跳转的链接 16 private String url; 17 18 public ViewButton() { 19 } 20 21 public ViewButton(String url) { 22 this.url = url; 23 } 24 25 public String getUrl() { 26 return this.url; 27 } 28 29 public void setUrl(String url) { 30 this.url = url; 31 } 32 33 @Override 34 public String toString() { 35 return "ViewButton [url=" + url + "]"; 36 } 37 38 }
3、建立一个clickButton类型的button
1 package com.my.pojo.button; 2 3 /** 4 * 消息接口推送 5 * 6 * @author liuya // 7 * 8 * //当点击button的时候触发事件 9 */ 10 11 public class ClickButton extends Button { 12 13 // 菜单KEY 14 private String key; 15 16 public ClickButton() { 17 } 18 19 public ClickButton(String key) { 20 this.key = key; 21 } 22 23 public String getKey() { 24 return this.key; 25 } 26 27 public void setKey(String key) { 28 this.key = key; 29 } 30 31 @Override 32 public String toString() { 33 return "ClickButton [key=" + key + "]"; 34 } 35 36 }
4、建立一个承载button的menu
package com.my.pojo.button; import java.util.Arrays; /** * * // 承载微信界面下边的多个菜单的框 * * @author liuya * */ public class Menu { // button数组 private Button[] button; public Menu() { } public Menu(Button[] button) { this.button = button; } public Button[] getButton() { return this.button; } public void setButton(Button[] button) { this.button = button; } @Override public String toString() { return "Menu [button=" + Arrays.toString(button) + "]"; } }
5、在util里建立一个可以操作菜单的方法
1 // 建立一个菜单响应的方法(组装界面的菜单样式) 2 public static Menu initMenu() { 3 4 // 创建一个menu对象 5 Menu menu = new Menu(); 6 7 // 一个展示的菜单(主菜单,就是菜单下没有菜单了) 8 ViewButton button11 = new ViewButton(); 9 10 // 设置菜单的名称(就是菜单上显示的字) 11 button11.setName("我的主页"); 12 // 设置菜单的类型(展示类型的) 13 button11.setType("view"); 14 // 网址需要是一个完整的路径,包括协议和后边的路径 15 button11.setUrl("http://www.cnblogs.com/liuyangfirst/"); 16 17 // 第二个主菜单 18 ViewButton button22 = new ViewButton(); 19 // 设置菜单的名称(就是菜单上显示的字) 20 button22.setName("个人简介"); 21 // 设置菜单的类型(展示类型的) 22 button22.setType("view"); 23 // 网址需要是一个完整的路径,包括协议和后边的路径 24 button22.setUrl("https://home.cnblogs.com/u/liuyangfirst/"); 25 26 // 第三个主菜单有子菜单 27 Button button33 = new Button(); 28 // 设置菜单的名称(就是菜单上显示的字) 29 button33.setName("菜单"); 30 31 // 第三个菜单的子菜单 32 ClickButton button331 = new ClickButton(); 33 // 设置菜单的名称(就是菜单上显示的字) 34 button331.setName("扫码事件"); 35 // 设置菜单的类型(扫码类型的) 36 button331.setType("scancode_push"); 37 // 关键字 38 button331.setKey("331"); 39 40 // 第三个菜单的子菜单 41 ClickButton button332 = new ClickButton(); 42 // 设置菜单的名称(就是菜单上显示的字) 43 button332.setName("地理位置"); 44 // 设置菜单的类型(地理位置类型的) 45 button332.setType("location_select"); 46 // 关键字 47 button332.setKey("332"); 48 49 // 把两个二级菜单通过数组的方式放入到主菜单中 50 button331.setSub_button(new Button[] { button331, button332 }); 51 52 // 把三个主菜单,放入到menu中 53 menu.setButton(new Button[] { button11, button22, button33 }); 54 return menu; 55 56 } 57 58 /** 59 * 60 * @param token 61 * @param menu 62 * @return 63 * @throws ParseException 64 * @throws IOException 65 * 66 * 67 * 68 * //封装一个方法,请求微信服务平台,在公众号上建立一个菜单 69 * 70 * 71 * 72 * 73 */ 74 75 public static int createMenu(String token, String menu) 76 throws ParseException, IOException { 77 Integer result = null; 78 79 // 把接口传进来 80 String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token); 81 82 // 封装好的doPost方法调用这个接口地址 83 JSONObject jsonObject = doPostStr(url, menu); 84 85 // 获取的结果进行判断,不为空就进行操作 86 if (jsonObject != null) { 87 88 // 获取结果进行判断,如果是0的话就判断,如果不是0的话,根据文档的错误代码进行判断 89 result = Integer.valueOf(jsonObject.getInt("errcode")); 90 } 91 92 return result; 93 }
同时要建立常量的menu接口
1 // 菜单接口(使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构) 2 private static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
6、调用建立的接口,进行测试和实际建立菜单(注意:公众号上的界面菜单,是通过这里调用测试建立的)
1 package com.my.test; 2 3 import net.sf.json.JSONObject; 4 5 import org.junit.Test; 6 7 import com.my.pojo.AccessToken; 8 import com.my.utils.WeixinUtil; 9 10 /** 11 * 测试类 12 * 13 * @author liuya 14 * 15 */ 16 17 public class TestDemo { 18 19 @Test 20 public void test() throws Exception { 21 AccessToken accessToken = WeixinUtil.getAccessToken(); 22 System.out.println("票据信息 : " + accessToken.getToken()); 23 System.out.println("有效时间 : " + accessToken.getExpiresIn()); 24 } 25 26 // 对菜单建立是否成功测试,同时是界面菜单建立的类 27 @Test 28 public void test3() throws Exception { 29 AccessToken token = WeixinUtil.getAccessToken(); 30 String menuString = JSONObject.fromObject(WeixinUtil.initMenu()) 31 .toString(); 32 int result = WeixinUtil.createMenu(token.getToken(), menuString); 33 if (result == 0) 34 System.out.println("创建菜单成功"); 35 else 36 System.out.println("错误码" + result); 37 } 38 39 }