玩玩微信公众号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版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
随机推荐
- DOM知识梳理
DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...
- 基于范围的for循环(STL)
1. ]={4.99,5.99,6.99,7.99,8.99}; for (double x : prices) cout<<x<<endl; //////////////// ...
- 关于Oracle、SqlServer 的sql递归查询
递归查询所有子节点 建人员表 hrmresource 主键 姓名 上级ID 层级关系:- 4 - 3 - 2 - 1 ...
- 获取当前 系统时间 + 获取当前URL 键值;
一://系统当前时间 function show(){ var mydate = new Date(); var str = "" + mydate.getFullYear() + ...
- Silverlight将Excel导入到SQLserver数据库
最近纠结于读取Excel模板数据,将数据导入SQLServer的Silverlight实现,本文将实现代码贴出,作为一个简单的例子,方便各位: 1.先设计前台界面新建Silverlight5.0应用程 ...
- java——国际化详解
深入理解Java国际化 假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面--这便是典型 ...
- [leetcode-566-Reshape the Matrix]
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...
- 【LeetCode】122. Best Time to Buy and Sell Stock II
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- Linux10分钟入门
最近打算考红帽认证,将自己学习到的和工作中常用的一些命令进行总结,供初学者和一定基础的参考. 想系统性学习的话,还是建议看书(鸟哥的Linux私房菜)和看视频(基础版,推荐马哥和老男孩,不推荐**** ...
- 致命错误:mysql/cli 目录 #include "mysql/client_plugin.h"
居然说没有mysql.h这个文件,可是我确实安装了mysql了啊....... 原来是缺少libmysqlclient-dev,OK安装就是了 ubuntu下 : audo apt-get in ...