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":[{	"type":"view","name":"搜索","url":"http://www.soso.com/"},"
                +"{"type":"click","name":"赞一下我们","key":"V1001_GOOD"}]}]}";
        createMunu(url,params);
    }
}

运行main函数,再重新关注就可以看到菜单,如下图:

S71024-200958

这里的菜单配置params 可以通过后台管理页面设置,然后应用通过查询数据库来获取,进而createMunu(String url, String params)来创建菜单

原文地址:https://www.cnblogs.com/weiapro/p/7725502.html