微信公众号开发之设置自定义菜单实例代码【java版】

下面是针对“微信公众号开发之设置自定义菜单实例代码【java版】”的完整攻略:

概述

本文主要介绍使用 Java 编写微信公众号自定义菜单的示例代码。自定义菜单包括一级菜单和二级菜单,每个一级菜单下可以有多个二级菜单,一级菜单最多包含3个二级菜单。

步骤

步骤一:获取授权

首先,您需要前往微信公众平台申请账号并通过审核。审核通过后,就可以在管理后台获取到 AppIDAppSecret

步骤二:导入相关包

在 Java 环境下开发微信公众号需要进行接口签名、HTTP请求的调用和 JSON数据解析等操作,我们需要导入相关的包。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

步骤三:生成Signature

在此处,我们需要在 Java 环境中使用 SHA1 算法对字符串进行加密,并获取签名。示例代码如下:

private static String SHA1(String decript) throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA-1");
    digest.update(decript.getBytes());
    byte[] messageDigest = digest.digest();
    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < messageDigest.length; i++) {
        String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
        if (shaHex.length() < 2) {
            hexString.append(0);
        }
        hexString.append(shaHex);
    }
    return hexString.toString();
}

private static String getSignature(String token, String timestamp, String nonce) throws NoSuchAlgorithmException {
    List<String> list = new ArrayList<String>();
    list.add(token);
    list.add(timestamp);
    list.add(nonce);
    Collections.sort(list, new Comparator<String>() {
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });
    StringBuilder sb = new StringBuilder();
    for (String s : list) {
        sb.append(s);
    }
    return SHA1(sb.toString());
}

步骤四:获取 Access_Token

使用微信 API 需要频繁地获取 access_token,而其又对每天的获取次数有限制。我们在获取 access_token 时应该使用缓存机制。

private static String getAccessToken(String appId, String appSecret) throws JSONException, Exception {
    String accessTokenCache = getCache("access_token");
    if (accessTokenCache != null && !"".equals(accessTokenCache)) {
        JSONObject jsonCache = new JSONObject(accessTokenCache);
        long cacheTime = jsonCache.getLong("time");
        if (System.currentTimeMillis() / 1000L - cacheTime < jsonCache.getLong("expires_in")) {
            return jsonCache.getString("access_token");
        }
    }
    String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
    HttpGet httpGet = new HttpGet(url);
    JSONObject result = new JSONObject(EntityUtils.toString(httpClient.execute(httpGet).getEntity()));
    putCache("access_token", result.toString());
    return result.getString("access_token");
}

步骤五:创建自定义菜单

有了 access_token,我们可以通过调用微信 API 创建自定义菜单了。一级菜单最多为3个,每个菜单最多包含5个二级菜单。

private static void createMenu(String token) throws JSONException, Exception {
    String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + token;
    HttpPost httpPost = new HttpPost(url);
    JSONArray buttonArray = new JSONArray();
    JSONObject mainButton1 = new JSONObject();
    mainButton1.put("name", "菜单按钮1");
    mainButton1.put("type", "click");
    mainButton1.put("key", "menu1-key1");
    buttonArray.put(mainButton1);
    JSONObject mainButton2 = new JSONObject();
    mainButton2.put("name", "菜单按钮2");
    mainButton2.put("sub_button", new JSONArray()
            .put(new JSONObject().put("name", "按钮2-1").put("type", "click").put("key", "menu2-1-key1"))
            .put(new JSONObject().put("name", "按钮2-2").put("type", "click").put("key", "menu2-2-key1"))
    );
    buttonArray.put(mainButton2);
    JSONObject mainButton3 = new JSONObject();
    mainButton3.put("name", "菜单按钮3");
    mainButton3.put("type", "view");
    mainButton3.put("url", "https://www.baidu.com/");
    buttonArray.put(mainButton3);
    JSONObject menu = new JSONObject();
    menu.put("button", buttonArray);
    httpPost.setEntity(new UrlEncodedFormEntity(Collections.singletonList(new BasicNameValuePair("data", menu.toString())), HTTP.UTF_8));
    httpClient.execute(httpPost);
}

步骤六:运行代码

有了以上代码,我们可以直接运行程序来创建微信自定义菜单了。

public static void main(String[] args) throws Exception {
    String token = getAccessToken("[your_appid]", "[your_appsecret]");
    createMenu(token);
}

示例

以上就是本文的完整攻略。下面我将给出两个关于微信公众号菜单的示例。

示例一:单击菜单

JSONObject mainButton1 = new JSONObject();
mainButton1.put("name", "设备绑定");
mainButton1.put("type", "click");
mainButton1.put("key", "bind_device");

上述代码演示的是菜单类型为“click”的一级菜单。当用户点击此菜单时,微信服务器将会以 POST 消息的方式推送一个事件给公众号,公众号可以用普通消息回复此消息。

示例二:查看网页

JSONObject mainButton3 = new JSONObject();
mainButton3.put("name", "访问官网");
mainButton3.put("type", "view");
mainButton3.put("url", "http://www.example.com/");

上述代码演示的是菜单类型为“view”的一级菜单。当用户点击此菜单时,微信客户端将打开在菜单中配置的网页 URL。

希望以上内容对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信公众号开发之设置自定义菜单实例代码【java版】 - Python技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java8 计算时间差的方法示例

    Java8 计算时间差的方法示例 计算时间差在很多应用场景中都非常常见,比如计算两个时间点之间的时间差、计算函数或方法的执行时间等等。本文将介绍在 Java8 中计算时间差的方法及示例,通过使用 Java8 提供的 DateTime API,可以轻松地对时间进行计算和格式化。 1. 使用 Duration 类计算时间差 Duration 类是 Java8 中…

    Java 2023年5月20日
    00
  • Springboot通过配置WebMvcConfig处理Cors非同源访问跨域问题

    下面是详细的讲解。 什么是跨域? 跨域是指在浏览器的同源策略下,一个页面的脚本(包括JavaScript、Ajax等)访问另一个页面的数据时,出现了协议、域名或端口号不同的情况。如果不做任何处理,浏览器会阻止跨域请求,会产生“跨域问题”。 跨域解决方案 在前后端分离的项目中,开发人员经常会遇到跨域问题。解决跨域问题的方法很多,其中一种是使用CORS(跨域资源…

    Java 2023年5月23日
    00
  • 什么是垃圾回收的GC日志?

    垃圾回收器(Garbage Collector,GC)是Java虚拟机(JVM)中的一个子系统,负责对程序中不再使用的对象进行回收和释放内存。GC日志是用于分析和调优GC行为的重要工具,它记录了JVM在执行垃圾回收时所进行的操作,并可供开发者分析GC的性能、回收效率、内存使用情况等信息。以下是垃圾回收的GC日志的详细使用攻略。 什么是GC日志? GC日志是J…

    Java 2023年5月10日
    00
  • SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    SpringBoot与Quartz集成实现分布式定时任务集群的代码实例 1. 什么是Quartz Quartz是一个开源的作业调度框架,可以用来实现定时任务、计划任务等。Quartz提供了丰富的API,可以满足各种复杂的调度需求。Quartz还支持集群部署,可以实现分布式定时任务的调度。 2. SpringBoot与Quartz集成 在SpringBoot中…

    Java 2023年5月15日
    00
  • IntelliJ IDEA配置Tomcat(完整版图文教程)

    下面我将详细讲解“IntelliJ IDEA配置Tomcat(完整版图文教程)”,包含完整的流程和两个示例,希望能够帮助您完成Tomcat的配置。 准备工作 下载Tomcat安装包和IntelliJ IDEA开发工具,并安装配置好IntelliJ IDEA 打开IntelliJ IDEA,在顶部导航栏中选择“File” -> “Settings” -&…

    Java 2023年5月19日
    00
  • JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架

    JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架是一套完整的JavaWeb开发框架,本文将详细讲解其搭建过程及使用方法,并提供两个示例说明。 框架搭建 1. Spring Spring是一个轻量级的Java框架,它提供了依赖注入和面向切面编程等功能。在搭建…

    Java 2023年5月18日
    00
  • 基于Cookie使用过滤器实现客户每次访问只登录一次

    概述 使用过滤器来实现客户端每次访问只登录一次,需要使用Cookie来保存会话信息。把用户的登录状态作为一个标识存储到Cookie中,通过过滤器来检查Cookie中是否存在标识,如果存在则表示用户已经登录过,直接放行请求;如果不存在,则表示用户未登录或者会话已失效,需要跳转到登录界面进行身份验证。 实现步骤 2.1 配置过滤器 在web.xml文件中添加如下…

    Java 2023年6月16日
    00
  • 编码为GB2312网站让AJAX接收的数据显示支持中文

    为了让 AJAX 接收的数据支持中文,我们需要考虑两个方面:编码和显示。 编码 首先,我们需要将网站的编码设置为 GB2312。这可以通过在 HTML head 标签中添加以下代码实现: <meta http-equiv="Content-Type" content="text/html; charset=gb2312&q…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部