当前位置: 首页 > 工具软件 > koa-xml-body > 使用案例 >

node(koa)完成微信公众号自动回复功能

刘京
2023-12-01
  1. 首先需要在微信公众平台 - 基础设置 - 设置服务器地址

  2. 配置服务器地址时可能出现“参数错误,。。。。”的情况,可能是因为域名被拦截,不能使用。

    如果前端人员进行测试,可以使用ngrok,花生壳等工具实现内网穿透,将ip暴露出去,本人觉得花生壳相对稳定,推荐使用,但是需要花钱开通……

  3. 配置好服务器地址等信息,提交成功,点击启用完成服务器配置

  4. 接入接口 实际上是微信公众平台get请求填写的地址,并传signature, timestamp, nonce, echostr 四个参数,node接收到四个参数,需要对signature进行校验,并且原样返回echostr参数内容,即可接入完成。

// 简单接入,没有进行校验
router.get('/', async (ctx, next) => {
  	var query = ctx.request.query;  
    	var echostr = query.echostr ? query.echostr : '';
    	ctx.body = echostr
})
  1. 回复消息,分为关注后自动回复以及粉丝向公众号发消息时的回复等等情况

    实际上都是微信服务器post请求配置好的服务器地址,并传入xml格式的数据,格式如下:

// 关注后的xml格式
<xml>  
	<ToUserName>< ![CDATA[toUser] ]></ToUserName>  
	<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
	<CreateTime>1348831860</CreateTime>  
	<MsgType>< ![CDATA[event] ]></MsgType>  
	<Event>< ![CDATA['subscribe'] ]></Event>  
	<MsgId>1234567890123457</MsgId>  
</xml>
// 接受消息时的xml格式
<xml>  
	<ToUserName>< ![CDATA[toUser] ]></ToUserName>  
	<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
	<CreateTime>1348831860</CreateTime>  
	<MsgType>< ![CDATA[text] ]></MsgType>  
	<Content>< ![CDATA[粉丝发送的消息] ]></Content>  
	<MsgId>1234567890123456</MsgId>  
</xml>

后台接收xml格式的数据,完成相应操作即可。
但node本身并不能处理xml格式的文件,所以使用koa-xml-body来解析xml,在app.js中配置如下即可使用:

const xmlParser = require('koa-xml-body');
app.use(xmlParser());
  1. 解析xml之后,打印ctx.request.body即可打印出解析后的数据
{
	xml:{
		ToUserName:[' '],
		FromUserName: [' '],
		....
	}
}
  1. 通过对解析后的数据处理,判断完成回复消息
router.post('/', async (ctx, next) => {
	const xml = ctx.request.body;
	const createTime = Date.parse(new Date());
	const msgType = xml.xml.MsgType[0];
	const toUserName = xml.xml.ToUserName[0];
	const toFromName = xml.xml.FromUserName[0];
	const event = xml.xml.Event ? xml.xml.Event[0] : '';
	if(msgType == 'event' && event == 'subscribe'){ //关注后
		ctx.body = `<xml>
		 <ToUserName><![CDATA[${toFromName}]]></ToUserName>
		 <FromUserName><![CDATA[${toUserName}]]></FromUserName>
		 <CreateTime>${createTime}</CreateTime>
		 <MsgType><![CDATA[text]]></MsgType>
		 <Content><![CDATA[欢迎关注陈小皮公众号,下面请开始你的表演!]]></Content>
		 </xml>`;
	}else{//其他情况
		ctx.body = `<xml>
		 <ToUserName><![CDATA[${toFromName}]]></ToUserName>
		 <FromUserName><![CDATA[${toUserName}]]></FromUserName>
		 <CreateTime>${createTime}</CreateTime>
		 <MsgType><![CDATA[text]]></MsgType>
		 <Content><![CDATA[啊~啊~啊~你在发什么消息?]]></Content>
		 </xml>`;
	}	
});
 类似资料: