背景

在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对象有如下事件:abortedclosedataenderror,此外,请求参数还有可能使用了压缩算法。如何对这些场景做更完整的处理呢?

借用中间件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参数的更多相关文章

  1. .NET CORE 获取微信支付回调

    1.获取微信支付的回调的数据 Stream stream = HttpContext.Request.Body; byte[] buffer = new byte[HttpContext.Reques ...

  2. php对微信支付回调处理的方法(合集)

    支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答. 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽 ...

  3. .NET开发微信小程序-接收微信支付回调数据

    获取微信支付传回来的数据 1.MVC控制器 /// <summary> /// 付款返回的数据 /// </summary> /// <returns></r ...

  4. PHP7 微信支付回调失败 解决

    升级完PHP7 发现微信支付回调失败.原来是 $GLOBALS['HTTP_RAW_POST_DATA'];没有定义的问题.php7 移除了这个全局变量. 问题代码如下: 微信API :WxPay.A ...

  5. ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题

    原文:ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/MrTra ...

  6. 微信支付重复回调,java微信支付回调问题

    这几天一直在研究微信支付回调这个问题,发现之前微信支付回调都是正常的也没怎么在意,今天在自己项目上测试的时候发现相同的代码在我这个项目上微信支付回调老是重复执行导致支付成功之后的回调逻辑一直在执行,很 ...

  7. 微信支付回调,XXE攻击漏洞防止方法

    最近微信支付回调发现的XXE攻击漏洞(什么是XXE攻击,度娘.bing去搜,一搜一大把),收到通知后即检查代码, 微信给的解决方法是如果你使用的是: XmlDocument: XmlDocument ...

  8. springboot的restful风格获取请求中携带的参数

    http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...

  9. 在vue中获取微信支付code及code被占用问题的解决?

    这个地方坑比较多,查看网上并没有详细的文档,新手一般写到这里很痛苦.这里我只介绍一下我解决的方案,虽然它不是最好的,但是可行的方案: 总体分两步 1)跳到微信支付链接,它会自动拼接上code 2)获取 ...

随机推荐

  1. 体育类1.2.0版本 带有社交性质的 app 并且有内购功能

    上架经历 体育类1.2.0版本 应用是体育类的,带有社交性质的 app 并且有内购功能 - 关于内购 最初级的应该是内购的 产品类型 在开发者一开始设置的时候没有注意到区别: 消耗型产品 非消耗型 非 ...

  2. numpy教程03---ndarray的运算

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  3. SpringMVC的数据响应方式-页面跳转

    1.返回字符串形式 直接返回字符串:此种方式会返回字符串与视图解析器的前后缀拼接后跳转 有关视图解析器的拼接请访问此地址 注意:WEB-INF下的资源一般不能访问,因为转发是服务器的操作所以可以访问到 ...

  4. Hyperledger Fabric的test-network启动过程Bash源码详解

    前言 在基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例中,我们已经完成了Fabric 2.4的环境搭建及fabric-samples/test-network官 ...

  5. Windows原理深入学习系列-强制完整性检查

    这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...

  6. box-shadow-阴影,你真的懂吗

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  7. JuiceFS 缓存预热详解

    缓存预热是一个比较常见的概念,相信很多小伙伴都有所了解.对于 JuiceFS 来说,缓存预热就是将需要操作的数据预先从对象存储拉取到本地,从而获得与使用本地存储类似的性能表现. 缓存预热 JuiceF ...

  8. 【职场必备】6个免费良心网站&职场办公网站(收藏血赚)

    1.随机自动生成头像的网站:https://www.tool22.com/Tools-SJTX.html2.迅捷PDF转换器:https://app.xunjiepdf.com/3.全网音乐下载:① ...

  9. CRUSE: Convolutional Recurrent U-net for Speech Enhancement

    CRUSE: Convolutional Recurrent U-net for Speech Enhancement 本文是关于TOWARDS EFFICIENT MODELS FOR REAL-T ...

  10. [AcWing 779] 最长公共字符串后缀

    点击查看代码 #include<iostream> using namespace std; const int N = 200; string str[N]; int n ; int m ...