微信公众账号开发自定义菜单的示例分析
发表于:2025-11-18 作者:千家信息网编辑
千家信息网最后更新 2025年11月18日,小编给大家分享一下微信公众账号开发自定义菜单的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 开发公司的微信
千家信息网最后更新 2025年11月18日微信公众账号开发自定义菜单的示例分析
小编给大家分享一下微信公众账号开发自定义菜单的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。 自定义菜单操作流程其实很简单 ,就是执行一段Java程序 将你公众账号的appid和封装的菜单发送到腾讯服务器,腾讯服务器会根据你请求参数appid和封装的菜单添加到对应的公众账号,一定要罗嗦一句, 在Java 程序中执行一次 main 方法就可以,下次修改重新执行,不过会有缓存,取消重新关注就可以了。 1 新建按钮基类 public class Button { //按钮名称 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2,根据业务需求新建不同的按钮类 /** * view类型的按钮 点击跳转链接 * */ public class ViewButton extends Button { private String type; private String url; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }/*** click类型的按钮 类似于input type = 'button' 指定key 根据捕获到的key处理相应的业务**/public class ClickButton extends Button { private String type; private String key; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getKey() { return key; } public void setKey(String key) { this.key = key; }}3 创建符合类型的按钮 , 说白了就是创建主菜单容器/*** 复合类型的按钮**/public class ComplexButton extends Button {private Button[] sub_button;public Button[] getSub_button() {return sub_button;}public void setSub_button(Button[] sub_button) {this.sub_button = sub_button;}}4 创建菜单类, 用于盛放 三个主菜单/*** 菜单*/public class Menu {private Button[] button;public Button[] getButton() {return button;}public void setButton(Button[] button) {this.button = button;}}5 创建调用凭证类Token 为执行main方法调用腾讯接口做准备/*** 凭证**/public class Token {// 接口访问凭证private String accessToken;// 凭证有效期,单位:秒private int expiresIn;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}}以下代码我只做类的描述。具体代码功能看注释。6 为调用腾讯接口做准备(1)创建通用工具类/*** 通用工具类**/public class CommonUtil {private static Logger log = LoggerFactory.getLogger(CommonUtil.class);/*** 获取接口访问凭证** @param appid 凭证* @param appsecret 密钥* @return*/public static Token getToken(String appid, String appsecret) {// 凭证获取(GET)String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";Token token = null;String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);// 发起GET请求获取凭证JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {token = new Token();token.setAccessToken(jsonObject.getString("access_token"));token.setExpiresIn(jsonObject.getInt("expires_in"));} catch (JSONException e) {// 获取token失败token = null;}}return token;}/*** 发送https请求** @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);// 当outputStr不为null时向输出流写数据if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = conn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("连接超时:{}", ce);} catch (Exception e) {log.error("https请求异常:{}", e);}return jsonObject;}}(2)创建信任管理器package com.test.util;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/*** 信任管理器**/public class MyX509TrustManager implements X509TrustManager {// 检查客户端证书public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 检查服务器端证书public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 返回受信任的X509证书数组public X509Certificate[] getAcceptedIssuers() {return null;}}7 以上工作做完就可以创建自定义菜单了。创建自定义菜单管理类。赋值 appId 和 appSecret 运行main方法, 搞定。package com.test.menu;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import net.sf.json.JSONObject;import com.test.bean.Button;import com.test.bean.ComplexButton;import com.test.bean.Menu;import com.test.bean.Token;import com.test.bean.ViewButton;import com.test.util.CommonUtil;/*** 菜单管理器类**/public class MenuManager {private static Logger log = LoggerFactory.getLogger(MenuManager.class);/*** 定义菜单结构* @return*/private static Menu getMenu() {//定义子菜单ViewButton btn1 = new ViewButton();btn1.setName("子菜单1");btn1.setType("view");btn1.setUrl("http://www.baidu.com");ViewButton btn2 = new ViewButton();btn2.setName("子菜单2");btn2.setType("view");btn2.setUrl("http://www.baidu.com");ViewButton btn3 = new ViewButton();btn3.setName("子菜单3");btn3.setType("view");btn3.setUrl("http://www.baidu.com");ViewButton btn4 = new ViewButton();btn4.setName("子菜单4");btn4.setType("view");btn4.setUrl("http://www.baidu.com");ComplexButton mainBtn1 = new ComplexButton();mainBtn1.setName("主菜单1");mainBtn1.setSub_button(new Button[] { btn1,btn2});//微信规定最多五个子菜单ComplexButton mainBtn2 = new ComplexButton();mainBtn2.setName("主菜单2");mainBtn2.setSub_button(new Button[] { btn3});ComplexButton mainBtn3 = new ComplexButton();mainBtn3.setName("主菜单3");mainBtn3.setSub_button(new Button[] {btn4});Menu menu = new Menu();menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });return menu;}public static void main(String[] args) {// 公众账号唯一凭证1
String appId = "";//公众账号唯一凭证密钥String appSecret = "";// 调用接口获取凭证Token token = CommonUtil.getToken(appId, appSecret);if (null != token) {// 创建菜单boolean result = createMenu(getMenu(), token.getAccessToken());// 判断菜单创建结果if (result)log.info("菜单创建成功!");elselog.info("菜单创建失败!");}}/*** 创建菜单** @param menu 菜单实例* @param accessToken 凭证* @return true成功 false失败*/public static boolean createMenu(Menu menu, String accessToken) {boolean result = false;String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);// 将菜单对象转换成json字符串String jsonMenu = JSONObject.fromObject(menu).toString();// 发起POST请求创建菜单JSONObject jsonObject = CommonUtil.httpsRequest(url, "POST", jsonMenu);if (null != jsonObject) {int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");if (0 == errorCode) {result = true;} else {result = false;log.error("创建菜单失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return result;}}以上是"微信公众账号开发自定义菜单的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
菜单
凭证
公众
账号
按钮
对象
接口
管理
类型
腾讯
开发
内容
方式
方法
服务器
篇文章
证书
服务
示例
分析
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
北京软件开发网
网络技术与应用专业有哪些课程
网络技术学习了解
阿里数据库的书
数据库系统概念复习资料
2021怀旧服服务器比例
数据库自然连接的例子
什么是搜索引擎数据库
服务器上找不到资源管理器
供电计算机网络安全风险
网络安全公司pk
深圳做软件开发的业务兼职
微信支付服务器设置在哪里
软件开发分析阶段使用工具
科盾网络技术有限公司
服务器有文件但是提示404
数据库中建立学生关系表
frp服务器可以不设置密码吗
零基础该如何学好计算机网络技术
物联网网络技术分类
软件开发视频大讲堂c百度云
湖北互联网软件开发服务费
网络安全危险性带来的影响
神兽世界区块链软件开发
网络安全的重要组成部分是
单位网络安全防护
苹果6p摔一下服务器连不上了
中电科网络安全
十款好用的服务器机箱
东信网络技术有限公司