Wenn ein gewöhnlicher WeChat-Benutzer eine Nachricht an ein öffentliches Konto sendet, sendet der WeChat-Server das XML-Datenpaket der Nachricht an das Vom Entwickler ausgefüllte URL.
2.1 Allgemeines Nachrichtendatenformat empfangen
Die Struktur von XML ist grundsätzlich festgelegt und verschiedene Nachrichtentypen unterscheiden sich geringfügig.
Wenn ein Benutzer eine Textnachricht sendet, lautet das vom öffentlichen WeChat-Konto empfangene XML-Datenformat wie folgt:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>createTime</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
Wenn ein Benutzer eine Bildnachricht sendet, wird das vom öffentlichen WeChat-Konto empfangene XML-Datenformat wie folgt gesendet Das öffentliche WeChat-Konto lautet wie folgt:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[this is a url]]></PicUrl> <MediaId><![CDATA[media_id]]></MediaId> <MsgId>1234567890123456</MsgId> </xml>
Informationen zur Struktur anderer Nachrichtentypen finden Sie im [WeChat Public Platform Development Document]
Informationen zur Verarbeitung von POST-Anfragen, koa2 kapselt nicht die Methode zum Abrufen von Parametern, die erforderlich ist, indem Sie die native Anforderungsobjektanforderung von node.js im Kontextkontext selbst analysieren. Wir werden das Zeilenkörpermodul verwenden, um die Daten abzurufen.
2.2 Optimieren wir zuerst den vorherigen Code
Der Code in diesem Abschnitt folgt dem in der vorherigen Sitzung implementierten Code, mit geringfügigen Änderungen basierend auf der vorherigen Sitzung.
'use strict' const Koa = require('koa') const app = new Koa() const crypto = require('crypto') // 将配置文件独立到config.js const config = require('./config') app.use(async ctx => { // GET 验证服务器 if (ctx.method === 'GET') { const { signature, timestamp, nonce, echostr } = ctx.query const TOKEN = config.wechat.token let hash = crypto.createHash('sha1') const arr = [TOKEN, timestamp, nonce].sort() hash.update(arr.join('')) const shasum = hash.digest('hex') if (shasum === signature) { return ctx.body = echostr } ctx.status = 401 ctx.body = 'Invalid signature' } else if (ctx.method === 'POST') { // POST接收数据 // TODO } }); app.listen(7001);
Hier haben wir nur überprüft, ob der Signaturwert in GET zulässig ist. Tatsächlich sollten wir die Signatur auch in POST überprüfen.
Signaturüberprüfung als Funktion schreiben
function getSignature (timestamp, nonce, token) { let hash = crypto.createHash('sha1') const arr = [token, timestamp, nonce].sort() hash.update(arr.join('')) return hash.digest('hex') }
Optimieren Sie den Code und fügen Sie die Überprüfung im POST hinzu
... app.use(async ctx => { const { signature, timestamp, nonce, echostr } = ctx.query const TOKEN = config.wechat.token if (ctx.method === 'GET') { if (signature === getSignature(timestamp, nonce, TOKEN)) { return ctx.body = echostr } ctx.status = 401 ctx.body = 'Invalid signature' }else if (ctx.method === 'POST') { if (signature !== getSignature(timestamp, nonce, TOKEN)) { ctx.status = 401 return ctx.body = 'Invalid signature' } // TODO } }); ...
Bis jetzt haben wir noch nicht mit der Implementierung der Funktion zum Akzeptieren von XML-Daten begonnen Pakete. Es ist der Code vor der Änderung. Dies soll den tatsächlichen Entwicklungsprozess veranschaulichen. Das Schreiben von Code ist kein einstufiger Prozess und guter Code kann nur geändert werden.
2.3 Empfangen von XML-Datenpaketen gewöhnlicher Nachrichten von öffentlichen Konten
Jetzt kommen wir zum Punkt dieses Abschnitts, dem Akzeptieren von XML-Datenpaketen und deren Konvertierung in JSON
$ npm install raw-body --save
Senden Sie eine Textnachricht an Ihr Testkonto und Sie können die folgenden Daten in der Befehlszeile ausgedruckt sehen
... const getRawBody = require('raw-body') ... // TODO // 取原始数据 const xml = await getRawBody(ctx.req, { length: ctx.request.length, limit: '1mb', encoding: ctx.request.charset || 'utf-8' }); console.log(xml) return ctx.body = 'success' // 直接回复success,微信服务器不会对此作任何处理
Herzlichen Glückwunsch, Sie können jetzt XML-Daten empfangen.
Das obige ist der detaillierte Inhalt vonSo betreiben Sie das öffentliche Koa2 WeChat-Konto, um eine Nachrichtenverwaltung zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!