调试支付宝异步支付回调接口用bodyparser解析不出来请求中的body内容【已解决】
发布于 9 年前 作者 code4funlnyx 8945 次浏览 最后一次编辑是 8 年前 来自 问答

在做支付宝支付调试的时候发现,同步的接口可以正常更新数据,但是调试异步通知接口的时候发现req.body是空得,输出req.headers如下: { ‘content-type’: ‘application/x-www-form-urlencoded; text/html; charset=UTF-8’, ‘user-agent’: ‘Mozilla/4.0’, host: ‘*****’, ‘content-length’: ‘823’ }

发现 content-type诡异的既有application/x-www-form-urlencoded,又有text/html,然后用req.body取不到body中内容,输出为{},请问有没有遇到过的大大

12 回复

这算不得上很诡异, 国内很多接口设计不规范的,比如说某电商平台API,正常时返回的是 json 格式,出错的时候出你返回一个 html 格式。content-type ,呵呵了。最坑的是 json 是utf-8码的,html 是 gb2312 码的。心中一万只草泥马啊!

这种情况,想必只能在 bodyParser 前面加个中间件,判断是不是支付宝,把 content-type header 修正,让bodyparser能理解的 post 过来的内容。

你接口是https么…我没用https,notify_url基本用不了

content-type 的问题

https://cnodejs.org/topic/5566952ad4ca459f5267ac59 遇过同样的问题,这是我的解决方法。

@luoyjx notify_url 不需要 https ,亲测过 @lonso 算了,我怕被屏蔽。。。

@klesh 额,我之前试了,似乎能收到请求,但是数据拿不到

我遇到过,写了一个中间件

app.use(function (req, res, next){
  if (req.url === 'your_alipay_notify_url') {
    req.headers['content-type'] = 'application/x-www-form-urlencoded';
  }
  next();
});

在这里浪费了挺多时间 …

@luoyjx 我试过是可以的,与 https 还是 http 无关。这个是服务器对服务器直接的一个 post 动作,再加上有安全校验体系,而且只是通知类型。也没必要要求一定要是 https 的,那不合理。

我也同样被坑过了.搞了我好久

抱歉各位发了主题就跑了没回来= =,最后问题是这样解决的,跟7楼说的一样,监听事件用流的方式处理 req.on(‘data’, function (buffer) { var bufferstr = buffer.toString(‘utf8’, 0, buffer.length); var params = url.parse(‘http://www.e.com?’ + decodeURIComponent(bufferstr), true).query; var trade_status = params.trade_status;
});

就是说请求体是 application/x-www-form-urlencoded, 但是 header里混杂了 text/html ~

@magicdawn 对的,导致正常的解析都解析不出来了

回到顶部