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!