使用NodeJs 开发微信公众号(三)微信事件交互实例


Posted in NodeJs onMarch 02, 2016

微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成。比如说自定义菜单功能,必须通过发送post请求的方式生成。本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么样与微信交互的。这些功能的入口就是你在测试公众号里面填写的URL(以下用/login/wechat代替)。

事件交互

扫码关注微信公众号后,微信会调用你的接口/login/wechat,并且附带一段xml信息,首先你需要获取一些签名,通过加密、排序比对是否与你填写的TOKEN一致,如果一致则进行xml的解析。node解析xml时必须先引用模块。所以,先引入xml解析模块

//xml解析模块
var XMLJS = require('xml2js');
//解析,将xml解析为json
var parser = new XMLJS.Parser();
//重组,将json重组为xml
var builder = new XMLJS.Builder();

通过req的监听data,来获取微信发送过来的xml包。以下是某个新用户关注公众号后微信向你的后台接口(上一篇中提到的/yourapi)发送的xml包数据,经过解析后,他的结构如下:

使用NodeJs 开发微信公众号(三)微信事件交互实例

tousername:收信人【此处为公众微信号】

fromusername:发信人【此处为用户openid】

createTime:发送时间

msgtype:消息类型【event(响应事件)、text(推送消息)、image(推送图文消息)等】

event:消息名称【此处为关注】

eventkey:自定义的key,在设置网页时可以自定义后文中会讲到

以上就是当一个用户关注后微信往你接口发送的数据包。上面对我们有用的是fromusername,即关注人的openid,我们在关注时获取了用户的该openid后可以通过微信提供的特定接口(https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN)获取用户的头像,性别,昵称等信息,为你的app建立一个可靠的资料库。

代码实现

//微信事件推送的入口
app.post('/yourapi', function(req, res, next) {
//获取参数
var query = req.query; 
//签名
var signature = query.signature; 
//输出的字符,你填写的TOKEN 
var echostr = query.echostr; 
//时间戳
var timestamp = query['timestamp']; 
//随机字符串
var nonce = query.nonce; 
var oriArray = new Array(); 
oriArray[] = nonce; 
oriArray[] = timestamp; 
oriArray[] = appConfig.token;
//排序参数
oriArray.sort(); 
var original = oriArray[]+oriArray[]+oriArray[]; 
//加密
var scyptoString = sha(original); 
//判断是否与你填写TOKEN相等
if (signature == scyptoString) {
//获取xml数据
req.on("data", function(data) {
//将xml解析
parser.parseString(data.toString(), function(err, result) {
var body = result.xml;
var messageType = body.MsgType[];
//用户点击菜单响应事件
if(messageType === 'event') {
var eventName = body.Event[];
(EventFunction[eventName]||function(){})(body, req, res);
//自动回复消息
}else if(messageType === 'text') {
EventFunction.responseNews(body, res);
//第一次填写URL时确认接口是否有效
}else {
res.send(echostr);
}
});
});
} else { 
//认证失败,非法操作
res.send("Bad Token!"); 
}
});
//微信客户端各类回调用接口
var EventFunction = {
//关注
subscribe: function(result, req, res) {
//存入openid 通过微信的接口获取用户的信息同时存入数据库。
},
//注销
unsubscribe: function(openid, req, res) {
//删除对应id
},
//打开某个网页
VIEW: function() {
//根据需求,处理不同的业务
},
//自动回复
responseNews: function(body, res) {
//组装微信需要的json
var xml = {xml: {
ToUserName: body.FromUserName,
FromUserName: body.ToUserName,
CreateTime: + new Date(),
MsgType: 'text',
Content: '编辑@+您想说的话,我们可以收到'
}};
var reciviMessage = body.Content[]
if(/^\@.*/.test(reciviMessage)) {
xml.xml.Content = '已经收到您的建议,会及时处理!'
}<br>//将json转为xml
xml = builder.buildObject(xml);<br>//发送给微信
res.send(xml);
}
}

此处,适合采用JS设计模式中的策略模式,在subscribe方法里面写上你自己的业务,通过发送带openid参数的请求,可以在用户关注微信号的时候将其几本资料存入数据库,并且建立会话。这样在用户接下来打开你的网页的时候就无需再次认证,只需要比对openid然后查询数据库就行了。

NodeJs 相关文章推荐
nodejs中使用monk访问mongodb
Jul 06 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
nodejs之koa2请求示例(GET,POST)
Aug 07 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 #NodeJs
nodejs修复ipa处理过的png图片
Feb 17 #NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 #NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 #NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 #NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 #NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 #NodeJs
You might like
PHP实现活动人选抽奖功能
2017/04/19 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
python多进程共享变量
2016/04/06 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
杭州时比特电子有限公司SQL
2013/08/22 面试题
主办会计岗位职责
2014/03/13 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
同学聚会策划方案
2014/06/06 职场文书
关于环保的宣传稿
2015/07/23 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
Python装饰器的练习题
2021/11/23 Python