详解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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 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
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
php 数据结构之链表队列
2017/10/17 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
nodejs基础知识
2017/02/03 NodeJs
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python实现马耳可夫链算法实例分析
2015/05/20 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
苹果音乐订阅:Apple Music
2018/08/02 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
思想品德自我评价
2014/02/04 职场文书
服务承诺口号
2014/05/22 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
教师四风问题整改措施
2014/09/25 职场文书
2015年少先队活动总结
2015/03/25 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS