详解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 28 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 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数组去重实例及分析
2013/11/26 PHP
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
jquery自定义表格样式
2015/11/23 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
Python中除法使用的注意事项
2014/08/21 Python
Python set常用操作函数集锦
2017/11/15 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
Django实现学生管理系统
2019/02/26 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python中JWT用户认证的实现
2020/05/18 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
学生思想表现的评语
2014/01/30 职场文书
单位委托书范本
2014/04/04 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL
详解Vue router路由
2021/11/20 Vue.js
Python中npy和mat文件的保存与读取
2022/04/24 Python