微信公众账号开发自定义菜单的示例分析
发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,小编给大家分享一下微信公众账号开发自定义菜单的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 开发公司的微信
千家信息网最后更新 2024年11月12日微信公众账号开发自定义菜单的示例分析
小编给大家分享一下微信公众账号开发自定义菜单的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。 自定义菜单操作流程其实很简单 ,就是执行一段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安全错误
数据库的锁怎样保障安全
河南软件开发的行业前景
数据库怎么导出数据表
4046电大数据库运维纸板
视频播放服务器配置
建设一个数据库的demo
连接数据库显示网络错误
铜陵安卓软件开发定制公司
福建机电软件开发包括哪些
入门级云服务器有哪些
云南党员教育软件开发公司
智能化服务器租用
全光网络技术挑战
数据库保存json结构
软件开发海纳通
琉璃仙剑手游剑尊服务器
吉祥航空软件开发
自己制作服务器需要什么
无线电视连接不上互联网和服务器
联合国网络安全国际研究会
企业网络技术实务
河南软件开发的行业前景
安吉彩虹网络技术
case如何表示范围数据库
黑石物理服务器特性
河南省新兴为网络技术有限公司
软件开发技术标准国家标准
个人服务器的好处
自己制作服务器需要什么
武汉光谷注册的 软件开发公司
数据库表格添加性别