Cette fois, je vais vous montrer comment utiliser koa2 pour créer une plate-forme publique tierce WeChat. Quelles sont les précautions pour utiliser koa2 pour créer une plate-forme publique tierce WeChat. cas pratique, jetons un coup d'oeil.
Avant d'écrire, je veux d'abord parler de koa par rapport à express, koa est bien meilleur en termes de processus d'exécution et de composants. koa lui-même ne fournit pas trop d'extensions, mais il est facile de configurer des extensions. . Il vous permet de jouer librement et d'exécuter du code en parallèle comme écrire d'autres langages. Si les promesses libèrent des rappels fastidieux, alors lors de l'écriture d'applications Web en koa, en combinant différents générateurs, vous pouvez éviter des fonctions de rappel fastidieuses. L'imbrication et améliore considérablement l'efficacité de la gestion des erreurs. koa ne lie aucun middleware dans la méthode du noyau. Il fournit uniquement une bibliothèque de fonctions légère et élégante, ce qui facilite l'écriture d'applications Web. Le processus de traitement asynchrone naturel de nodejs le rend très approprié pour les transactions fréquentes telles que les comptes publics WeChat. On peut dire que l'interaction, associée à la gestion multi-processus de pm2, a largement satisfait à l'interaction de transmission de messages des grands comptes et au gameplay interne de l'enveloppe rouge des comptes publics.
Lorsque vous utilisez koa2 pour créer une plate-forme publique tierce WeChat, la première chose à résoudre est de savoir comment obtenir le flux XML renvoyé par WeChat et comment renvoyer le corps XML correspondant à WeChat.
Comme koa en lui-même n'est pas un framework, donc grâce aux nombreux middlewares sur Internet, j'ai construit un framework similaire à express. Ce framework a été open source Pour plus de détails, veuillez consulter mon adresse git : https : // github.com/yxz1025/koa-lana, tous les messages WeChat sont dans ce cadre, veuillez le télécharger vous-même !
D'accord, voyons d'abord comment obtenir le flux XML renvoyé par WeChat :
======tool.js===== //截获微信返回的xml流文件 const Promise = require('bluebird'); //普通post流转化为promise var Tool = { convertPost: function(req) { let post_data = ""; return new Promise(function(resolve, reject){ req.on('data', function(chunk) { post_data += chunk; }); req.on('end', function() { resolve(post_data); }); }); }, }; module.exports = Tool; =====weichat.js====== //微信响应主体文件 const router = require('koa-router')(); const parseMessage = require('../common/parseMessage'); const config = require('../config'); const WXBizMsgCrypt = require('wechat-crypto'); const middleware = require('../model/middleware'); const validator = require('validator'); const Aes = require('../common/aes'); const Tool = require('../common/tool'); const cryptor = new WXBizMsgCrypt(config.component_config.token, config.component_config.key, config.component_config.component_appid); //第三方授权路径 /:appid/callback /wechat/100234/callback router.post('/:appid/callback', async function(ctx, next) { let post_data = ""; let req = ctx.req; post_data = await Tool.convertPost(req); let xml = parseMessage(post_data); let signature = cryptor.getSignature(ctx.query.timestamp, ctx.query.nonce, xml.encrypt); if (ctx.query.msg_signature != signature) { ctx.body = 'Auth failed!'; // 指纹码不匹配时返回错误信息,禁止后面的消息接受及发送 } let message = middleware.decryptXml(xml); let appid = ctx.params.appid; message.appId = appid; //发送消息队列 switch (message.msgType) { case 'text': //测试 if (message.toUserName == "gh_3c884a361561") { if (message.content == "TESTCOMPONENT_MSG_TYPE_TEXT") { let text = middleware.text(message, message.content + "_callback"); let reply = middleware.encryptXml(text); return ctx.body = reply; } let content = message.content; if (content.indexOf("QUERY_AUTH_CODE") != -1) { ctx.body = ""; let code_li = content.split(":"); await middleware.customSend(message.fromUserName, code_li[1]); return; } } let keywords = validator.trim(message.content).toLowerCase(); let member_config = await middleware.getMemberConfig(message.toUserName, keywords); if (!member_config) { await middleware.sendMnsQuene(message); return ctx.body = "success"; }else{ //匹配成功 message.packetsId = parseInt(member_config.hongbaoId); message.keywords = keywords; await middleware.sendMnsQuene(message); let data = { title: member_config.news_title || '点我领红包', description: member_config.description || '第一轮红包雨开始了,手快有,手慢无!', picurl: member_config.picurl || 'http://7xqomp.com2.z0.glb.qiniucdn.com/17269743.png' }; let key = { fromUserName: message.fromUserName, toUserName: message.toUserName, keywords: keywords, appId: appid }; key = JSON.stringify(key); key = Aes.encypt(key); key = Aes.base64_encode(key); //获取授权域名 let auth_url = await middleware.packetDomain(); data.url = "http://" + appid + "." + auth_url + "/redPackets/koulin?key=" + key; let news = middleware.news(message, [data]); let reply = middleware.encryptXml(news); ctx.body = reply; return; } break; case 'event': await middleware.sendMnsQuene(message); //测试专用 if (message.toUserName == "gh_3c884a361561") { let text = middleware.text(message, message.event + "from_callback"); let reply = middleware.encryptXml(text); ctx.body = reply; return; } break; default: await middleware.sendMnsQuene(message); ctx.body = "success"; return; }; }); module.exports = router;
Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes. , veuillez faire attention au site Web chinois php Autres articles connexes !
Lecture recommandée :
Comment faire fonctionner Koa2 Implémentation du compte public WeChat Gestion des messages
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!