Maison >interface Web >js tutoriel >Exemple d'événement de réponse de développement Node.js+Koa
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.
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));
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; }; };
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');
/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); }); }); };
Le composant xml2js est utilisé ici.
/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(''); } } }
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;
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!