Heim > Web-Frontend > js-Tutorial > Hauptteil

So betreiben Sie das öffentliche Koa2 WeChat-Konto, um eine Nachrichtenverwaltung zu erreichen

php中世界最好的语言
Freigeben: 2018-05-29 11:15:19
Original
2457 Leute haben es durchsucht

Nachricht empfangen

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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);
Nach dem Login kopieren

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')
}
Nach dem Login kopieren

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
 }
});
...
Nach dem Login kopieren

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
Nach dem Login kopieren
rrree

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,微信服务器不会对此作任何处理
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage