Zu den Ereignissen im offiziellen WeChat-Konto gehören Abonnement-Ereignisse/Code-Scan-Ereignisse/Klick-Ereignisse/Jump-Link-Ereignisse usw. Einzelheiten finden Sie in der Dokumentation.
Lassen Sie uns das Abonnement-Event hier implementieren. Der Implementierungsprozess anderer Events ist ähnlich.
Wenn sich jemand für das öffentliche Konto anmeldet, sendet der WeChat-Server ein Ereignis an unseren Server. Dieses Ereignis ist ein Datenpaket im XML-Format.
Es versteht sich, dass, wenn WeChat eine Nachricht an unseren Server sendet, die Nachricht zuerst hierher gelangt.
/routes/index.js hinzugefügt:
router.post('/', index_middleware.post(config.wechat));
ist, wie wir mit WeChat umgehen sollten Anfrage vom Server an unseren Server senden.
Der allgemeine Prozess besteht darin, zuerst das vom WeChat-Server gesendete Datenpaket zu empfangen, dann das XML-Datenpaket zu analysieren und dann auf unserem Server basierend auf den empfangenen Daten eine logische Verarbeitung durchzuführen, um eine Antwortnachricht im XML-Format zu erstellen . .
/wechat/index_middleware.js hinzugefügt:
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; }; };
Die Daten hier sind das Datenpaket, das wir unter Verwendung der Raw-Body-Komponente erhalten haben. Dabei kommen die Tool-Funktion util und die Custom-Funktion autoReply zum Einsatz.
Daher muss der folgende Code zu /wechat/index_middleware.js hinzugefügt werden:
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); }); }); };
Hier wird die xml2js-Komponente verwendet.
/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(''); } } }
Hier werden nur die Follow- und Unfollow-Ereignisse implementiert, und die Funktion createXML wird ebenfalls verwendet Die Daten werden im XML-Format gekapselt:
/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;
Nach Abschluss der oben genannten Arbeiten starten Sie unseren Server und folgen dem offiziellen Konto Auch hier sollte Can ein „Hello!“ empfangen. ! Information.
Auf diese Weise wird die Verarbeitung von Ereignissen von Interesse realisiert.
Das obige ist der detaillierte Inhalt vonBeispiel für ein Node.js+Koa-Entwicklungsreaktionsereignis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!