ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js+Koa開発応答イベントの例
WeChat公式アカウントのイベントには、サブスクリプションイベント/コードスキャンイベント/クリックイベント/ジャンプリンクイベントなどが含まれます。詳細については、ドキュメントを参照してください。
ここでサブスクリプションイベントを実装しましょう。他のイベントの実装プロセスも同様です。
誰かが公式アカウントに登録すると、WeChat サーバーはイベントをサーバーにプッシュします。このイベントは XML 形式のデータ パケットです。
WeChat がメッセージをサーバーにプッシュするとき、メッセージは最初にここに送信されることが理解できます。
/routes/index.js が追加されました:
router.post('/', index_middleware.post(config.wechat));
は、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');
/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コンポーネントが使用されています。
/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 サイトの他の関連記事を参照してください。