Maison  >  Article  >  interface Web  >  Comment exploiter le compte public Koa2 WeChat pour réaliser la gestion des messages

Comment exploiter le compte public Koa2 WeChat pour réaliser la gestion des messages

php中世界最好的语言
php中世界最好的语言original
2018-05-29 11:15:192458parcourir

Recevoir un message

Lorsqu'un utilisateur WeChat ordinaire envoie un message à un compte public, le serveur WeChat POSTera le paquet de données XML du message au URL renseignée par le développeur .

2.1 Recevoir un format de données de message commun

La structure du XML est fondamentalement fixe et les différents types de messages sont légèrement différents.

Lorsqu'un utilisateur envoie un message texte, le format de données XML reçu par le compte public WeChat est le suivant :

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

Lorsqu'un utilisateur envoie un message photo, le format de données XML reçu par le compte public WeChat est le suivant Montré :

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

Pour la structure des autres types de messages, veuillez vous référer aux [Documents de développement de la plateforme publique WeChat]

Pour le traitement de Requête POST, koa2 n'encapsule pas la méthode des paramètres d'acquisition, vous devez analyser vous-même la requête d'objet de requête node.js native dans le contexte. Nous utiliserons le module row-body pour obtenir les données.

2.2 Optimisons d'abord le code précédent

Le code de cette section suit le code implémenté lors de la session précédente, avec de légères modifications basées sur la session précédente.

'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);

Ici, nous vérifions uniquement si la valeur de la signature est légale dans GET. En fait, nous devrions également vérifier la signature dans POST.

Écrire la vérification de signature en fonction

function getSignature (timestamp, nonce, token) {
 let hash = crypto.createHash('sha1')
 const arr = [token, timestamp, nonce].sort()
 hash.update(arr.join(''))
 return hash.digest('hex')
}

Optimiser le code et ajouter la vérification au POST

...
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
 }
});
...

Jusqu'à présent, nous n'avons pas commencé à accepter les données XML les paquets fonctionnent, mais le code avant modification. Il s'agit de démontrer le processus de développement réel. L'écriture d'un code n'est pas un processus en une seule étape, et un bon code ne peut être modifié.

2.3 Réception de paquets de données XML de messages ordinaires provenant de comptes publics

Passons maintenant au point de cette section, accepter les paquets de données XML et les convertir en JSON

$ npm install raw-body --save
...
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,微信服务器不会对此作任何处理

Envoyez un message texte à votre compte de test, vous pouvez voir les données suivantes imprimées sur la ligne de commande

<xml>
 <ToUserName><![CDATA[gh_9d2d49e7e006]]></ToUserName>
 <FromUserName><![CDATA[oBp2T0wK8lM4vIkmMTJfFpk6Owlo]]></FromUserName>
 <CreateTime>1516940059</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[JavaScript之禅]]></Content>
 <MsgId>6515207943908059832</MsgId>
</xml>

Félicitations, vous pouvez maintenant recevoir des données XML.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn