详解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 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
nodejs加密Crypto的实例代码
Jul 07 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
nodejs实现UDP组播示例方法
Nov 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删除数组中特定元素的两种方法
2013/07/02 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
AngularJS快速入门
2015/04/02 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
python读取Android permission文件
2013/11/01 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
Django中提示消息messages的设置方式
2019/11/15 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
用python写爬虫简单吗
2020/07/28 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
python中字符串的编码与解码详析
2020/12/03 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
销售人员职业生涯规划范文
2014/03/01 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
公司转让协议书
2016/03/19 职场文书
党员公开承诺书2016
2016/03/24 职场文书