4、自定义菜单
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 工具类
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 类
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)来创建菜单