在做支付宝支付调试的时候发现,同步的接口可以正常更新数据,但是调试异步通知接口的时候发现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中内容,输出为{},请问有没有遇到过的大大
这算不得上很诡异, 国内很多接口设计不规范的,比如说某电商平台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 遇过同样的问题,这是我的解决方法。
@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 对的,导致正常的解析都解析不出来了