node.js 微信开发 提交菜单
文章目录
前面连续分享2篇关于微信开发的文章.
node.js 定时获取 access_token
今天分享 node.js 开发微信菜单
前提:
1.首先是切换到了开发者模式
2.微信管理后台已经授权自定义菜单,如下图例是没办法提交菜单的
当你的微信从编辑模式切换到开发者模式时,
之前你手动定义的关键词回复,
手动创建的菜单全部失效.
微信自定义菜单
说白了非常简单.
微信自定义菜单就是一次 POST 请求.
请求接口:
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
我们看到有个必填参数 ACCESS_TOKEN
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新
如何解决 access_token 定时获取,点击此链接 node.js 定时获取 access_token
通过上面博文的实现方式,我们每小时获取一次 access_token ,拿到 access_token 再去 POST 请求上面url ,创建自定义菜单.
如何定义菜单
var menus = {
"button": [
{
"type": "view",
"name": "一介布衣",
"url": "http://yijiebuyi.com"
},
{
"type": "view",
"name": "node.js",
"url": "http://yijiebuyi.com/category/nodejs.html"
},
{
"name": "数据库",
"sub_button": [
{
"type": "view",
"name": "mongodb",
"url": "http://yijiebuyi.com/category/mongodb.html"
},
{
"type": "view",
"name": "levelDB",
"url": "http://yijiebuyi.com/category/leveldb.html"
}]
}
]
};
自定义菜单创建,根目录不超出3个节点 一介布衣, node.js ,数据库
数据库根节点可以创建二级菜单 mongodb , levelDB
每个菜单节点类型 可以是 view (链接),也可以是 click (模拟点击)
//链接模式,点击进入新页面
var menus = {
"button": [
{
"type": "view",
"name": "一介布衣",
"url": "http://yijiebuyi.com"
}
]
}
上面定义中包括3个参数: type ,name ,url
//点击模式,点击触发CLICK事件
var menus = {
"button": [
{
"type": "click",
"name": "一介布衣",
"key": "yijiebuyi"
}
]
}
上面定义中包括3个参数: type ,name ,key
当 type=click 时, url 参数名变成 key .
key 对应的值是关键词 "yijiebuyi"
实现效果:
当点击此菜单时,其实微信后台发起了一个 CLICK 事件,
在微信的回调接口中我们可以捕获 CLICK 事件.
如何生成菜单
拿到 access_token
拼接url: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
header 定义: 'Content-Type': 'application/x-www-form-urlencoded'
菜单参数: 把 json 格式菜单序列化成字符串
我们使用 request 包来发起 post 请求.
首先安装 request
npm install request --save
完整代码:
'use strict';
const request = require('request');
var getToken=require('./wechat_token');
var menus = {
"button": [
{
"type": "view",
"name": "一介布衣",
"url": "http://yijiebuyi.com"
},
{
"type": "view",
"name": "node.js",
"url": "http://yijiebuyi.com/category/nodejs.html"
},
{
"name": "数据库",
"sub_button": [
{
"type": "view",
"name": "mongodb",
"url": "http://yijiebuyi.com/category/mongodb.html"
},
{
"type": "view",
"name": "levelDB",
"url": "http://yijiebuyi.com/category/leveldb.html"
}]
}
]
};
function createMenu() {
getToken(function(token){
if(token){
var options = {
url: 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' + token,
form: JSON.stringify(menus),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
request.post(options, function (err, res, body) {
if (err) {
console.log(err)
}else {
console.log(body);
}
});
}
})
}
module.exports = createMenu;
上面代码中 getToken 方法是引用了另外一个文件,是定时获取 access_token 的方法,详见前2篇博文.node.js 定时获取 access_token
如何请求菜单
我们上面的 module.exports 直接指向了菜单请求方法 createMenu;
所以,只要我们程序启动,引用上面的类,即可自动 post 请求到微信服务器.
var postMenu=require('../lib/wechat_menu');
postMenu();
post 请求后返回如下内容说明请求创建菜单成功:
{"errcode":0,"errmsg":"ok"}