使用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(三)--- Node.js模块
May 25 NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
Nodejs调用Dll模块的方法
Sep 17 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 显示指定路径下的图片
2009/10/29 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python程序中设置HTTP代理
2016/11/06 Python
Python callable()函数用法实例分析
2018/03/17 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
python sort、sort_index方法代码实例
2019/03/28 Python
python 类之间的参数传递方式
2019/12/20 Python
Python模块的制作方法实例分析
2019/12/21 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
无故旷工检讨书
2014/01/26 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server
volatile保证可见性及重排序方法
2022/08/05 Java/Android