详解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实现黑名单中间件设计
Jun 17 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
nodejs爬虫抓取数据之编码问题
Jul 03 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 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
自己动手做一个SQL解释器
2006/10/09 PHP
怎样在php中使用PDF文档功能
2006/10/09 PHP
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
PHP可变函数的使用详解
2013/06/14 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
分享一个常用的javascript静态类
2014/12/31 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
JS随机密码生成算法
2019/09/23 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
python中set常用操作汇总
2016/06/30 Python
Python Flask基础教程示例代码
2018/02/07 Python
Python 将pdf转成图片的方法
2018/04/23 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
大学生个人总结的自我评价
2013/10/05 职场文书
夜不归宿检讨书
2014/02/25 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
学生会主席演讲稿
2014/04/25 职场文书
最新离婚协议书范本
2014/08/19 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
python获取对象信息的实例详解
2021/07/07 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android