Maison > Applet WeChat > Développement WeChat > le corps du texte

Comment utiliser koa2 pour créer une plateforme publique tierce WeChat

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

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

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 le développement du compte public Koa2 WeChat et créer un environnement de développement et de débogage local

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!

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