0

0

微信公众账号开发自定义菜单的经验总结

高洛峰

高洛峰

发布时间:2017-03-22 16:10:45

|

2104人浏览过

|

来源于php中文网

原创

这篇文章分享微信公众账号开发自定义菜单的经验总结

    开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。
     
    自定义菜单操作流程其实很简单 ,就是执行一段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);

CRMEB 多语言开源商城系统
CRMEB 多语言开源商城系统

CRMEB打通版是一款全开源支持免费商用的PHP 多语言商城系统;CRMEB技术团队历经6年时间匠心之作!系统采用前后端分离技术,基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台前端使用iviewUI开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;赋能开发者,减少重复造轮子;系统支持自动检查安装环境一键安装部署,使用简单方便

下载

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("菜单创建成功!");

else

log.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;

}

}

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.9万人学习

Rust 教程
Rust 教程

共28课时 | 5.1万人学习

Vue 教程
Vue 教程

共42课时 | 7.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号