详解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使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
Aug 20 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
2013/05/15 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
JS实现简单打字测试
2020/06/24 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
中级会计职业生涯规划范文
2014/01/16 职场文书
《长城》教学反思
2014/02/14 职场文书
写给老婆的检讨书
2014/02/21 职场文书
小班开学寄语
2014/04/04 职场文书
篮球比赛口号
2014/06/10 职场文书