1. 程式人生 > >node(koa)完成微信公眾號自動回覆功能

node(koa)完成微信公眾號自動回覆功能

  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>`;
	}	
});