详解nodejs微信公众号开发——6.自定义菜单


Posted in NodeJs onApril 13, 2017

上一篇文章:nodejs微信公众号开发——5.素材管理接口,我们实现了新增临时素材、管理永久素材的接口,这些接口的实现,使我们能够推送多样的消息给用户。本节介绍的内容是关于自定义菜单

1. 自定义菜单的介绍

自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。关于自定义菜单需要掌握以下几点内容:

  1. 自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
  2. 一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
  3. 创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

更多信息查看官方文档:自定义菜单创建接口

2. 创建自定义菜单

2.1 首先罗列以下操作的请求地址:

var api = {
  ...
  menu:{
    create:prefix+'/menu/create?', //access_token=ACCESS_TOKEN 创建菜单
    get:prefix+'/menu/get?', //access_token=ACCESS_TOKE 获取菜单,GET请求
    delete:prefix+'/menu/delete?', //access_token=ACCESS_TOKEN 删除菜单,GET请求
    getInfo:prefix+'get_current_selfmenu_info?' //access_token=ACCESS_TOKEN 获取自定义菜单配置接口
  }
}

2.2 定义createMenu函数

Wechat.prototype.createMenu = function(menu){
  var that = this;
  return new Promise(function(resolve,reject){
    that.fetchAccessToken().then(function(data){
      var url = api.menu.create + 'access_token=' + data.access_token;
      request({url:url,method:'POST',body:menu,json:true}).then(function(response){
        var _data = response.body;
        if(_data.errcode === '0'){
          resolve();
        }else{
          throw new Error('create menu failed!');
        }
      }).catch(function(err){
        reject(err);
      });
    });
  });
}

参数menu由外部业务层传入。为了方便管理,将自定义菜单的内容单独写在一个menu.js文件中:

/*
 * 配置自定义菜单
 */
'use strict'

module.exports = {
  'button':[
  {
    'name':'最新',
    'type':'click',
    'key':'menu_click'
  },
  {
    'name':'类别',
    'sub_button':[
      {
        'name':'科幻',
        'type':'view',
        'url':'music.163.com'
      },
      {
        'name':'悬疑',
        'type':'scancode_push',
        'key':'qr_scan'
      },
      {
        'name':'爱情',
        'type':'scancode_waitmsg',
        'key':'qr_scan_wait'
      },
      {
        'name':'教育',
        'type':'pic_photo_or_album',
        'key':'pic_photo_album'
      }
    ]
  },
  {
    'name':'地域',
    'sub_button':[
      {
        'name':'大陆',
        'type':'pic_weixin',
        'key':'pic_weixin'
      },
      {
        'name':'欧美',
        'type':'location_select',
        'key':'location_select'
      }
    ]
  }]
}

里面的类型暂时随意写的。我们在业务层weixin.js里面实现自定义菜单的使用:

wechatApi.deleteMenu().then(function(){
  return wechatApi.createMenu(menu);
}).then(function(msg){
  console.log(msg);
});

保险起见先把原有的菜单删了,重新建立自己新的菜单。

2.3 定义deleteMenu函数

Wechat.prototype.deleteMenu = function(){
  var that = this;
  return new Promise(function(resolve,reject){
    that.fetchAccessToken().then(function(data){
      var url = api.menu.delete + 'access_token=' + data.access_token;
      request({url:url,json:true}).then(function(response){
        var _data = response.body;
        if(_data.errcode === '0'){
          resolve();
        }else{
          throw new Error('delete menu failed!');
        }
      }).catch(function(err){
        reject(err);
      });
    });
  });
}

测试了一下,取关重新关注后微信测试号并没有立即呈现自定义菜单,要等一段时间,略坑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
用nodejs写的一个简单项目打包工具
May 11 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 #NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 #NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 #NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 #NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 #NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 #NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 #NodeJs
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
php实现的验证码文件类实例
2015/06/18 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
python实现在sqlite动态创建表的方法
2015/05/08 Python
Python用模块pytz来转换时区
2016/08/19 Python
Python延时操作实现方法示例
2018/08/14 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
django 实现简单的插入视频
2020/04/07 Python
python IDLE添加行号显示教程
2020/04/25 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
社区优秀志愿者材料
2014/02/02 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
英语辞职信怎么写
2015/02/28 职场文书
上课迟到检讨书
2015/05/06 职场文书
民事申诉状范本
2015/05/20 职场文书
教研活动主持词
2015/07/03 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书