支付宝支付回调通知时失败,获取到的参数为空

最近公司在开发一个涉及金额交易的app, 需要集成 支付宝与微信支付, 在写支付宝支付后台接口时遇到一个大坑, 在这里记录一下, 方便需要的人及时解决问题.


开发环境 路由模块
nodejs koa

问题

付款成功后支付宝异步通知到达了我们的服务器, 但是接收到的参数为空.


原因

支付宝使用的是非标准协议, content-type 中使用的是 application/x-www-form-urlencoded; text/html; charset=UTF-8, 进而导致 koa 的解析模块 koa-bodyparser 无法正常解析


解决方法

koa-bodyparser 中间件执行前手动修改 content-type 为标准模式

var koa = require('koa')
const bodyparser = require('koa-bodyparser')
var router = require('./router')
var app = koa()

app.use(function*(next) {
  if (this.request.method !== 'GET' && this.request.path === '支付宝支付回调通知路径') {
    this.request.headers['content-type'] = 'application/x-www-form-urlencoded'
  }
  yield next
});
app.use(bodyparse())
app.use(router.routes())
app.listen(80, function(){
  console.log("App is running on 80")
})
0%