위챗 공식 계정의 이벤트에는 구독 이벤트/코드 스캔 이벤트/클릭 이벤트/점프링크 이벤트 등이 포함됩니다. 자세한 내용은 설명서를 참조하세요.
여기에서 구독 이벤트를 구현해 보겠습니다. 다른 이벤트의 구현 과정도 비슷합니다.
누군가 공식 계정을 구독하면 WeChat 서버가 이벤트를 우리 서버에 푸시합니다. 이 이벤트는 XML 형식의 데이터 패킷입니다.
WeChat이 서버에 메시지를 푸시하면 메시지가 여기에 먼저 전달된다는 점을 이해하실 수 있습니다.
/routes/index.js 추가됨:
router.post('/', index_middleware.post(config.wechat));
는 WeChat 서버에서 서버로의 게시물 요청을 처리하는 방법입니다.
일반적인 프로세스는 먼저 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(''); } } }
여기에서는 팔로우 및 언팔로우 이벤트만 구현되며 createXML 기능도 사용됩니다. 해당 기능은 데이터를 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;
위 작업을 완료한 후 서버를 시작하고 다시 공식 계정을 팔로우하면 Hello! ! 정보.
이러한 방식으로 우려되는 이벤트 처리가 실현됩니다.
위 내용은 Node.js+Koa 개발 응답 이벤트 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!