上一篇文章:nodejs微信公众号开发(1)接入微信公众号,本篇文章将在此基础上实现简单的回复功能。

1. 接入代码的优化
之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了app.js文件里面,从项目开发的角度而言,不便于日后代码的维护,所以将这部分代码独立出来,按照koa的风格,写成一个中间件。
在根目录下新建wechat文件夹,新建generator.js文件,
var sha1 = require('sha1');
module.exports = function(opts){
return function *(next){
var token = opts.token;
var signature = this.query.signature;
var nonce = this.query.nonce;
var timestamp = this.query.timestamp;
var echostr = this.query.echostr;
var str = [token,timestamp,nonce].sort().join('');
var sha = sha1(str);
this.body = (sha === signature) ? echostr + '' : 'failed';
};
}
此时app.js的内容变成:
'use strict'
var Koa = require('koa');
var wechat = require('./wechat/generator');
var config = {
wechat:{
appID:'...',
appSecret:'...',
token:'...'
}
};
var app = new Koa();
app.use(wechat(config.wechat));
app.listen(8080);
console.log('Listening 8080...')
2. 获取access_token
access_token是开发程序与wexin公众平台交互的一把钥匙,调用绝大部分接口都需要用到access_token。
access_token的特点:
解决方案:
程序中采用构造函数的方式,在生成实例,完成初始化工作的的过程中,读取存储在config/wechat.txt文件中的票据,判断是否为空且是否过期,选择性的重新获取数字并且保存在原文件里面,关于获取access_token的官方文档介绍可见:获取access_token。
function Wechat(opts){ //构造函数,用以生成实例,完成初始化工作,读写票据
var that = this;
this.appID = opts.appID;
this.appSecret = opts.appSecret;
this.getAccessToken = opts.getAccessToken;
this.saveAccessToken = opts.saveAccessToken;
this.getAccessToken().then(function(data){
try{
data = JSON.parse(data);
}catch(e){
return that.updateAccessToken();
}
if(that.isvalidAccessToken(data)){
Promise.resolve(data);
}else{
return that.updateAccessToken();
}
}).then(function(data){
that.access_token = data.access_token;
that.expires_in = data.expires_in;
that.saveAccessToken(JSON.stringify(data));
});
}
我们在moudle.exports中实例化一个Wechat:
var wechat = new Wechat(opts);
这样确保了每次程序启动都会获取对access_token的有效性进行检验,并且每个一段时间会自动获取一个新的access_token。
3. 处理微信消息的步骤
无论是事件推送还是消息推送,微信服务器都是以post的方式发送请求,推送的数据类型不是json而是xml,处理推送消息一般分为五个步骤:
3.1 接收xml数据
通过raw-body模块可以获取http模块中的request对象,并且可以对数据进行拼装,从而拿到一个buffer的xml对象
var data = yield rawBody(this.req,{
length:this.length,
limit:'1mb',
encoding:this.charset
});
console.log('data:'+data);
3.2 解析xml数据
使用xml2js模块,将xml数据解析成对象格式
var content = yield util.parseXMLAsync(data);
util中的parseXMLAsync方法:
exports.parseXMLAsync = function(xml){
return new Promise(function(resolve,reject){
xml2js.parseString(xml,{trim:true},function(err,content){
err ? reject(err) : resolve(content);
})
});
}
3.3 格式化xml数据
从解析的xml数据来看,数据虽然已经呈现键值对的形式,但是其值是数组的形式,需要进行扁平化处理:
var message = util.formatMessage(content.xml);
其本质就是遍历数组中的值,因为在多图文的消息中存在嵌套的情况:
function formatMessage(result){
var message = {};
if(typeof result === 'object'){
var keys = Object.keys(result);
for(var i=0;i<keys.length;i++){
var key = keys[i];
var item = result[key];
if(!(item instanceof Array) || item.length === 0) continue;
if (item.length === 1){
var val = item[0];
if (typeof val === 'object') message[key] = formatMessage(val);
else message[key] = (val || '').trim();
}else{
message[key] = [];
for(var j=0,k=item.length;j<k;j++) message[key].push(formatMessage(item[j]));
}
}
}
return message;
}
3.4 判断消息类型并回复
这里针对subscribe事件,新关注后自动回复文本消息终于等到你,还好我没放弃
if(message.MsgType === 'event'){
if(message.Event === 'subscribe'){
var createTime = new Date().getTime();
that.status = 200;
that.type = 'application/xml';
that.body = '<xml>'+
'<ToUserName><![CDATA['+ message.FromUserName +']]></ToUserName>'+
'<FromUserName><![CDATA['+ message.ToUserName +']]></FromUserName>'+
'<CreateTime>'+createTime+'</CreateTime>'+
'<MsgType><![CDATA[text]]></MsgType>'+
'<Content><![CDATA[终于等到你,还好我没放弃]]></Content>'+
'</xml>'
return;
}
}
注:这里只是简单地实现一下自动回复功能,这种拼接字符串的方式还是很不方便的,后面会封装成接口。
使用手机微信扫描测试账号的二维码,即可关注,同时接收到测试公众号推送的消息!
啦啦,一个简单的关注回复就完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# nodejs微信自动回复
# nodejs
# 微信开发
# NodeJS实现微信公众号关注后自动回复功能
# 详解nodejs微信公众号开发——4.自动回复各种消息
# nodejs微信开发之自动回复的实现
# 数据包
# 我没
# 到你
# 自动回复
# 都能
# 上一
# 这部
# 自定义
# 多图
# 写在
# 很不
# 每隔
# 在此基础上
# 大家多多
# 键值
# 为空
# 啦啦
# 过程中
# 期为
# 日后
相关文章:
如何规划企业建站流程的关键步骤?
香港服务器部署网站为何提示未备案?
如何在万网开始建站?分步指南解析
海南网站制作公司有哪些,海口网是哪家的?
装修招标网站设计制作流程,装修招标流程?
香港服务器租用每月最低只需15元?
如何快速搭建高效WAP手机网站吸引移动用户?
香港服务器如何优化才能显著提升网站加载速度?
常州企业建站如何选择最佳模板?
如何通过IIS搭建网站并配置访问权限?
如何选择高效响应式自助建站源码系统?
html制作网站的步骤有哪些,iapp如何添加网页?
如何基于云服务器快速搭建个人网站?
定制建站价位费用解析与套餐推荐全攻略
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何在IIS中配置站点IP、端口及主机头?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站之星如何防范黑客攻击与数据泄露?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
建站之星北京办公室:智能建站系统与小程序生成方案解析
css网站制作参考文献有哪些,易聊怎么注册?
如何通过FTP服务器快速搭建网站?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何快速搭建高效可靠的建站解决方案?
如何在云主机上快速搭建多站点网站?
如何选择高性价比服务器搭建个人网站?
建站之星如何实现五合一智能建站与营销推广?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何选择适配移动端的WAP自助建站平台?
简单实现Android文件上传
制作企业网站建设方案,怎样建设一个公司网站?
建站之星如何配置系统实现高效建站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
建站主机服务器选购指南:轻量应用与VPS配置解析
购物网站制作公司有哪些,哪个购物网站比较好?
已有域名和空间,如何快速搭建网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
香港服务器租用费用高吗?如何避免常见误区?
如何用已有域名快速搭建网站?
如何通过商城免费建站系统源码自定义网站主题?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
Android自定义listview布局实现上拉加载下拉刷新功能
如何通过.red域名打造高辨识度品牌网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
*请认真填写需求信息,我们会在24小时内与您取得联系。