【移动应用开发技术】使用koa2搭建微信第三方公众平台的注意事项有哪些_第1页
【移动应用开发技术】使用koa2搭建微信第三方公众平台的注意事项有哪些_第2页
【移动应用开发技术】使用koa2搭建微信第三方公众平台的注意事项有哪些_第3页
【移动应用开发技术】使用koa2搭建微信第三方公众平台的注意事项有哪些_第4页
免费预览已结束,剩余1页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】使用koa2搭建微信第三方公众平台的注意事项有哪些

这篇文章主要介绍使用koa2搭建微信第三方公众平台的注意事项有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用koa2搭建微信第三方公众平台的注意事项有哪些在写之前我想先说说koa,koa相比express,在执行流程,以及组件方面优秀的多,koa本身没有提供过多的扩展组建,但是它便捷的组建扩展,可以让你自由的发挥,可以想写其他语言一样并行执行代码,如果说promise解放了繁琐的callback,那么koa编写web应用,通过组合不同的generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写Web应用变得得心应手,nodejs的天生的异步处理流程,使得它很适合微信公众号这种频繁的消息互动,再加上pm2的多进程管理,可以说已经很大程度的满足大号的消息转发互动已经公众号内部红包玩法。在使用koa2搭建微信第三方公众平台是,首先要解决的是如果获取微信返回的xml流,以及如何返回对应的XML体给微信。由于本身koa不是一个框架,所以得益于网上众多的中间件,自己搭建了一个类似于express的框架,本框架已经开源,详情请看我的git地址:/yxz1025/koa-lana,所有的微信接发消息均在此框架中,请读者自行下载!好了,首先,我们看看如何获取微信返回的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(ponent_config.token,

ponent_config.key,

ponent_ponent_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://7/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

=

middl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论