玩玩微信公众号Java版之四:自定义公众号菜单
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
3、scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
5、pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
6、pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
7、pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
8、location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
9、media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
10、view_limited:跳转图文消息URL用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
参数 | 是否必须 | 说明 |
button | 是 | 一级菜单数组,个数应为1~3个 |
sub_button | 否 | 二级菜单数组,个数应为1~5个 |
type | 是 | 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型 |
name | 是 | 菜单标题,不超过16个字节,子菜单不超过60个字节 |
key | click等点击类型必须 | 菜单KEY值,用于消息接口推送,不超过128字节 |
url | view、miniprogram类型必须 | 网页链接,用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。 |
media_id | media_id类型和view_limited类型必须 | 调用新增永久素材接口返回的合法media_id |
appid | miniprogram类型必须 | 小程序的appid(仅认证公众号可配置) |
pagepath | miniprogram类型必须 | 小程序的页面路径 |
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
{"errcode":0,"errmsg":"ok"}

- /**
- * 微信菜单基类
- * @author Damon
- */
- public class MenuButton
- {
- /**
- * 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型
- */
- private String type = "";
- /**
- * 菜单标题,不超过16个字节,子菜单不超过60个字节
- */
- private String name = "";
- public String getType()
- {
- return type;
- }
- public void setType(String type)
- {
- this.type = type;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
对于子菜单,可以继承基类,同时对本身新增属性对定义:
- /**
- * 子菜单
- * @author Damon
- *
- */
- public class SubMenuButton extends MenuButton
- {
- /**
- * click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
- */
- private String key ="";
- /**
- * view、miniprogram类型必须 网页链接,用户点击菜单可打开链接,不超过1024字节。
- * type为miniprogram时,不支持小程序的老版本客户端将打开本url。
- */
- private String url="";
- /**
- * media_id类型和view_limited类型必须 调用新增永久素材接口返回的合法media_id
- */
- private String media_id = "";
- /**
- * miniprogram类型必须 小程序的appid(仅认证公众号可配置)
- */
- private String appid = "";
- /**
- * miniprogram类型必须 小程序的页面路径
- */
- private String pagepath = "";
- public String getKey()
- {
- return key;
- }
- public void setKey(String key)
- {
- this.key = key;
- }
- public String getUrl()
- {
- return url;
- }
- public void setUrl(String url)
- {
- this.url = url;
- }
- public String getMedia_id()
- {
- return media_id;
- }
- public void setMedia_id(String media_id)
- {
- this.media_id = media_id;
- }
- public String getAppid()
- {
- return appid;
- }
- public void setAppid(String appid)
- {
- this.appid = appid;
- }
- public String getPagepath()
- {
- return pagepath;
- }
- public void setPagepath(String pagepath)
- {
- this.pagepath = pagepath;
- }
- }
对导航窗口进行定义,即包含多个子菜单:
- /**
- * 导航菜单
- * @author Damon
- */
- public class LevelMenu extends MenuButton
- {
- /**
- * 包含多个子菜单 定义名称与json中一致,不然解析名称对不上
- */
- private SubMenuButton[] sub_button;
- public SubMenuButton[] getSub_button()
- {
- return sub_button;
- }
- public void setSub_button(SubMenuButton[] sub_button)
- {
- this.sub_button = sub_button;
- }
- }
- /**
- * 微信菜单类
- * @author Damon
- */
- public class Menu
- {
- /* 定义名称与json中一致,不然解析名称对不上 */
- private MenuButton[] button;
- public MenuButton[] getButton()
- {
- return button;
- }
- public void setButton(MenuButton[] button)
- {
- this.button = button;
- }
- }
基本对象都定义好了,下一步就是进行接口调用,实现创建自定义菜单:
- /**
- * 创建菜单
- * @param menu
- * @return
- */
- public boolean createMenu()
- {
- // 1、获取access_token
- WeChatTokenService tWeChatTokenService = new WeChatTokenService();
- String tAccess_Token = tWeChatTokenService.getToken("appid", "appsceret").getToken();
- // 2、组建菜单
- String tMenuJSON = JSONObject.fromObject(getMenu()).toString();
- // 3、请求调用
- String result = createMenubyHttps(tAccess_Token, tMenuJSON);
- System.out.println(result);
- return true;
- }
其中 access_token的获取可参考之前第三节的,这样每个token都有2个小时的有效时间,不用频繁获取。


- /**
- * 定义菜单属性
- * @return
- */
- private Menu getMenu()
- {
- Menu menu = new Menu();
- // 建3个导航菜单
- LevelMenu tLevelMenuOne = new LevelMenu();
- tLevelMenuOne.setName("Damon");
- LevelMenu tLevelMenuTwo = new LevelMenu();
- tLevelMenuTwo.setName("Panou");
- LevelMenu tLevelMenuThree = new LevelMenu();
- tLevelMenuThree.setName("Papaw");
- // 第一个导航菜单的子菜单
- SubMenuButton tSubMenuButton_oneone = new SubMenuButton();
- tSubMenuButton_oneone.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_oneone.setName("play basketball");
- tSubMenuButton_oneone.setKey("11");
- SubMenuButton tSubMenuButton_onetwo = new SubMenuButton();
- tSubMenuButton_onetwo.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_onetwo.setName("swimming");
- tSubMenuButton_onetwo.setKey("12");
- // 加入导航菜单
- tLevelMenuOne.setSub_button(new SubMenuButton[]
- { tSubMenuButton_oneone, tSubMenuButton_onetwo });
- // 第二 个导航菜单的子菜单
- SubMenuButton tSubMenuButton_twoone = new SubMenuButton();
- tSubMenuButton_twoone.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_twoone.setName("watching TV");
- tSubMenuButton_twoone.setKey("21");
- SubMenuButton tSubMenuButton_twotwo = new SubMenuButton();
- tSubMenuButton_twotwo.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_twotwo.setName("play games");
- tSubMenuButton_twotwo.setKey("22");
- SubMenuButton tSubMenuButton_twothree = new SubMenuButton();
- tSubMenuButton_twothree.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_twothree.setName("shopping");
- tSubMenuButton_twothree.setKey("23");
- // 加入导航菜单
- tLevelMenuTwo.setSub_button(new SubMenuButton[]
- { tSubMenuButton_twoone, tSubMenuButton_twotwo, tSubMenuButton_twothree });
- // 第三个导航菜单的子菜单
- SubMenuButton tSubMenuButton_threeone = new SubMenuButton();
- tSubMenuButton_threeone.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_threeone.setName("cring");
- tSubMenuButton_threeone.setKey("31");
- SubMenuButton tSubMenuButton_threetwo = new SubMenuButton();
- tSubMenuButton_threetwo.setType(SysCon.WECHAT_MENU_TYPE_CLICK);
- tSubMenuButton_threetwo.setName("laughing");
- tSubMenuButton_threetwo.setKey("32");
- // 加入导航菜单
- tLevelMenuThree.setSub_button(new SubMenuButton[]
- { tSubMenuButton_threeone, tSubMenuButton_threetwo });
- menu.setButton(new MenuButton[]
- { tLevelMenuOne, tLevelMenuTwo, tLevelMenuThree });
- return menu;
- }
- /**
- * 请求调用,设置菜单信息
- * @param url
- * @param requestData
- * @return
- */
- private String createMenubyHttps(String access_token, String requestData)
- {
- // 返回报文
- String strResp = "";
- String path = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token;
- try
- {
- strResp = WeChatUtil.doHttpsPost(path, requestData);
- }
- catch (HttpException e)
- {
- // 发生致命的异常,可能是协议不对或者返回的内容有问题
- System.out.println("Please check your provided http address!" + e);
- e.printStackTrace();
- }
- catch (IOException e)
- {
- // 发生网络异常
- }
- catch (Exception e)
- {
- System.out.println(e);
- }
- finally
- {}
- return strResp;
- }


玩玩微信公众号Java版之四:自定义公众号菜单的更多相关文章
- 玩玩微信公众号Java版之七:自定义微信分享
前面已经学会了微信网页授权,现在微信网页的功能也可以开展起来啦! 首先,我们先来学习一下分享,如何在自己的页面获取分享接口及让小伙伴来分享呢? 今天的主人公: 微信 JS-SDK, 对应官方链接为:微 ...
- 微信公众平台Java版极速SDK
JEEWX-API 是第一个微信公众平台Java版极速SDK,基于 jeewx-api 开发可以立即拥有简单易用的API,让开发更加轻松自如,节省更多时间 http://www.jeewx.com/
- 玩玩微信公众号Java版之六:微信网页授权
我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧! 参考官方文档:https://mp.weixin.qq.com/wiki?t=resource ...
- 微信5.4安卓版重回ios风格 导航菜单都放底栏位置
微信5.4安卓版发布更新了,由于本人的手机设置软件自动更新,中午的时候才发现微信换成了5.4版本,启动微信后是一个大大的“转账,就是发消息”,进入微信界面有点小惊喜,导航菜单都改为底部tab方式,顶部 ...
- 玩玩微信公众号Java版之三:access_token及存储access_token
微信官方参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 基本说明: access_token是 ...
- 玩玩微信公众号Java版之一:配置微信公众平台服务器信息
在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦! 第一.准备好服务端接口 定义一个http服务接口,主要分为如下几步: 1.创建一个servlet类,用来接收请求: ...
- 玩玩微信公众号Java版之准备
微信自2013年流行起来,现在的发展已经超过了我们的想象,那么对应的公众平台,小程序等都是让人眼前一亮的东西,这里来学习一下微信工作号的对接,实现为Java,希望大家一起学习! 这里大概描述一下所 ...
- 玩玩微信公众号Java版之五:获取关注用户信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
随机推荐
- 开发Activity步骤
第一步:写一个累继承Activity第二步:重写onCreate方法第三步:在主配置文件中注册activity <activity android:name=".类名" an ...
- map,zip,reduce函数
lt=range(5,10) lw=range(8,13) def mul(a,b): return a*b def mul_list(param1,param2): return_list=[] f ...
- js获取地址栏某个参数
一.获取单个参数: 若地址栏URL为:abc.html?id=123 function getString(){ var locurl=location.href; var sta ...
- CSS 公共样式
global.css | reset.css(格式化样式) common.css(公共组件样式) layout.css(当前页面样式) 清除全站所有页面的浏览器默认样式,保证在初始样式在所有浏览器下一 ...
- Bash变量扩展修改符
1.未设置就临时替换(:-) 冒号:用来检验变量是否设置过,如果没有冒号,则认为设置过,不替换$fruit=peach$echo ${fruit:-plum}peach $fruit=$echo ${ ...
- 【LCA求最近公共祖先+vector构图】Distance Queries
Distance Queries 时间限制: 1 Sec 内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...
- noip借教室 题解
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- [Tool] Git 使用 与 Git Flow
目录 简介 Git 命令 Git Flow 简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Lin ...
- Hybris 6.4 + Jrebel
Jrebel官网参考地址:https://manuals.zeroturnaround.com/jrebel/standalone/hybris.html Wiki Hybris参考地址:https: ...
- Linux下如何启动svn服务器
service svnserve start 启动服务 service svnserve stop 停止服务 service svnserve restart 重启服务 rpm -e --nodeps ...