详解nodejs微信公众号开发——2.自动回复

2020-06-17 07:00:48易采站长站整理

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
,处理推送消息一般分为五个步骤:

处理POST类型的控制逻辑,接收xml数据包;
解析数据包,获取数据包的消息类型或数据类型;
拼装自定义的消息;
包装成xml格式;
在5秒钟内返回消息。

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数据来看,数据虽然已经呈现键值对的形式,但是其值是数组的形式,需要进行扁平化处理: