這篇文章主要介紹了使用koa2搭建微信第三方公眾平臺的原因是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,南開企業(yè)網(wǎng)站建設,南開品牌網(wǎng)站建設,網(wǎng)站定制,南開網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,南開網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。在寫之前我想先說說koa,koa相比express,在執(zhí)行流程,以及組件方面優(yōu)秀的多,koa本身沒有提供過多的擴展組建,但是它便捷的組建擴展,可以讓你自由的發(fā)揮,可以想寫其他語言一樣并行執(zhí)行代碼,如果說promise解放了繁瑣的callback,那么 koa 編寫 web 應用,通過組合不同的 generator,可以免除重復繁瑣的回調(diào)函數(shù)嵌套,并極大地提升錯誤處理的效率。koa 不在內(nèi)核方法中綁定任何中間件,它僅僅提供了一個輕量優(yōu)雅的函數(shù)庫,使得編寫 Web 應用變得得心應手,nodejs的天生的異步處理流程,使得它很適合微信公眾號這種頻繁的消息互動,再加上pm2的多進程管理,可以說已經(jīng)很大程度的滿足大號的消息轉(zhuǎn)發(fā)互動已經(jīng)公眾號內(nèi)部紅包玩法。
在使用koa2搭建微信第三方公眾平臺是,首先要解決的是如果獲取微信返回的xml流,以及如何返回對應的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====== //微信響應主體文件 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 || '點我領(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;
感謝你能夠認真閱讀完這篇文章,希望小編分享的“使用koa2搭建微信第三方公眾平臺的原因是什么”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設計公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網(wǎng)站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。