使用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入门详解(多篇文章结合)
Mar 07 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
发现的以前不知道的函数
2006/09/19 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
使用Scrapy爬取动态数据
2018/10/21 Python
python创造虚拟环境方法总结
2019/03/04 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
python中if嵌套命令实例讲解
2021/02/25 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
介绍一下linux的文件系统
2015/10/06 面试题
自荐信的禁忌和要点
2013/10/15 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
国家助学贷款承诺书
2015/04/30 职场文书