使用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中实现sleep功能实例
Mar 24 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 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防注入代码
2010/04/07 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
浅谈php的优缺点
2015/07/14 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
浅谈PHP封装CURL
2019/03/06 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
Js动态创建div
2008/09/25 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
Python可以实现栈的结构吗
2020/05/27 Python
德国购买健身器材:AsVIVA
2017/08/09 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
节水倡议书范文
2014/04/15 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
golang 接口嵌套实现复用的操作
2021/04/29 Golang
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL