1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
1、获取access_token 详情参看: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。
2、创建菜单 详情参看: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
HttpUtil 工具类
java">package com.wenxi.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
/**
* Http工具类
*
*/
public class HttpUtil {
/**
* 发送get请求
*
* @throws Exception
*/
public static String get(String url) {
String result = "";
InputStream in = null;
try {
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection) new URL(url)
.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("GET");
// 建立实际的连接
conn.connect();
// 定义输入流来读取URL的响应
in = conn.getInputStream();
result = StreamUtils.copyToString(in, Charset.forName("utf-8"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 发送post请求
*
* @throws Exception
*/
public static String post(String url, String paramStr) {
InputStream in = null;
OutputStream os = null;
String result = "";
try {
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection) new URL(url)
.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
// 发送POST请求须设置
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
os = conn.getOutputStream();
// 注意编码格式,防止中文乱码
if (StringUtils.hasText(paramStr)) {
os.write(paramStr.getBytes("utf-8"));
os.close();
}
in = conn.getInputStream();
result = StreamUtils.copyToString(in, Charset.forName("utf-8"));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
WeixinUtil 类
java">package com.wenxi.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
public class WeixinUtil {
public static final String TOKEN = "****"; //改为自己的
public static final String APPID = "****";//改为自己的
public static final String APPSECRET = "****";//改为自己的
public static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public static String ACCESSTOKEN = null;
//ACCESSTOKEN 的失效时间
public static long EXPIRESTIME;
/**
* 获取accessToken
*/
public static final String getAccessToken(){
if (ACCESSTOKEN == null || EXPIRESTIME < new Date().getTime()) {
String result = HttpUtil.get(GET_ACCESS_TOKEN_URL.replace("APPID",APPID).replace("APPSECRET",APPSECRET));
System.out.println(result);
JSONObject json = JSON.parseObject(result);
//设置ACCESSTOKEN
ACCESSTOKEN = json.getString("access_token");
//设置ACCESSTOKEN的失效时间
Long expires_in = json.getLong("expires_in");
EXPIRESTIME = new Date().getTime() + (expires_in-60) * 1000; //提前一分钟刷新
}
return ACCESSTOKEN;
}
/**
* 创建菜单
* @param url
* @param params
*/
public static final void createMunu(String url, String params){
String result = HttpUtil.post(url,params);
System.out.println(result);
}
public static void main(String[] args){
getAccessToken();
String url = CREATE_MENU_URL.replace("ACCESS_TOKEN",getAccessToken());
String params = "{\"button\":[{\"type\":\"click\",\"name\":\"今日歌曲\",\"key\":\"V1001_TODAY_MUSIC\"},{\"name\":\"菜单\",\"sub_button\":[{\t\"type\":\"view\",\"name\":\"搜索\",\"url\":\"http://www.soso.com/\"},"
+"{\"type\":\"click\",\"name\":\"赞一下我们\",\"key\":\"V1001_GOOD\"}]}]}";
createMunu(url,params);
}
}
运行main函数,再重新关注就可以看到菜单,如下图:
这里的菜单配置params 可以通过后台管理页面设置,然后应用通过查询数据库来获取,进而createMunu(String url, String params)来创建菜单