node.js 微信开发 提交菜单

wechatimg.png

前面连续分享2篇关于微信开发的文章. node.js 定时获取 access_token

使用 wechat 开发微信回调接口

今天分享 node.js 开发微信菜单

前提: 1.首先是切换到了开发者模式 2.微信管理后台已经授权自定义菜单,如下图例是没办法提交菜单的

cd.jpg

当你的微信从编辑模式切换到开发者模式时, 之前你手动定义的关键词回复, 手动创建的菜单全部失效.

微信自定义菜单

说白了非常简单.

微信自定义菜单就是一次 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"}

出自:node.js 微信开发 提交菜单



回到顶部