Heim  >  Artikel  >  Web-Frontend  >  Beispiel für ein Node.js+Koa-Entwicklungsreaktionsereignis

Beispiel für ein Node.js+Koa-Entwicklungsreaktionsereignis

零下一度
零下一度Original
2017-06-25 09:15:111515Durchsuche

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.

1. Wir implementieren die Reaktion nach dem Ereignis unter Index-Routing.

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

2. Implementieren Sie die Post-Methode in index_middleware:

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');

3. Implementieren Sie die parseXMLAsync-Methode in der Util-Tool-Funktion. Seine Funktion besteht darin, XML-Daten asynchron in JSON-Daten zu formatieren.

/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.

Viertens: Implementieren Sie die AutoReply-Funktion. Ihre Funktion besteht darin, die vom WeChat-Server gesendeten Datenpakete logisch zu verarbeiten, um die Daten im XML-Format zu bilden, die wir an WeChat senden müssen.

/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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn