Koa系框架(egg/cabloy)如何获取微信支付回调请求中的xml参数
背景
在Koa系框架(如EggJS)中进行微信支付开发时,遇到一个问题:微信支付平台会发送一个回调请求,通知支付订单的处理结果。该请求传入的参数是xml格式,而Koa中间件koa-bodyparser对xml格式的请求参数没有做处理,这就需要我们在程序中自行处理
通用处理逻辑
网上通用的处理逻辑,都是类似如下的代码:
const bb = require('bluebird');
const xml = await bb.fromCallback(cb => {
let data = '';
this.ctx.req.setEncoding('utf8');
this.ctx.req.on('data', function(chunk) {
data += chunk;
});
this.ctx.req.on('end', function() {
cb(null, data);
});
});
分析与疑问
上面这段代码通过响应request对象的事件接收xml数据,对于微信支付这个场景简单有效,但是作为一个通用的xml处理机制,还是有所欠缺。request对象有如下事件:aborted、close、data、end、error,此外,请求参数还有可能使用了压缩算法。如何对这些场景做更完整的处理呢?
借用中间件koa-bodyparser
由于Koa系框架(如EggJS)使用中间件koa-bodyparser对请求参数做预处理工作。那么最完整的处理逻辑也一定在中间件koa-bodyparser中。具体的源码这里不列出,可以参考如下链接:
通过分析中间件koa-bodyparser所引用的源码,我们就可以得到一个更简洁的xml处理代码,而且适应场景也更广,代码如下:
const raw = require('raw-body');
const inflate = require('inflation');
const xml = await raw(inflate(this.ctx.req));
CabloyJS的进一步封装
CabloyJS后端是基于EggJS定制的上层应用框架。CabloyJS通过向context对象注入一个通用的方法getPayload,那么在实际的开发场景中就更加方便了
注入方法
async getPayload(options) {
return await raw(inflate(this.req), options);
}
实际调用
const xml = await this.ctx.getPayload();
Koa系框架(egg/cabloy)如何获取微信支付回调请求中的xml参数的更多相关文章
- .NET CORE 获取微信支付回调
1.获取微信支付的回调的数据 Stream stream = HttpContext.Request.Body; byte[] buffer = new byte[HttpContext.Reques ...
- php对微信支付回调处理的方法(合集)
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答. 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽 ...
- .NET开发微信小程序-接收微信支付回调数据
获取微信支付传回来的数据 1.MVC控制器 /// <summary> /// 付款返回的数据 /// </summary> /// <returns></r ...
- PHP7 微信支付回调失败 解决
升级完PHP7 发现微信支付回调失败.原来是 $GLOBALS['HTTP_RAW_POST_DATA'];没有定义的问题.php7 移除了这个全局变量. 问题代码如下: 微信API :WxPay.A ...
- ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题
原文:ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/MrTra ...
- 微信支付重复回调,java微信支付回调问题
这几天一直在研究微信支付回调这个问题,发现之前微信支付回调都是正常的也没怎么在意,今天在自己项目上测试的时候发现相同的代码在我这个项目上微信支付回调老是重复执行导致支付成功之后的回调逻辑一直在执行,很 ...
- 微信支付回调,XXE攻击漏洞防止方法
最近微信支付回调发现的XXE攻击漏洞(什么是XXE攻击,度娘.bing去搜,一搜一大把),收到通知后即检查代码, 微信给的解决方法是如果你使用的是: XmlDocument: XmlDocument ...
- springboot的restful风格获取请求中携带的参数
http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...
- 在vue中获取微信支付code及code被占用问题的解决?
这个地方坑比较多,查看网上并没有详细的文档,新手一般写到这里很痛苦.这里我只介绍一下我解决的方案,虽然它不是最好的,但是可行的方案: 总体分两步 1)跳到微信支付链接,它会自动拼接上code 2)获取 ...
随机推荐
- Oracle中between 和 in
select * from test_s where id between 2 and 12; between 就是左右全闭区间. SELECT columnsFROM tablesWHERE col ...
- JavaScript实现带正则表达式的表单校验(校验成功后跳转)
运行结果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- css实现半圆效果
效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- maven导入依赖了提示can't resolved
maven导入依赖显红报错 网上有很多解决方案,我试过几个但是都不是很好用,推荐一个我自己一直在用的解决方案 在终端执行命令 mvn idea:idea 无法解析的原因基本上是因为包没下载完整,执行这 ...
- python入门基础-介绍、基础语法
一.anaconda下的spyder简介 Spyder 是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑.交互测试.调试等特性,支持包括 Windows.Linux 和 OS X 系 ...
- [转载] go get 拉取第三方包过慢、卡住解决方案
修改go env,选用国内的代理地址下载.
- JavaScript学习总结9
今天学习了表单提交,JQuery部分知识
- 微信小程序--设置和获取剪切板内容
设置 wx.setClipboardData // 复制功能 获取 wx.getClipboardData // 粘贴功能 let _this = this wx.setClipbo ...
- Android第七周作业
1.三个界面,界面1点击按钮使用显式意图开启界面2.界面2点击按钮隐式意图开启界面3 package com.example.myapplication; import androidx.appcom ...
- Python小游戏——猜数字
1 print("--------------我爱鱼-----------") 2 temp = input("不妨猜一下甲鱼现在心里想的是哪个数字:") 3 ...