精华 【Node.js 微信公众号实战】3.Node.js 自定义微信菜单
发布于 9 年前 作者 SilenceHVK 18882 次浏览 最后一次编辑是 8 年前 来自 分享

【Node.js 微信公众号实战】1.Node.js 接入微信公众平台开发 【Node.js 微信公众号实战】2.Node.js access_token的获取、存储及更新 【Node.js 微信公众号实战】3.Node.js 自定义微信菜单 【Node.js 微信公众号实战】4.Node.js 微信消息管理

一、写在前面的话

上一篇文章中,我们使用 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 unauthorized hint

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

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

进入微信公众帐号测试号申请系统

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

测试公众号

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

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

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

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

测试公众号二维码位置

测试公众号 二维码

最终效果

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

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

19 回复

既然没有人给评论,那我就自己评论一下。继续努力,贵在坚持。

666,持续关注

加油,如果有消息加解密就更好了!

@leoskey 在下一篇我会写到

给你点个赞→_→

加油!支持一下

楼主用的订阅号还是服务号?为什么我创建menu没有权限

@yycc179 没有认真看文章吧,订阅号是不能用API去创建菜单的,我里面用的是测试号

个人订阅号真的很坑爹,只能用一些已经写好的服务.各种api接口不开放,真的是"没钱,玩你麻痹". 而且现在还不让转到认证订阅号

@SilenceHVK <br/><br/><a class="form" href="https://github.com/shinygang/Vue-cnodejs">I‘m webapp-cnodejs-vue</a>

@SilenceHVK <br/><br/><a class="form" href="https://github.com/shinygang/Vue-cnodejs">I‘m webapp-cnodejs-vue</a>

@SilenceHVK <br/><br/><a class="form" href="https://github.com/shinygang/Vue-cnodejs">I‘m webapp-cnodejs-vue</a>

一年300块。割肉就要慢慢割

这个收藏吧,现在接触了NodeJS,相信以后会用得着。。。

果断赞!非常不错的教程,我跟完了。

@SilenceHVK js接口安全域名 楼主是随便写一个的么?

@frank320 使用的是花生壳内网映射提供的域名

加油,要是有微信登录相关的就更好了。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /