您好,登錄后才能下訂單哦!
這篇文章主要介紹使用koa2搭建微信第三方公眾平臺(tái)的注意事項(xiàng)有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
使用koa2搭建微信第三方公眾平臺(tái)的注意事項(xiàng)有哪些
在寫之前我想先說說koa,koa相比express,在執(zhí)行流程,以及組件方面優(yōu)秀的多,koa本身沒有提供過多的擴(kuò)展組建,但是它便捷的組建擴(kuò)展,可以讓你自由的發(fā)揮,可以想寫其他語(yǔ)言一樣并行執(zhí)行代碼,如果說promise解放了繁瑣的callback,那么 koa 編寫 web 應(yīng)用,通過組合不同的 generator,可以免除重復(fù)繁瑣的回調(diào)函數(shù)嵌套,并極大地提升錯(cuò)誤處理的效率。koa 不在內(nèi)核方法中綁定任何中間件,它僅僅提供了一個(gè)輕量?jī)?yōu)雅的函數(shù)庫(kù),使得編寫 Web 應(yīng)用變得得心應(yīng)手,nodejs的天生的異步處理流程,使得它很適合微信公眾號(hào)這種頻繁的消息互動(dòng),再加上pm2的多進(jìn)程管理,可以說已經(jīng)很大程度的滿足大號(hào)的消息轉(zhuǎn)發(fā)互動(dòng)已經(jīng)公眾號(hào)內(nèi)部紅包玩法。
在使用koa2搭建微信第三方公眾平臺(tái)是,首先要解決的是如果獲取微信返回的xml流,以及如何返回對(duì)應(yīng)的XML體給微信。
由于本身koa不是一個(gè)框架,所以得益于網(wǎng)上眾多的中間件,自己搭建了一個(gè)類似于express的框架,本框架已經(jīng)開源,詳情請(qǐng)看我的git地址:https://github.com/yxz1025/koa-lana,所有的微信接發(fā)消息均在此框架中,請(qǐng)讀者自行下載!
好了,首先,我們看看如何獲取微信返回的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!'; // 指紋碼不匹配時(shí)返回錯(cuò)誤信息,禁止后面的消息接受及發(fā)送 } let message = middleware.decryptXml(xml); let appid = ctx.params.appid; message.appId = appid; //發(fā)送消息隊(duì)列 switch (message.msgType) { case 'text': //測(cè)試 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 || '第一輪紅包雨開始了,手快有,手慢無(wú)!', 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); //測(cè)試專用 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搭建微信第三方公眾平臺(tái)的注意事項(xiàng)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。