1
rankjie 2015-02-12 12:20:13 +08:00
如果你检查下 header 和 raw_data 就会发现支付宝的 content-type 有问题(查commit可以看到是去年9月8号我发现了这问题...),发来的 header['content-type'] 是这么个玩意儿:
application/x-www-form-urlencoded; text/html; charset=utf-8 (哪位老师可以指导下为什么是这样的吗?我看w3并没找到有这样的写法) 于是 bodyparser 看不懂这个 content-type,也就没法把数据解析出来 我现在的解决办法就是加个中间件处理下,记得放在bodyparser之前 app.use (req, res, next)-> if req.url is '/api/alipays/notify' and req.get('content-type') is 'application/x-www-form-urlencoded; text/html; charset=utf-8' req.headers['content-type'] = 'application/x-www-form-urlencoded' next() |
2
lifesurge OP @rankjie 我按照你的方法试了,确实content-type像你所说的那样,但改过以后还是不行啊:
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(function(req, res, next){ if(req.url == '/alipay/notify' && req.get('content-type') != 'application/x-www-form-urlencoded') req.headers['content-type'] = 'application/x-www-form-urlencoded'; console.log(req.headers['content-type']); // 打印 application/x-www-form-urlencoded next(); }); app.use(bodyParser.urlencoded({extended:true})) app.use(bodyParser.json()); |
3
lifesurge OP |
4
rankjie 2015-02-12 13:16:16 +08:00
把 app.use(bodyParser.json()); 放到 app.use(bodyParser.urlencoded({extended:true})) 上面试试吧...
|
5
rankjie 2015-02-12 13:17:40 +08:00 1
异步通知的数据是POST过来的,没有写在URL里。你取query能取到个蛋啊。。。都在body里啊。
|
7
aki_xavier 2015-02-12 14:06:54 +08:00
content-type的这种写法本身是没问题的,bodyparser这个plugin不认也没办法
|
8
jinwyp 2015-07-02 15:42:42 +08:00
非常感谢 解决了这个问题
|