时间:2021-05-25
上一篇文章: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; }}注:这里只是简单地实现一下自动回复功能,这种拼接字符串的方式还是很不方便的,后面会封装成接口。
使用手机微信扫描测试账号的二维码,即可关注,同时接收到测试公众号推送的消息!
啦啦,一个简单的关注回复就完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
关于微信公众号如何设置自动回复蓝色字体链接y一、微信自动回复1、首先建立一个微信公众号登录2、点击自动回复3、在自动回复里输入代码名称,然后下拉保存,如图所示4
上一篇文章:nodejs微信公众号开发(2)自动回复,实现了简单的关注回复。采用拼接字符串的形式,并不是很方便,这里我们将其封装承接口。1.ejs模板引擎不使用
微信公众号输入关键字会自动回复,想要回复视频,该怎么设置呢?下面我们就来看看详细的教程。1、进入微信公众平台,然后登录自己的公众号。2、在左侧的菜单栏中,点击&
微信怎么设置自动回复?其实,微信自动回复设置就是和微信公众平台怎么设置自动回复一样的,然后有粉丝给您发送微信消息时,微信就会自动回复您设置的文字/语言/图片/录
Nginx反向代理一个80端口下配置多个微信项目详解 我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑。但是微信公众号接口只支