详解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修复ipa处理过的png图片
Feb 17 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
简单的自定义php模板引擎
2016/08/26 PHP
PHP基本语法实例总结
2016/09/09 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
php unlink()函数使用教程
2018/07/12 PHP
PHP创建XML接口示例
2019/07/04 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
如何基于python生成list的所有的子集
2019/11/11 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
python将数组n等分的实例
2019/12/02 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
成功的餐厅经营创业计划书
2014/01/15 职场文书
学生感冒英文请假条
2014/02/04 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
文明寝室标语
2014/06/13 职场文书
社团活动总结书
2014/06/27 职场文书
2014年公司工作总结
2014/11/22 职场文书
永不妥协观后感
2015/06/10 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书