Maison > interface Web > js tutoriel > le corps du texte

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

php中世界最好的语言
Libérer: 2018-05-29 11:15:19
original
2391 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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);
Copier après la connexion

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')
}
Copier après la connexion

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
 }
});
...
Copier après la connexion

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
Copier après la connexion
...
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,微信服务器不会对此作任何处理
Copier après la connexion

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>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!