Maison > interface Web > js tutoriel > Exemple d'événement de réponse de développement Node.js+Koa

Exemple d'événement de réponse de développement Node.js+Koa

零下一度
Libérer: 2017-06-25 09:15:11
original
1580 Les gens l'ont consulté

Les événements du compte officiel WeChat incluent les événements d'abonnement/les événements d'analyse de code/les événements de clic/les événements de lien de saut, etc. Pour plus de détails, veuillez vous référer à la documentation.

Implémentons l'événement d'abonnement ici. Le processus de mise en œuvre des autres événements est similaire.

Lorsque quelqu'un s'abonne au compte public, le serveur WeChat envoie un événement à notre serveur. Cet événement est un paquet de données au format XML.

1. Nous implémentons la réponse post-événement sous routage d'index.

On peut comprendre que lorsque WeChat envoie un message à notre serveur, le message ira ici en premier.

/routes/index.js ajouté :

router.post('/', index_middleware.post(config.wechat));
Copier après la connexion

2. Implémentez la méthode post dans index_middleware :

est la façon dont nous devrions gérer WeChat Postez la demande du serveur sur notre serveur.

Le processus général consiste à recevoir d'abord le paquet de données envoyé par le serveur WeChat, puis à analyser le paquet de données XML, puis à effectuer un traitement logique sur notre serveur en fonction des données reçues pour former un message de réponse au format XML. .

/wechat/index_middleware.js ajouté :

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;
    };
};
Copier après la connexion

Les données ici sont le paquet de données que nous avons reçu, en utilisant le composant corps brut. En même temps, la fonction outil util et la fonction personnalisée autoReply sont utilisées.

Par conséquent, le code suivant doit être ajouté à /wechat/index_middleware.js :

var getRawBody = require('raw-body');var util = require('./util');var autoReply = require('./autoReply');
Copier après la connexion

3. Implémentez la méthode parseXMLAsync dans la fonction de l'outil util. Sa fonction est de formater de manière asynchrone des données XML en données 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);
        });
    });
};
Copier après la connexion

Le composant xml2js est utilisé ici.

Quatrièmement, implémentez la fonction autoReply. Sa fonction est de traiter logiquement les paquets de données envoyés par le serveur WeChat pour former les données au format XML que nous devons envoyer à WeChat.

/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('');
        }
    }
}
Copier après la connexion

Seuls les événements de suivi et de désabonnement sont implémentés ici, et la fonction createXML est également utilisée. Les données sont encapsulées au format 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;
Copier après la connexion

Après avoir terminé le travail ci-dessus, démarrez notre serveur et suivez le compte officiel encore une fois, il devrait pouvoir recevoir un message Hello! ! information.

De cette manière, le traitement des événements d'intérêt est réalisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal