使用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使用jQuery选择器操作DOM
Feb 13 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
linux 下以二进制的方式安装 nodejs
Feb 12 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和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
jquery 获取表单元素里面的值示例代码
2013/07/28 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
查看django版本的方法分享
2018/05/14 Python
Python高级用法总结
2018/05/26 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
学习python需要有编程基础吗
2020/06/02 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
小学一年级评语大全
2014/04/22 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
Python基本数据类型之字符串str
2021/07/21 Python