微信公眾號中的事件有訂閱事件/掃碼事件/點擊事件/跳轉連結事件等等,具體可以查閱文件。
這裡來實作訂閱事件,其他的事件的實作過程也都類似。
當有人訂閱了公眾號碼後,微信伺服器會向我們的伺服器推送一個事件,這個事件是XML格式的封包。
一、我們在index路由下實作post事件的回應。
可以理解為當微信向我們的伺服器推播訊息時,訊息就會先走到這裡。
/routes/index.js加入:
router.post('/', index_middleware.post(config.wechat));
二、實作index_middleware中的post方法:
就是我們該如何處理微信伺服器給我們的伺服器的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');
三、實作util工具函數中的parseXMLAsync方法,它的作用是異步地將xml格式化為json資料。
/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這個元件。
四、實作autoReply函數,它的作用是將微信伺服器發送的資料包進行邏輯處理,形成我們需要傳送給微信的XML格式資料。
/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></tousername> <fromusername></fromusername> <createtime>${CreateTime}</createtime> <msgtype></msgtype>`;var content = '';switch(MsgType) {case 'text':var { Content } = messageObj; content = `<content></content> </xml>`;break;case 'image':var { MediaId } = messageObj; content = `<image> <mediaid></mediaid> </image> `;break;case 'voice':var { MediaId } = messageObj; content = `<voice> <mediaid></mediaid> </voice> `;break;case 'video':var { MediaId, Title, Description } = messageObj; content = `<video> <mediaid></mediaid> <title></title> <description></description> </video> `;break;case 'music':var { Title, Description, MusicUrl, HQMusicUrl, ThumbMediaId } = messageObj; content = `<music> <title></title> <description></description> <musicurl></musicurl> <hqmusicurl></hqmusicurl> <thumbmediaid></thumbmediaid> </music> `;break;case 'news':var { Articles } = messageObj;var ArticleCount = Articles.length; content = `<articlecount>${ArticleCount}</articlecount><articles>`;for (var i = 0; i <title></title> <description></description> <picurl></picurl> <url></url> `; } content += '</articles>';break;default: content = `<content></content> `; } var xml = header + content;return xml; } module.exports = createXML;
完成以上工作以後,啟動我們的伺服器,再次關注公眾號,應該能收到一條Hello! !的訊息。
這樣就實現了對關注事件的處理。
以上是Node.js+Koa開發之回應事件實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何對多個鏈接進行並發GET請求並依次判斷返回結果?在Tampermonkey腳本中,我們經常需要對多個鏈...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver CS6
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3漢化版
中文版,非常好用