服务号最多有三个一级菜单,每个一级菜单可以最多配置5二级菜单,配置菜单可以登陆微信服务号后台进行配置,也可以使用代码调用微信接口服务来自定义配置,各有优缺点,今天主要分享下代码配置菜单的方式。

先了解下菜单的官方文档:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html

接口调用请求说明
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

由官方文档提供的接口调用请求说明可以知道,生成菜单需要ACCESS_TOKEN这个参数,而这个参数又是由APPID和APPSECRET来调用ACCESS_TOKEN的接口来获取的,所以我们主要步骤如下:

1 获取ACCESS_TOKEN
2 根据文档构建菜单数据格式
3 调用菜单接口生成菜单

上代码:

1 获取ACCESS_TOKEN(该参数在微信那边是有每天调用次数的上限的,需要将该参数缓存起来,过期后再重新调用获取)

/*** 获取基础accesstoken地址,get方式*/public final static String token_Url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/*** 获取公众号的唯一秘钥,Accesstoken* @param appId  * @param appsecred* @return   accessToken */public static String getAccessToken(){//拼接请求地址String requestUrl = token_Url.replace("APPID", appId).replace("APPSECRET", secret);String accessToken = "";long token_time = Singleton.getInstance().getTokenTime();long nowTime = System.currentTimeMillis()/1000;//判断上次获取的accessToken是否有效,如果无效重新获取,并缓存if(0 == token_time || nowTime - token_time > 7000){//调用接口String jsonString = HttsRequest(requestUrl, "GET", null);try{//将json字符串转换成java对象JSONObject jsonObj = JSONObject.fromObject(jsonString);boolean err = jsonObj.containsKey("access_token");if(err){accessToken = jsonObj.getString("access_token");logger.info("获取access_token: "+accessToken);}else{accessToken = "";logger.info("获取access_token失败!"+jsonObj);}// 缓存accessTokenSingleton.getInstance().setAccessToken(accessToken);Singleton.getInstance().setTokenTime(System.currentTimeMillis()/1000);}catch(Exception e){e.printStackTrace();}}else{accessToken = Singleton.getInstance().getAccessToken();}return accessToken;}

使用单例模式缓存


public class Singleton {private static Singleton singleton = null;private String accessToken;private long tokenTime;private String jsapiTicket;private long ticketTime;private Singleton() {}// 静态工厂方法public static synchronized Singleton getInstance(){if(singleton == null){singleton = new Singleton();}return singleton;}public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public long getTokenTime() {return tokenTime;}public void setTokenTime(long tokenTime) {this.tokenTime = tokenTime;}public String getJsapiTicket() {return jsapiTicket;}public void setJsapiTicket(String jsapiTicket) {this.jsapiTicket = jsapiTicket;}public long getTicketTime() {return ticketTime;}public void setTicketTime(long ticketTime) {this.ticketTime = ticketTime;}}

2 根据文档构建菜单数据格式

public String menuJSON(){ Menu menu = new Menu();ViewButton btn11 = new ViewButton();ViewButton btn12 = new ViewButton();ViewButton btn13 = new ViewButton();ViewButton btn14 = new ViewButton();ViewButton btn15 = new ViewButton();btn11.setName("会员活动");btn11.setUrl("https://www.baidu.com");btn11.setType("view");btn12.setName("信息公开");btn12.setUrl("https://www.baidu.com");btn12.setType("view");btn13.setName("政策发布");btn13.setUrl("https://www.baidu.com");btn13.setType("view");btn14.setName("会员热点");btn14.setUrl("https://www.baidu.com");btn14.setType("view");btn15.setName("更多精彩");btn15.setUrl("https://www.baidu.com");btn15.setType("view");ViewButton btn21 = new ViewButton();ViewButton btn22 = new ViewButton();ViewButton btn23 = new ViewButton();btn21.setName("我的服务");btn21.setUrl("http://www.baidu.com");btn21.setType("view");btn22.setName("在线客服");btn22.setUrl("https://www.baidu.com");btn22.setType("view");btn23.setName("我的业务"); btn23.setUrl("http://www.baidu.com"); btn23.setType("view");ViewButton btn31 = new ViewButton();ViewButton btn32 = new ViewButton();ViewButton btn33 = new ViewButton();ViewButton btn34 = new ViewButton();ViewButton btn35 = new ViewButton();btn31.setName("公司介绍");btn31.setUrl("http://www.baidu.com");btn31.setType("view");btn32.setName("公司产品");btn32.setUrl("http://www.baidu.com");btn32.setType("view");btn33.setName("解决方案");btn33.setUrl("http://www.baidu.com");btn33.setType("view");btn34.setName("经典案例");btn34.setUrl("http://www.baidu.com");btn34.setType("view");btn35.setName("更多精彩");btn35.setUrl("http://www.baidu.com");btn35.setType("view");ComplexButton btn1 = new ComplexButton();ComplexButton btn2 = new ComplexButton();ComplexButton btn3 = new ComplexButton();btn1.setName("第一个一级菜单");btn2.setName("第二个一级菜单");btn3.setName("第三个一级菜单");//一级菜单中的子菜单btn1.setSub_button(new Button[]{btn15});btn2.setSub_button(new Button[]{btn21, btn23});btn3.setSub_button(new Button[]{btn31});//菜单对象menu.setButton(new Button[]{btn1,btn2,btn3});//将java对象转换成JSON字符串String menuJson = JSONObject.fromObject(menu).toString();return menuJson;}

3 调用菜单接口生成菜单

private final static String MENU_CREATE_URL = " https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";public boolean createMenu(String json,String accessToken){boolean result = false;//拼装请求地址String requestUrl = MENU_CREATE_URL.replace("ACCESS_TOKEN", accessToken);//调用接口String respjson = CommUtil.HttsRequest(requestUrl, "POST", json);//将JSONObject字符串转成对象JSONObject jsonobject = JSONObject.fromObject(respjson);if(jsonobject != null){int errCode = jsonobject.getInt("errcode");String errMsg = jsonobject.getString("errmsg");if(0 == errCode){result = true;System.out.println("创建菜单成功!");}else{result= false;System.out.println("创建菜单失败:"+errCode);}}return result;}

4 调用:


public class MenuTest {public static void main(String[] args) {//创建菜单MenuUtils mu = new MenuUtils();String menuJson = mu.menuJSON();//生成菜单前先确认域名是否对应正确boolean ceshihao = mu.createMenu(menuJson,CommUtil.getAccessToken());}}

http请求工具包到我主要找,有现成的代码。
https://blog.csdn.net/lilin869626257/article/details/121426949

微信服务号新手入门讲解、第二章(创建菜单)相关推荐

  1. lua-protobuf 新手入门篇-第二章.Unity lua-protobuf 环境配置

    第一章.编译lua-protobuf支持库(Windows插件-Win10编译) 第二章.Unity & lua-protobuf 环境配置 第三章.二进制proto读取功能,与,lua-pr ...

  2. Java微信服务号的开发(简单入门)

    进行微信服务号开发的步骤 一个别人已经搭建好的项目参考地址:下载链接 1.搭建微信服务号的服务器 项目配置maven <dependency><groupId>com.soec ...

  3. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  4. 【 linux系统入门管理篇-第二章文件和用户的管理】

    linux系统入门管理篇-第二章文件和用户的管理 本章介绍 一.文件管理 (一).Linux目录结构 (二).文件管理 1.文件管理命令 2.文件类型 二.用户管理 (一).用户/组基本概念 (二). ...

  5. 微信开发学习总结(一)——微信公众号开发入门指引

    本节要求: ①微信公众号申请 ②测试公众号的注册 ③准备微信公众号开发的环境 微信公众号开发入门指引 微信公众号的接入在微信公众平台-微信公众平台技术文档中有着详细的介绍.在进行微信开发前,建议先完整 ...

  6. 百万级微信服务号如何做活动运营和用户运营?

    原文发布于2014年9月初. 大家好,我叫米拉,我是做新媒体运营的,我们运营的微信服务号目前已突破100W+粉丝.通过活动测试我们的用户活跃度在20%左右.头条阅读打开率基本保持业内水平10%,在新榜 ...

  7. 全面解读:微信服务号升级和群发增至4条的应用方法

    全面解读:微信服务号升级和群发增至4条的应用方法 摘要:微信公众平台正式公布微信服务号升级的消息,提供高级群发接口,火速华磊初步总结:群发接口的提供意味着企业获得了精准推送的能力.企业获得了每月多次激 ...

  8. 微信服务号解决开启服务配置后自定义菜单失效的方法

    在部署微信服务号时碰到一个问题,由于需要监听用户订阅和取消订阅服务号的事件,所以开启了服务器配置(如何监听可查阅我上一篇文章),开启后发现服务号的菜单不见了.到微信公众平台的管理后台中查看自定义菜单, ...

  9. 微信服务号开发的完整人性化版攻略

    前言: 本次要讲述的是一个本人完整微信服务号开发的经验分享,微信服务号的作品:请搜索微信号:zjaisino,名称:爱信诺Aisino一站式服务平台.(这里声明,这不是打广告,只是为了方便各位开花攻城 ...

  10. 微信服务号VS订阅号

    这两天随着微信5.0的上线,自媒体号,企业号,草根个人号都在纠结自己的号到底选择服务号还是订阅号. 到底该怎么选?我们一起来看一看. 1.首先是订阅号 订阅号是目前绝大多数微信公众号的类型,也是微信公 ...

最新文章

  1. 团队工具_「管理工具」部门有效管理的5个工具,打造高效团队
  2. 最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?(附链接)...
  3. 人生低谷时的锅底法则
  4. pi节点虚拟服务器怎么弄,pi怎么用云服务器做节点
  5. Windows.form增删改查
  6. bzoj3122 [SDOI2013]随机数生成器
  7. 美化type=file控件
  8. Python——相对路径的学习笔记
  9. [转载] python flask实现分页
  10. 【转】opengl的一些小问题
  11. 聚类(1)-- k-means clustering
  12. SpringCloudOAuth2之验证资源服务器的配置
  13. 关于集成网卡怎么设置pxe网卡启动
  14. 威金蠕虫(网吧杀手)肆虐互联网 九千用户十余企业遭攻击
  15. flask url_for()和redirect的区别
  16. 简单三招,教你做个app
  17. 微信服务商子商户支付
  18. 区块链:Hyperledger Fabric环境配置及fabric-sample测试运行
  19. CTFshow_萌新(密码)
  20. win10 安装oracle11g完整教程

热门文章

  1. MD5摘要算法的几种破解方法!
  2. 201671010402 词频统计软件项目报告
  3. SpringBoot整合腾讯云短信服务实现发送短信功能(一篇就够了)
  4. coon.php连接,PHP 连接 MySQL
  5. linux make menuconfig快速查找配置项
  6. Tomcat 修改网站旁边的小图标
  7. 如何修改域名DNS服务器?修改DNS服务器常见问题汇总
  8. 如何正确的将拼多多的买家晒图采集并保存
  9. php二维数组声明方式,php二维数组定义
  10. 基于单片机步进电机控制器设计(正转反转指示灯挡位)