ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js+Koa開発応答イベントの例

Node.js+Koa開発応答イベントの例

零下一度
零下一度オリジナル
2017-06-25 09:15:111515ブラウズ

WeChat公式アカウントのイベントには、サブスクリプションイベント/コードスキャンイベント/クリックイベント/ジャンプリンクイベントなどが含まれます。詳細については、ドキュメントを参照してください。

ここでサブスクリプションイベントを実装しましょう。他のイベントの実装プロセスも同様です。

誰かが公式アカウントに登録すると、WeChat サーバーはイベントをサーバーにプッシュします。このイベントは XML 形式のデータ パケットです。

1. インデックスルーティングでポストイベントレスポンスを実装します。

WeChat がメッセージをサーバーにプッシュするとき、メッセージは最初にここに送信されることが理解できます。

/routes/index.js が追加されました:

router.post('/', index_middleware.post(config.wechat));

2.index_middleware に post メソッドを実装します:

は、WeChat サーバーからサーバーへの post リクエストを処理する方法です。

一般的なプロセスは、まず WeChat サーバーから送信されたデータ パケットを受信し、次に 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;
    };
};

ここでのデータは、raw-body コンポーネントを使用して受信したデータ パケットです。同時に、ツール関数 util とカスタム関数 autoReply が使用されます。

そのため、/wechat/index_middleware.js に次のコードを追加する必要があります:

var getRawBody = require('raw-body');var util = require('./util');var autoReply = require('./autoReply');

3. 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コンポーネントが使用されています。

4. autoReply 関数を実装します。その機能は、WeChat サーバーから送信されたデータ パケットを論理的に処理して、WeChat に送信する必要がある 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('');
        }
    }
}

ここではフォローイベントとフォロー解除イベントのみが実装されており、その機能はデータを 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;

上記の作業が完了したら、サーバーを起動し、再度公式アカウントをフォローしていただくと、ハロー! !情報。

このようにして、関心のあるイベントの処理が実現されます。

以上がNode.js+Koa開発応答イベントの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。