微信服务号新手入门讲解、第二章(创建菜单)
服务号最多有三个一级菜单,每个一级菜单可以最多配置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
微信服务号新手入门讲解、第二章(创建菜单)相关推荐
- lua-protobuf 新手入门篇-第二章.Unity lua-protobuf 环境配置
第一章.编译lua-protobuf支持库(Windows插件-Win10编译) 第二章.Unity & lua-protobuf 环境配置 第三章.二进制proto读取功能,与,lua-pr ...
- Java微信服务号的开发(简单入门)
进行微信服务号开发的步骤 一个别人已经搭建好的项目参考地址:下载链接 1.搭建微信服务号的服务器 项目配置maven <dependency><groupId>com.soec ...
- 微信公众号开发入门教程第一篇
微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...
- 【 linux系统入门管理篇-第二章文件和用户的管理】
linux系统入门管理篇-第二章文件和用户的管理 本章介绍 一.文件管理 (一).Linux目录结构 (二).文件管理 1.文件管理命令 2.文件类型 二.用户管理 (一).用户/组基本概念 (二). ...
- 微信开发学习总结(一)——微信公众号开发入门指引
本节要求: ①微信公众号申请 ②测试公众号的注册 ③准备微信公众号开发的环境 微信公众号开发入门指引 微信公众号的接入在微信公众平台-微信公众平台技术文档中有着详细的介绍.在进行微信开发前,建议先完整 ...
- 百万级微信服务号如何做活动运营和用户运营?
原文发布于2014年9月初. 大家好,我叫米拉,我是做新媒体运营的,我们运营的微信服务号目前已突破100W+粉丝.通过活动测试我们的用户活跃度在20%左右.头条阅读打开率基本保持业内水平10%,在新榜 ...
- 全面解读:微信服务号升级和群发增至4条的应用方法
全面解读:微信服务号升级和群发增至4条的应用方法 摘要:微信公众平台正式公布微信服务号升级的消息,提供高级群发接口,火速华磊初步总结:群发接口的提供意味着企业获得了精准推送的能力.企业获得了每月多次激 ...
- 微信服务号解决开启服务配置后自定义菜单失效的方法
在部署微信服务号时碰到一个问题,由于需要监听用户订阅和取消订阅服务号的事件,所以开启了服务器配置(如何监听可查阅我上一篇文章),开启后发现服务号的菜单不见了.到微信公众平台的管理后台中查看自定义菜单, ...
- 微信服务号开发的完整人性化版攻略
前言: 本次要讲述的是一个本人完整微信服务号开发的经验分享,微信服务号的作品:请搜索微信号:zjaisino,名称:爱信诺Aisino一站式服务平台.(这里声明,这不是打广告,只是为了方便各位开花攻城 ...
- 微信服务号VS订阅号
这两天随着微信5.0的上线,自媒体号,企业号,草根个人号都在纠结自己的号到底选择服务号还是订阅号. 到底该怎么选?我们一起来看一看. 1.首先是订阅号 订阅号是目前绝大多数微信公众号的类型,也是微信公 ...
最新文章
- 团队工具_「管理工具」部门有效管理的5个工具,打造高效团队
- 最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?(附链接)...
- 人生低谷时的锅底法则
- pi节点虚拟服务器怎么弄,pi怎么用云服务器做节点
- Windows.form增删改查
- bzoj3122 [SDOI2013]随机数生成器
- 美化type=file控件
- Python——相对路径的学习笔记
- [转载] python flask实现分页
- 【转】opengl的一些小问题
- 聚类(1)-- k-means clustering
- SpringCloudOAuth2之验证资源服务器的配置
- 关于集成网卡怎么设置pxe网卡启动
- 威金蠕虫(网吧杀手)肆虐互联网 九千用户十余企业遭攻击
- flask url_for()和redirect的区别
- 简单三招,教你做个app
- 微信服务商子商户支付
- 区块链:Hyperledger Fabric环境配置及fabric-sample测试运行
- CTFshow_萌新(密码)
- win10 安装oracle11g完整教程