nodejs集成支付宝所遇到的坑

2015-12-8 22:09:37

首先,使用express框架,能够接收到支付宝发来的POST notify请求,但是解析出来的body一直为空对象,然后将整个请求log出来查看,发现支付宝发来的Content-Type是一个奇葩的

application/x-www-form-urlencoded; text/html; charset=utf-8

这TM什么鬼玩意,到底是form还是html,于是bodyParser就扑街表示不认识了

解决方式也非常简单暴力,在bodyParser中间件之前添加一个中间件

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

其次是校验notify的签名时,支付宝官方给的说明是这样的

无标题

如果没注意仔细看的话,就会以为是queryString的方式拼接,于是我用了nodejs自带的querystring库,做好了queryString.stringify(),一切完美。但是签名校验对不上,过不去

后来突然想到,难道不要urlencode,不是queryString,于是把代码替换成了手工拼接字符串而不要urlencode。校验就过去了……