• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 網(wǎng)絡(luò)軟件教程 > 詳細(xì)頁面

        如何使用koa2搭建微信第3方公眾平臺

        如何使用koa2搭建微信第3方公眾平臺

        更新時間:2025-09-20 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        導(dǎo)微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務(wù)的免費(fèi)應(yīng)用程序,由張小龍所帶領(lǐng)的騰訊廣州研發(fā)中心產(chǎn)品團(tuán)隊打造 [2] 。微信支持跨通信運(yùn)營商、跨操作系統(tǒng)平臺...
        微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務(wù)的免費(fèi)應(yīng)用程序,由張小龍所帶領(lǐng)的騰訊廣州研發(fā)中心產(chǎn)品團(tuán)隊打造 [2] 。微信支持跨通信運(yùn)營商、跨操作系統(tǒng)平臺通過網(wǎng)絡(luò)快速發(fā)送免費(fèi)(需消耗少量網(wǎng)絡(luò)流量)語音短信、視頻、圖片和文字,同時,也可以使用通過共享流媒體內(nèi)容的資料和基于位置的社交插件“搖一搖”、“漂流瓶”、“朋友圈”、”公眾平臺“、”語音記事本“等服務(wù)插件。
        這次給大家?guī)砣绾问褂胟oa2搭建微信第三方公眾平臺,使用koa2搭建微信第三方公眾平臺的注意事項有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。

        在寫之前我想先說說koa,koa相比express,在執(zhí)行流程,以及組件方面優(yōu)秀的多,koa本身沒有提供過多的擴(kuò)展組建,但是它便捷的組建擴(kuò)展,可以讓你自由的發(fā)揮,可以想寫其他語言一樣并行執(zhí)行代碼,如果說promise解放了繁瑣的callback,那么 koa 編寫 web 應(yīng)用,通過組合不同的 generator,可以免除重復(fù)繁瑣的回調(diào)函數(shù)嵌套,并極大地提升錯誤處理的效率。koa 不在內(nèi)核方法中綁定任何中間件,它僅僅提供了一個輕量優(yōu)雅的函數(shù)庫,使得編寫 Web 應(yīng)用變得得心應(yīng)手,nodejs的天生的異步處理流程,使得它很適合微信公眾號這種頻繁的消息互動,再加上pm2的多進(jìn)程管理,可以說已經(jīng)很大程度的滿足大號的消息轉(zhuǎn)發(fā)互動已經(jīng)公眾號內(nèi)部紅包玩法。

        在使用koa2搭建微信第三方公眾平臺是,首先要解決的是如果獲取微信返回的xml流,以及如何返回對應(yīng)的XML體給微信。
        由于本身koa不是一個框架,所以得益于網(wǎng)上眾多的中間件,自己搭建了一個類似于express的框架,本框架已經(jīng)開源,詳情請看我的git地址:https://github.com/yxz1025/koa-lana,所有的微信接發(fā)消息均在此框架中,請讀者自行下載!

        好了,首先,我們看看如何獲取微信返回的xml流:

        ======tool.js=====
        //截獲微信返回的xml流文件
        const Promise = require('bluebird');
        //普通post流轉(zhuǎn)化為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======
        //微信響應(yīng)主體文件
        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);
        //第三方授權(quán)路徑 /: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!'; // 指紋碼不匹配時返回錯誤信息,禁止后面的消息接受及發(fā)送
          }
          let message = middleware.decryptXml(xml);
          let appid = ctx.params.appid;
          message.appId = appid;
          //發(fā)送消息隊列
          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 || '點(diǎn)我領(lǐng)紅包',
                  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);
                //獲取授權(quán)域名
                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;

        相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注php中文網(wǎng)其它相關(guān)文章!

        推薦閱讀:

        如何操作Koa2微信公眾號開發(fā)之本地開發(fā)調(diào)試環(huán)境搭建

        如何操作Koa2微信公眾號實(shí)現(xiàn)消息管理

        以上就是如何使用koa2搭建微信第三方公眾平臺的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


        微信提供公眾平臺、朋友圈、消息推送等功能,用戶可以通過“搖一搖”、“搜索號碼”、“附近的人”、掃二維碼方式添加好友和關(guān)注公眾平臺,同時微信將內(nèi)容分享給好友以及將用戶看到的精彩內(nèi)容分享到微信朋友圈。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 国产精品亚洲自在线播放页码| 亚洲VA中文字幕无码一二三区| 亚洲视频免费在线看| a级毛片黄免费a级毛片| 亚洲精品无码Av人在线观看国产| 免费国产va在线观看| 四虎永久免费地址在线网站| 日本亚洲欧美色视频在线播放 | 久久国产乱子伦精品免费一| 国产亚洲精品国产| 日本高清高色视频免费| 亚洲国产精品人久久| 精品香蕉在线观看免费| 亚洲制服丝袜中文字幕| 成人免费无码大片A毛片抽搐 | 国产免费拔擦拔擦8X高清在线人| 亚洲精品无码成人片久久| 在线看片免费人成视频播| 亚洲国产二区三区久久| 亚洲w码欧洲s码免费| 亚洲女子高潮不断爆白浆| 亚洲av再在线观看| 插鸡网站在线播放免费观看| 亚洲今日精彩视频| 成人毛片免费观看视频在线| 爱情岛论坛免费视频| 亚洲处破女AV日韩精品| 青青在线久青草免费观看| 在线播放亚洲精品| 久久久久久久综合日本亚洲| 黄瓜视频高清在线看免费下载 | 国内精品久久久久影院免费| 亚洲一区二区三区91| 免费永久在线观看黄网站| 亚洲日韩图片专区第1页| 午夜电影免费观看| 亚洲成a人片在线观看精品| 亚洲一卡2卡3卡4卡5卡6卡| 一区二区三区观看免费中文视频在线播放 | 成人A毛片免费观看网站| 亚洲成人福利在线观看|