node(koa)完成微信公眾號自動回覆功能
阿新 • • 發佈:2019-01-28
-
首先需要在微信公眾平臺 - 基礎設定 - 設定伺服器地址
-
配置伺服器地址時可能出現“引數錯誤,。。。。”的情況,可能是因為域名被攔截,不能使用。
如果前端人員進行測試,可以使用ngrok,花生殼等工具實現內網穿透,將ip暴露出去,本人覺得花生殼相對穩定,推薦使用,但是需要花錢開通……
-
配置好伺服器地址等資訊,提交成功,點選啟用完成伺服器配置
-
接入介面 實際上是微信公眾平臺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
})
-
回覆訊息,分為關注後自動回覆以及粉絲向公眾號發訊息時的回覆等等情況
實際上都是微信伺服器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());
- 解析xml之後,列印ctx.request.body即可打印出解析後的資料
{
xml:{
ToUserName:[' '],
FromUserName: [' '],
....
}
}
- 通過對解析後的資料處理,判斷完成回覆訊息
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>`; } });