4、自定义菜单

news/2024/7/24 2:22:19 标签: json, java, 数据库

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函数,再重新关注就可以看到菜单,如下图:

S71024-200958

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

转载于:https://www.cnblogs.com/weiapro/p/7725502.html


http://www.niftyadmin.cn/n/1699129.html

相关文章

mysql数据库 zip压缩效率_MySQL数据库中压缩表性能监测-爱可生

由于压缩表一般都是对字符串类的数据&#xff0c;比如 TEXT,VARCHAR 等压缩&#xff0c;所以针对这块的数据做更新&#xff0c;很容易就把更改日志(上篇介绍过)打满&#xff0c;继而造成频繁的解压和压缩操作。总的来说压缩表适合于读密集、只读、或者极少量更新的业务场景。二…

狂神 SpringBoot 自动装配原理初探

原理初探 自动配置 pom.xml spring pom.xml下有parent spring-boot-starter-parent下还有parent spring-boot-dependencies没有parent了&#xff0c;里面存放着各种东西的jar包 所以pom.xml中 spring-boot-dependencies &#xff1a;存放着核心依赖我们在写或者引入一些sp…

jquery在线引用

转载&#xff1a;http://www.cnblogs.com/lzx-1024/p/7716615.html jquery-3.1.1&#xff08;最新&#xff09;官网jquery压缩版引用地址:<script src"https://code.jquery.com/jquery-3.1.1.min.js"></script> jquery-3.0.0官网jquery压缩版引用地址:&l…

IBatis的分页研究

IBatis的分页研究 博客分类&#xff1a; Ibatis学习摘自&#xff1a; http://cpu.iteye.com/blog/311395 yangtingkun Oracle分页查询语句 ibaits.jar OracleDialect.java 在看JPetStore的代码时&#xff0c;发现它的分页处理主要是通过返回PaginatedList对象来完成的。如&am…

第一个SpringBoot程序 修改banner

第一个SpringBoot程序 两种创建方法 使用网站生成项目 https://start.spring.io/ maven、java版本、项目名称、导出jar、添加springWeb 这种方式一般不用&#xff0c;一般直接idea生成 IDEA创建 可能会遇到的问题 无效发行版本 项目结构设置 项目打开&#xff0c…

joomla+连接不上mysql_如何修复Joomla中的数据库连接错误

您的Joomla网站上有空白页面显示此消息吗&#xff1f;Error displaying the error page: Application Instantiation Error: Could not connect to MySQL.这意味着您的Joomla系统无法连接到您的数据库。由于您的网站数据存储在那里&#xff0c;因此修复连接以恢复网站非常重要。…

mysql revoke select from_Mysql grant to (revoke from)

本文实例&#xff0c;运行于 MySQL 5.0 及以上版本。MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant权限on数据库对象to用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。grantselectontestdb.*tocommon_user%grantinser…

在IIS建立的ftp,可以成功连接登录,但是不显示目录

IIS建立FTP站点很简单&#xff0c;不作说明 Windows的防火墙也开通了FTP端口&#xff08;默认21&#xff09;&#xff0c;Telnet也是通的&#xff0c;在本机可以打开&#xff0c;在局域网其它电脑或外网也可以连接&#xff0c;但就是不显示目录&#xff0c;如果用浏览器打开提示…