微信公眾號中的事件有訂閱事件/掃碼事件/點擊事件/跳轉連結事件等等,具體可以查閱文件。
這裡來實作訂閱事件,其他的事件的實作過程也都類似。
當有人訂閱了公眾號碼後,微信伺服器會向我們的伺服器推送一個事件,這個事件是XML格式的封包。
可以理解為當微信向我們的伺服器推播訊息時,訊息就會先走到這裡。
/routes/index.js加入:
router.post('/', index_middleware.post(config.wechat));
就是我們該如何處理微信伺服器給我們的伺服器的post請求。
大致過程是先把微信伺服器發來的資料包接收到,然後解析這個XML資料包,然後根據接收來的數據,在我們伺服器上進行邏輯處理後形成一個XML格式的回覆訊息。
/wechat/index_middleware.js加入:
exports.post = 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);if (sha !== signature) {this.body = 'wrong';return false; }var data = yield getRawBody(this.req, { length: this.length, limit: '1mb', encoding: this.charset });var message = yield util.parseXMLAsync(data);var xml = yield autoReply(message.xml, wechat); console.log(message); console.log(xml);this.status = 200;this.type = 'application/xml';this.body = xml; }; };
這裡的data就是我們接收到的資料包,使用了raw-body這個元件。同時使用了util這個工具函數和autoReply這個自訂的函數。
因此在/wechat/index_middleware.js中需要加入以下程式碼:
var getRawBody = require('raw-body');var util = require('./util');var autoReply = require('./autoReply');
/wechat/util.js:
var fs = require('fs');var xml2js = require('xml2js'); exports.parseXMLAsync = function(xml) {return new Promise(function(resolve, reject) { xml2js.parseString(xml, { trim: true, explicitArray: false}, function(err, content) {if (err) { reject(err); } resolve(content); }); }); };
這裡用到了xml2js這個元件。
/wechat/autoReply.js:
var createXML = require('./createXML');function autoReply(message, wechat) {if (message.MsgType === 'event') {if (message.Event === 'subscribe') {if (message.EventKey) { console.log('扫码进入'); }var now = new Date().getTime();return Promise.resolve(createXML({ ToUserName: message.FromUserName, FromUserName: message.ToUserName, MsgType: 'text', Content: 'Hello!!'})); }else if (message.Event === 'unsubscribe') { console.log('取关');return Promise.resolve(''); } } }
這裡只實現了關注和取關的事件,同時用到了createXML函數,它的作用是將資料封裝成xml格式:
/wechat/createXML.js:
function createXML(messageObj) {var { ToUserName, FromUserName, MsgType = 'text'} = messageObj;var CreateTime = new Date().getTime();var header = `<xml> <ToUserName><![CDATA[${ToUserName}]]></ToUserName> <FromUserName><![CDATA[${FromUserName}]]></FromUserName> <CreateTime>${CreateTime}</CreateTime> <MsgType><![CDATA[${MsgType}]]></MsgType>`;var content = '';switch(MsgType) {case 'text':var { Content } = messageObj; content = `<Content><![CDATA[${Content}]]></Content> </xml>`;break;case 'image':var { MediaId } = messageObj; content = `<Image> <MediaId><![CDATA[${MediaId}]]></MediaId> </Image> </xml>`;break;case 'voice':var { MediaId } = messageObj; content = `<Voice> <MediaId><![CDATA[${MediaId}]]></MediaId> </Voice> </xml>`;break;case 'video':var { MediaId, Title, Description } = messageObj; content = `<Video> <MediaId><![CDATA[${MediaId}]]></MediaId> <Title><![CDATA[${Title}]]></Title> <Description><![CDATA[${Description}]]></Description> </Video> </xml>`;break;case 'music':var { Title, Description, MusicUrl, HQMusicUrl, ThumbMediaId } = messageObj; content = `<Music> <Title><![CDATA[${Title}]]></Title> <Description><![CDATA[${Description}]]></Description> <MusicUrl><![CDATA[${MusicUrl}]]></MusicUrl> <HQMusicUrl><![CDATA[${HQMusicUrl}]]></HQMusicUrl> <ThumbMediaId><![CDATA[${ThumbMediaId}]]></ThumbMediaId> </Music> </xml>`;break;case 'news':var { Articles } = messageObj;var ArticleCount = Articles.length; content = `<ArticleCount>${ArticleCount}</ArticleCount><Articles>`;for (var i = 0; i < ArticleCount; i++) { content += `<item> <Title><![CDATA[${Articles[i].Title}]]></Title> <Description><![CDATA[${Articles[i].Description}]]></Description> <PicUrl><![CDATA[${Articles[i].PicUrl}]]></PicUrl> <Url><![CDATA[${Articles[i].Url}]]></Url> </item>`; } content += '</Articles></xml>';break;default: content = `<Content><![CDATA[Error]]></Content> </xml>`; } var xml = header + content;return xml; } module.exports = createXML;
完成以上工作以後,啟動我們的伺服器,再次關注公眾號,應該能收到一條Hello! !的訊息。
這樣就實現了對關注事件的處理。
以上是Node.js+Koa開發之回應事件實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!