>위챗 애플릿 >위챗 개발 >koa2를 사용하여 WeChat 제3자 공개 플랫폼을 구축하는 방법

koa2를 사용하여 WeChat 제3자 공개 플랫폼을 구축하는 방법

php中世界最好的语言
php中世界最好的语言원래의
2018-05-29 11:22:063330검색

이번에는 koa2를 사용하여 WeChat에서 타사 공개 플랫폼을 구축하는 방법을 보여 드리겠습니다. koa2를 사용하여 WeChat에서 타사 공개 플랫폼을 구축할 때의 주의 사항은 무엇입니까? 바라보다.

글을 쓰기 전에 먼저 Koa에 대해 이야기하고 싶습니다. Express에 비해 Koa는 실행 프로세스 및 구성 요소 측면에서 훨씬 우수합니다. 다른 언어를 작성하는 것처럼 코드를 병렬로 실행하는 것입니다. 프라미스가 번거로운 콜백을 해제한다면 Koa로 웹 애플리케이션을 작성하면 다양한 생성기를 결합하여 콜백 함수의 반복적이고 번거로운 중첩을 피할 수 있고 오류 처리 효율성이 크게 향상됩니다. koa는 커널 방식으로 어떤 미들웨어도 바인딩하지 않으며 가볍고 우아한 기능 라이브러리만 제공하므로 웹 애플리케이션 작성이 쉽습니다. nodejs의 자연스러운 비동기 처리 프로세스는 WeChat 공개 계정과 같이 빈번한 트랜잭션에 매우 적합합니다. pm2의 다중 프로세스 관리와 결합된 상호 작용은 대규모 계정의 메시지 전달 상호 작용과 공개 계정의 내부 빨간 봉투 게임 플레이를 크게 만족시켰다고 말할 수 있습니다.

koa2를 사용하여 WeChat 제3자 공개 플랫폼을 구축할 때 가장 먼저 해결해야 할 것은 WeChat에서 반환된 XML 스트림을 얻는 방법과 해당 XML 본문을 WeChat에 반환하는 방법입니다.
koa 자체는 프레임워크가 아니기 때문에 인터넷에 있는 많은 미들웨어 덕분에 express와 비슷한 프레임워크를 만들었습니다. 자세한 내용은 내 git 주소를 참조하세요: https://github .com /yxz1025/koa-lana, 모든 WeChat 메시지는 이 프레임워크에 있습니다. 직접 다운로드하세요!

좋아요, 먼저 WeChat에서 반환된 xml 스트림을 얻는 방법을 살펴보겠습니다.

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

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 다른 관련 항목에 주의하세요. PHP 중국어 웹사이트의 기사!

추천 도서:

Koa2 WeChat 공용 계정 개발 운영 방법과 로컬 개발 및 디버깅 환경 구축

Koa2 WeChat 공용 계정 운영 방법으로 메시지 관리 구현

위 내용은 koa2를 사용하여 WeChat 제3자 공개 플랫폼을 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.