java版微信公众号开发之自定义菜单的创建

废话(不过还是必须得看):
在微信公众号启动开发者模式之后,微信公众号后台的自定义菜单便无法再使用!需要自己在服务器上进行自定义菜单的开发。自定义菜单接口地址: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=accessToken"其中的accessToken的
获取在上面已经说过便不再多加赘述,自定义菜单创建的接口目前每日访问上限为1000次,菜单创建的时候最多只能有三个一级菜单,每个一级菜单最多有五个二级菜单。

注意:
值得注意的是呢,微信自定义菜单创建成功之后是有生效时间的,在官方的介绍上说的时间是24小时之内,一般会在5-6小时之内生效,但是我们平常肯定是不愿意去等待的,多无聊......有一个办法就是在项目启动并在微信后台启动开发者模式之后直接在浏览器路径中请求你自己写的创建菜单的路径,这样子的话你重新关注公众号之后你的自定义菜单就会生效,百试不爽......我曾经等的痛不欲生


逻辑:
在创建自定义菜单的时候必须将菜单数据整合成JSON类型的数据发送到微信服务器,拼接起来比较麻烦就没有使用这种方式,另外在网上又找的方式。另外就是自定义菜单有十种类型,我只用到过两种(CLICK和VIEW),其他的几种不做说明


1、首先创建几个Entity表示菜单
1)Button.java --表示菜单类的基类,一级菜单和二级菜单的Entity都继承此Entity
private String name;

2)ComplexButton.java --表示一级菜单
private String name; //菜单名称
private Button[] sub_button; //子级菜单,因为一个一级菜单可以有多个二级菜单,所以这儿使用二级 菜单类型的集合

3)CommonButton.java --表示二级菜单(CLICK类型)
private String type; //菜单类型
private String key; //key值

4)ViewButton.java --表示二级菜单(VIEW类型)
private String type; //菜单类型
private String url; //view路径值

4)Menu.java --表示要创建的菜单
private ComplexButton[] button;


至于上面的三个Entity为什么有这几个属性自己参考微信公众号的开发者文档,上面有具体说明

2、创建菜单的Util
public class MenuUtil {
/**
* 封装菜单数据
* */
public static Menu getMenu(){
//首先创建二级菜单
CommonButton cb_1 = new CommonButton();
cb_1.setKey("key1");
cb_1.setName("子菜单1");
cb_1.setType("click");


CommonButton cb_2 = new CommonButton();
cb_2.setKey("key2");
cb_2.setName("子菜单2");
cb_2.setType("click");

//创建第一个一级菜单
ComplexButton cx_1 = new ComplexButton();
cx_1.setName("一级菜单");
cx_1.setSub_button(new Button[]{cb_1,cb_2});


//继续创建二级菜单
CommonButton cb_3 = new CommonButton();
cb_3.setKey("key3");
cb_3.setName("子菜单3");
cb_3.setType("click");


ViewButton cb_4 = new ViewButton();
cb_4.setName("访问网页");
cb_4.setType("view");
//需要使用网页授权获取微信用户的信息
cb_4.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=要访问的网页                                         &response_type=code&scope=snsapi_base&state=xxx");

//创建第二个一级菜单
ComplexButton cx_2 = new ComplexButton();
cx_2.setName("一级菜单");
cx_2.setSub_button(new Button[]{cb_3,cb_4});

//封装菜单数据
Menu menu=new Menu();
menu.setButton(new ComplexButton[]{cx_1,cx_2});

return menu;
}


/**
* 创建自定义菜单(每天限制1000次)
* */
public static int createMenu(Menu menu){
String jsonMenu=JSONObject.fromObject(menu).toString();

int status=0;

System.out.println("菜单:"+jsonMenu);
String path="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+TokenThread.access_token.getAccess_token();
try {
URL url=new URL(path);
HttpURLConnection http = (HttpURLConnection)url.openConnection();
http.setDoOutput(true);
http.setDoInput(true);
http.setRequestMethod("POST");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.connect();
OutputStream os = http.getOutputStream();
os.write(jsonMenu.getBytes("UTF-8"));
os.close();

InputStream is = http.getInputStream();
int size = is.available();
byte[] bt = new byte[size];
is.read(bt);
String message=new String(bt,"UTF-8");
JSONObject jsonMsg = JSONObject.fromObject(message);
status = Integer.parseInt(jsonMsg.getString("errcode"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return status;
}
}


3、创建菜单的Controller
/**
* 创建菜单
* */
@RequestMapping("/createMenu")
public void createMenu(){
//调用UTI执行创建菜单的动作
int status = MenuUtil.createMenu(MenuUtil.getMenu());
if(status==0){
System.out.println("菜单创建成功!");
}else{
System.out.println("菜单创建失败!");
}
}




要想创建的菜单立即生效必须在项目启动之后手动请求一下创建的Controller再重新关注微信公众号方可生效,否则的话,你就慢慢等吧.......


源码下载地址:

http://download.csdn.net/detail/qq_16071145/9516014

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页