手机版

nodejs微信微信官方账号开发——2详解 自动回复

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

上篇:nodejs微信微信官方账号开发(1)访问微信微信官方账号,本文将在此基础上实现简单回复功能。

1.访问代码的优化

之前我们简单粗暴的访问微信微信官方账号,访问的代码直接写在app.js文件里。从项目开发的角度来看,以后维护代码不方便,所以这部分代码被分离出来,按照koa风格写成中间件。

在根目录下新建一个微信文件夹和一个新的generator.js文件。

var sha1=required(' sha1 ');module . exports=function(opts){ return function *(next){ var token=opts . token;var signature=this . query . signature;var nonce=this . query . nonce;var时间戳=this . query . timestamp;var echostr=this . query . echostr;var str=[令牌、时间戳、随机数]。排序()。join(' ');var sha=sha1(str);this.body=(sha===签名)?echostr“:”失败;};}此时app.js的内容变成:

使用严格的' var Koa=require(' Koa ');var微信=require('。/微信/生成器’);var config={微信: { appid : }.appSecret: '.令牌: '.' }};var app=new Koa();app.use(微信(config .微信));app . listen(8080);Console.log('监听8080.') 2.获取访问令牌

Access_token是开发程序与wexin公共平台交互的关键。需要access_token来调用大多数接口。

access_token的特点:

有效期为2小时(7200s),自动过期,需要重新获取;只要更新了access_token,上一个access_token就会自动过期;解决方案:

系统每2小时自动获取一次access_token的值,以确保access_token始终有效。为了方便频繁调用,access_token存储在一个唯一的地方(数据库、文件等)。),所有子系统都可以访问。在程序中,构造器用于在生成实例和完成初始化的过程中读取存储在config/微信. txt文件中的票据,判断是否为空和过期,并有选择地检索号码并保存在原始文件中。关于获取access_token的官方文档可以看如下:获取access_token。

函数chat(opts){//构造函数用于生成实例,完成初始化,读写bill var thatthis . appid=opts . appid;this . appsecret=opts . appsecret;this . GetAccessToken=opts . GetAccessToken;this . SaveAccessToken=opts . SaveAccessToken;this.getAccessToken()。然后(function(data){ try { data=JSON . parse(data));} catch(e){ return . updateaccesstoken();} if(that.isvalidAccessToken(数据)){ Promise.resolve(数据);} else { return . updateaccesstoken();} }).然后(函数(数据){ that . access _ token=data . access _ token;that . expires _ in=data . expires _ in;that . SaveAccessToken(JSON . stringify(data));});}我们在moudle.exports中实例化了一个微信:

var微信=新微信(opts);这确保了每次程序启动时都会检查access_token的有效性,并且每次都会自动获取一个新的access_token。

3.处理微信消息的步骤

无论是事件推送还是消息推送,微信服务器都是以post的形式发送请求,推送的数据类型不是json而是xml。推送消息处理一般分为五个步骤:

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

http模块中的请求对象可以通过raw-body模块获取,数据可以组装成一个缓冲区的xml对象

var data=yield rawBody(this.req,{ length:this.length,limit:'1mb ',encoding : this . charset });console.log('data: '数据);

3.2解析xml数据

使用xml2js模块将xml数据解析为对象格式

var含量=产量util。parsexmlasync(数据);跑龙套中的parseXMLAsync方法:出口。parsexmlasync=函数(XML){返回新的Promise(函数(解析,拒绝){ xml2js.parseString(xml,{trim:true},函数(err,content){ err?拒绝(错误):解析(内容);}) });}

3.3 格式化可扩展标记语言数据

从解析的可扩展标记语言数据来看,数据虽然已经呈现键值对的形式,但是其值是数组的形式,需要进行扁平化处理:

var message=util。格式化消息(内容。XML);其本质就是遍历数组中的值,因为在多图文的消息中存在嵌套的情况:

函数formatMessage(结果){ var message={ };if(结果类型==' object '){ var key=object。按键(结果);for(var I=0;ikeys . lengthi){ var key=keys[I];var item=result[key];if(!(数组的项实例)| |项。长度===0)继续;if(项目。length===1){ var val=item[0];if(val的类型==' object ')消息[key]=格式化消息(val);else message[key]=(val || ' ').trim();} else { message[key]=[];for(var j=0,k=item.lengthJKj)消息[密钥]。推送(格式消息(项[j]);} } }返回消息;}

3.4 判断消息类型并回复

这里针对订阅事件,新关注后自动回复文本消息终于等到你,还好我没放弃

如果(消息MsgType==='event'){ if(消息。事件==='订阅){ var createTime=new Date().getTime();那.状态=200那。类型=“应用程序/XML”;that.body='xml' 'ToUserName![CDATA['消息.来自用户名']]/Tousername ' '来自用户名![CDATA['消息.用户名']]/来自用户名' ' CreateTime ' ' CreateTime/' CreateTime ' ' MsgType![CData[文本]]/MsgType“”内容![CDATA[终于等到你,还好我没放弃]]/内容' '/xml '返回;}}注:这里只是简单地实现一下自动回复功能,这种拼接字符串的方式还是很不方便的,后面会封装成接口。

使用手机微信扫描测试账号的二维码,即可关注,同时接收到测试公众号推送的消息!

啦啦,一个简单的关注回复就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:nodejs微信微信官方账号开发——2详解 自动回复是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。