Heim  >  Artikel  >  Web-Frontend  >  So betreiben Sie das öffentliche Koa2 WeChat-Konto, um eine Nachrichtenverwaltung zu erreichen

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

php中世界最好的语言
php中世界最好的语言Original
2018-05-29 11:15:192439Durchsuche

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>

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

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!

Stellungnahme:
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