详解nodejs微信公众号开发——2.自动回复
上一篇文章:,本篇文章将在此基础上实现简单的回复功能。 1. 接入代码的优化之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了 在根目录下新建 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'; }; } 此时 var wechat = require('./wechat/generator'); var config = { var app = new Koa(); 2. 获取access_token
解决方案:
程序中采用构造函数的方式,在生成实例,完成初始化工作的的过程中,读取存储在 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)); }); } 我们在 这样确保了每次程序启动都会获取对access_token的有效性进行检验,并且每个一段时间会自动获取一个新的access_token。 3. 处理微信消息的步骤无论是事件推送还是消息推送,微信服务器都是以post的方式发送请求,推送的数据类型不是
3.1 接收xml数据通过raw-body模块可以获取http模块中的request对象,并且可以对数据进行拼装,从而拿到一个buffer的xml对象 3.2 解析xml数据使用xml2js模块,将xml数据解析成对象格式 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数据来看,数据虽然已经呈现键值对的形式,但是其值是数组的形式,需要进行扁平化处理: 其本质就是遍历数组中的值,因为在多图文的消息中存在嵌套的情况: 3.4 判断消息类型并回复(编辑:ASP站长网) |