一、写在前面的话

  上一篇文章中,我们使用 Node.js 成功的实现了access_token 的获取、存储以及更新,这篇文章我们来实现微信的自定义菜单功能。

二、自定义微信菜单

1.微信文档步骤

  在开始码代码之前,我们依然是先理清实现的思路,再开始编写实现代码。打开 微信帮助文档 ,点击左侧菜单中的 自定义菜单,点击其子菜单 自定义菜单创建接口,如图:

  由上图我们总结以下步骤:

  1. 自定义微信请求是以 https POST请求方式
  2. 数据是以 JSON 格式传入

2.实现 https POST请求

  紧接着上一篇文章的代码,源码地址: https://github.com/SilenceHVK/wechatByNode ,克隆到本地文件中

git clone git@github.com:SilenceHVK/wechatByNode.git

  打开 wechat 文件夹中的 wechat.js 文件,并在 WeChat 构造函数内部添加 requestPost 方法

//用于处理 https Post请求方法
this.requestPost = function(url,data){
return new Promise(function(resolve,reject){
//解析 url 地址
var urlData = urltil.parse(url);
//设置 https.request options 传入的参数对象
var options={
//目标主机地址
hostname: urlData.hostname,
//目标地址
path: urlData.path,
//请求方法
method: 'POST',
//头部协议
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(data,'utf-8')
}
};
var req = https.request(options,function(res){
var buffer = [],result = '';
//用于监听 data 事件 接收数据
res.on('data',function(data){
buffer.push(data);
});
//用于监听 end 事件 完成数据的接收
res.on('end',function(){
result = Buffer.concat(buffer).toString('utf-8');
resolve(result);
})
})
//监听错误事件
.on('error',function(err){
console.log(err);
reject(err);
});
//传入数据
req.write(data);
req.end();
});
}

  在上一篇文章中,我们使用到了 https 的 get 方法发。实际上 https 用于请求的底层方法则是 request 方法,而 get 方法 只是对它的一个封装,但是 Node.js 却没有对 post 进行封装,直到现在 Node.js 8.0 依然没有。具体详情请看 Node.js 中文文档。

提示:

   npm 提供了很多用于请求的工具包,比如 request ( 安装命令 npm install request ) 等。这里我只是用系统包去做请求处理。

3.配置创建微信菜单的连接

  打开 项目文件中的 config.json 文件,在 apiURL 中添加配置:

"createMenu":"%scgi-bin/menu/create?access_token=%s"

4.微信菜单 JSON 格式

  完成了上面的工作后,我们就可以开始微信菜单的创建了。按照微信帮助中菜单示例格式,我们自己定义一个 JSON 格式:

{
"button":[
{
"type":"view",
"name":"hvkcoder",
"url":"http://www.cnblogs.com/hvkcode/"
},
{
"type":"click",
"name":"今日推荐",
"key":"today_recommend"
},
{
"name":"小工具",
"sub_button":[{
"type": "scancode_waitmsg",
"name": "扫一扫",
"key": "scancode"
},{
"type": "pic_sysphoto",
"name": "系统拍照发图",
"key": "take_photo"
},{
"type": "location_select",
"name": "发送位置",
"key": "send_location"
}]
}
]
}

并将它存放在 wechat 文件夹中的 menus.json 文件,如图:

5.请求创建菜单API

  将 menus.json 文件在 wechat.js 文件中引用。这块呢,我就直接在微信接入的方法中去做菜单的创建:

var that = this;
this.getAccessToken().then(function(data){
//格式化请求连接
var url = util.format(that.apiURL.createMenu,that.apiDomain,data);
//使用 Post 请求创建微信菜单
that.requestPost(url,JSON.stringify(menus)).then(function(data){
//将结果打印
console.log(data);
});
});

  如果你目前用的是订阅号的话,那么不好意思朋友,你在运行结果就会看到:

  错误意思是:api未经授权。腾讯本着“没钱,玩你麻痹”的态度,指明订阅号的朋友是不能通过 api 请求去自定义菜单的。

  但是不要伤心,因为腾讯依然很贴心的为我们准备测试公众号,再次打开 微信帮助文档,点击右侧的 开始开发,点击其子菜单 接口测试号申请,如图:

  使用手机端微信,扫描二维码后,我们就得到了一个测试公众号。

  其他的信息我们都不需要去管,主要去修改 appID 和 appsecret,并将 access_token.json 所保存的数据更改为:

{"access_token":"","expires_time":0}

随后重新运行就可以了,是不是很简单呢。

  扫面一下测试公众号二维码

  每次只需要对 menus.json 文件进行更改,重新请求。就能够实现菜单的更改效果了。

  文章源代码:https://github.com/SilenceHVK/wechatByNode 。对文章有不正确之处,请给予纠正。github源代码请顺手给个 Star,最后感谢您的阅读。

文章目录:

        1.Node.js 接入微信公众平台开发

        2.Node.js access_token的获取、存储及更新

        3.Node.js 自定义微信菜单

        4.Node.js 微信消息管理

3.Node.js 自定义微信菜单的更多相关文章

  1. 1.Node.js 接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...

  2. 基于Node.js的微信JS-SDK后端接口实现

    做了一个网站,放到线上,用微信打开,点击分享,可是分享后发给朋友的链接卡片是微信默认自带的,如下: 这标题,描述以及图片是默认自带的,丑不说,分享给别人还以为是盗号网站呢,而接入微信的JSSDK后,分 ...

  3. Node.js自定义对象事件监听与发射

    一.Node.js是以事件驱动的,那我们自定义的一些js对象就需要能监听事件以及发射事件.在Node.js中事件使用一个EventEmitter对象发出,该对象在events模块中.它应该是使用观察者 ...

  4. Node.js 自定义模块

    Node.js内置多个模块,也可以使用第三方模块,今天学习一下如何使用自己定义的模块 在同级目录下定义两个js文件 第一个:custom1.js "use strict"; fun ...

  5. CentOS 7.3 下部署基于 Node.js的微信小程序商城

    本文档为微信小程序商城NideShop项目的安装部署教程,欢迎star NideShop商城api服务:https://github.com/tumobi/nideshop NideShop微信小程序 ...

  6. JAVA微信公众号网页开发——生成自定义微信菜单(携带参数)

    官网接口地址:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.ht ...

  7. Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城

    转载于这篇文章 关于pm2看这篇文章 最近在研究小程序,申请了域名之后,再一次来配置环境,根据作者的步骤基本上完成了网站的架构,但由于环境路径等不同,配置上会有所不同,因此记录下来. 1.更新系统和安 ...

  8. 学习node js 之微信公众帐号接口开发 准备工作

    绪:因工作须要,近期開始学习Node js,之前隐隐约约听到过node js 但没有实际见到过,仅仅好google了:至于什么是node js,能做些什么,有多么好.或者有哪些弊端我这里就不多说了,由 ...

  9. 初涉node.js做微信测试公众号一路填坑顺便发现个有趣的其他漏洞

    [微信测试公众号] 半年前耍着玩搭起来的“微信简历”,是LAMP版的,很皮毛. 微信的官方文档在这 http://mp.weixin.qq.com/wiki/index.php 1.获取access ...

随机推荐

  1. ssh相关命令

    ssh命令 ssh命令是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器. 语法ssh(选项)(参数)选项 -1:强制使用ssh协议版本1: -2:强制使用ssh协 ...

  2. 【Tomcat源码学习】-5.请求处理

    前四章节,主要对Tomcat启动过程中,容器加载.应用加载.连接器初始化进行了相关的原理和代码流程进行了学习.接下来开始进行接受网络请求后的相关处理学习.   一.整体流程      基于上一节图示进 ...

  3. java上转型和下转型(对象的多态性)

    /*上转型和下转型(对象的多态性) *上转型:是子类对象由父类引用,格式:parent p=new son *也就是说,想要上转型的前提必须是有继承关系的两个类. *在调用方法的时候,上转型对象只能调 ...

  4. C++ STL学习之容器set和multiset (补充材料)

    一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...

  5. 详解常用的gulp命令

    gulp.js是一款自动化构建工具,我们经常使用它在开发过程自动执行常见的任务.gulp.js 是基于 Node.js 构建的,利用 Node.js,可以快速构建项目. 由于gulp使用基于node, ...

  6. 篇5 python自动化测试应用-Selenium环境篇

    篇5                            python自动化测试应用-Selenium环境篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),从本篇开始我将开始 ...

  7. 百度开源上传组件WebUploader的formData动态传值技巧

    基于Web页面的文件上传一直是互联网应用开发中避免不了的,从asp时代的AspUpload组件.到asp无组件上传,到.Net时代的FileUpload,再到HTML5时代的各种基于jQuery的上传 ...

  8. WebStorm设置左侧菜单栏背景和字体设置

    WebStorm左侧菜单栏 webstorm是一款前端IDE利器,个人感觉黑色的背景比较炫酷,刚开始从网上下载的主题只能修改编辑窗口的背景色,经过查询资料终于把左边菜单栏的背景色也修改了. 第一步:点 ...

  9. Android学习资料整理

    1.官方网站 http://developer.android.com/index.html http://android-developers.blogspot.com/ 2.Android Des ...

  10. React Native技术做的一个项目“微笑阅读”

    最近用React Native做了一个APP应用,有点心得: React Native确实比Hybrid应用渲染快,响应快,用户体验更好: React Native比原生简单多了,会Js就可以了,开发 ...