微信测试号开发之五 自定义菜单
原文:https://blog.csdn.net/qq_37936542/article/details/78549731
注意:
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
按钮类型:
1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
了解更多请查看微信开发文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
创建菜单接口:
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
click和view类型按钮的请求数据格式如下:
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com",
"appid":"wx286b93c14bbf93aa",
"pagepath":"pages/lunar/index"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
进行开发:
(一):封装按钮对象
一:基类
- public class Button {
- private String name;//所有一级菜单、二级菜单都共有一个相同的属性,那就是name
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
二:子菜单类
- /**
- * 描述: 子菜单项 :没有子菜单的菜单项,有可能是二级菜单项,也有可能是不含二级菜单的一级菜单。
- */
- public class CommonButton extends Button {
- private String type;
- private String key;
- private String url;
- 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;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- }
三:父菜单类
- /**
- * 描述: 父菜单项 :包含有二级菜单项的一级菜单。这类菜单项包含有二个属性:name和sub_button,而sub_button以是一个子菜单项数组
- */
- 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;
- }
- }
(二):封装生成菜单的方法
- import com.fasterxml.jackson.databind.JsonNode;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.mote.weixin.entry.Menu;
- public class MenuUtils {
- private static ObjectMapper MAPPER = new ObjectMapper();
- public static int createMenu(Menu menu, String accessToken) throws Exception {
- int result = 0;
- // 拼装创建菜单的url
- String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken+"";
- // 将菜单对象转换成json字符串
- String jsonMenu = MAPPER.writeValueAsString(menu);
- // 调用接口创建菜单,CommonUtils是上一篇中介绍的内容
- String resq = CommonUtils.Post_Json(url, jsonMenu);
- JsonNode tree = MAPPER.readTree(resq);
- if(tree.get("errcode").toString().equals("0")){
- System.out.println("菜单创建成功!");
- }else{
- System.out.println("菜单创建失败!");
- }
- return result;
- }
- }
(三):组装数据,生成菜单
- import org.springframework.stereotype.Controller;
- import com.mote.weixin.entry.Button;
- import com.mote.weixin.entry.CommonButton;
- import com.mote.weixin.entry.ComplexButton;
- import com.mote.weixin.entry.Menu;
- import com.mote.weixin.utils.CommonUtils;
- import com.mote.weixin.utils.MenuUtils;
- @Controller
- public class MenuController {
- public static void main(String[] args) {
- try {
- // 调用接口获取access_token,CommonUtils是上一篇中的内容
- String accessToken = CommonUtils.getAccessToken();
- // 调用接口创建菜单
- MenuUtils.createMenu(getMenu(), accessToken);
- } catch (Exception e) {
- System.out.println("菜单创建失败");
- e.printStackTrace();
- }
- }
- /**
- * 组装菜单数据
- *
- * @return
- */
- private static Menu getMenu() {
- CommonButton btn11 = new CommonButton();
- btn11.setName("校园导航");
- btn11.setType("view");
- btn11.setUrl("http://02d73f21.ngrok.io/wx_coges/navi.jsp");
- CommonButton btn21 = new CommonButton();
- btn21.setName("学校风采");
- btn21.setType("view");
- btn21.setKey("21");
- btn21.setUrl("https://www.baidu.com/");
- CommonButton btn31 = new CommonButton();
- btn31.setName("健身服务");
- btn31.setType("click");
- btn31.setKey("31");
- CommonButton btn32 = new CommonButton();
- btn32.setName("爱情咨询");
- btn32.setType("click");
- btn32.setKey("32");
- /**
- * 微信: mainBtn2,mainBtn3底部的三个一级菜单
- */
- ComplexButton mainBtn3 = new ComplexButton();
- mainBtn3.setName("更多服务");
- mainBtn3.setSub_button(new CommonButton[] { btn31, btn32});
- /**
- * 封装整个菜单
- */
- Menu menu = new Menu();
- menu.setButton(new Button[] { btn11, btn21, mainBtn3 });
- return menu;
- }
- }
ok了,直接执行main方法就可以生成菜单了,试试吧
文末福利:
福利一:前端,Java,产品经理,微信小程序,Python等10G资源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入门与实战全套详细视频教程。
【领取方法】
关注 【编程微刊】微信公众号:
回复【小程序demo】一键领取130个微信小程序源码demo资源。
回复【领取资源】一键领取前端,Java,产品经理,微信小程序,Python等资源合集10G资源大放送。
![](https://pic4.zhimg.com/80/v2-ded7836e2811ccee2548029b98a0aacc_hd.jpg)
原文作者:祈澈姑娘
原文链接:https://www.jianshu.com/u/05f416aefbe1
创作不易,转载请告知
90后前端妹子,爱编程,爱运营,爱折腾。
坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。