使用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 21 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 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
收音机的保养
2021/03/01 无线电
php使用websocket示例详解
2014/03/12 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
layui分页效果实现代码
2017/05/19 Javascript
vue cli 全面解析
2018/02/28 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
python读写二进制文件的方法
2015/05/09 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Python控制Firefox方法总结
2019/06/03 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
家庭教育先进个人事迹材料
2014/01/24 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
社区志愿者活动方案
2014/08/18 职场文书
失恋33天观后感
2015/06/11 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang