节点表达bodyParser for Paypal IPN

时间:2013-04-05 18:20:28

标签: node.js post express paypal-ipn

我正在尝试使用paypal ipn为我的node.js表达app工作,我必须通过“按照接收到的确切顺序发回内容”并在它之前验证ipn消息使用命令_notify-validate“。他们提供的示例是一个像这样的查询字符串:

https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&mc_gross=19.95&protection_eligibility=Eligible&address_status=confirmed&payer_id=LPLWNMTBWMFAY&tax=0.00&...&payment_gross=19.95&shipping=0.00

但是,因为我正在使用bodyParser,所以request.body是一个json对象。如果我要附加“cmd = _notify-validate”并将其发回,我将如何将其作为简单的查询字符串接收并将其作为简单的查询字符串发送而不必删除bodyParser?我仍然需要在此路由上使用json解析版本来实际解释数据。另外,在服务器端发送POST看起来像什么? (我只是做res.send(str)吗?)

3 个答案:

答案 0 :(得分:1)

我使用paypal-ipn模块作为节点,事实证明一个json解析的身体很好。我使用这个模块的主要问题是确保用res.send(200)响应,否则paypal的ipn会每隔一段时间发送一次消息。这是帮助的代码:

exports.ipn = function(req,res){
    var params = req.body
    res.send(200);

    ipn.verify(params, function callback(err, msg) {
        if (err) { console.log(err); return false }

        if (params.payment_status == 'Completed') {

            // Payment has been confirmed as completed
            // do stuff, save transaction, etc.
        }
    });
}

答案 1 :(得分:1)

由于您确实询问过如何发出HTTP POST请求,因此您就是这样做的。

var options = {
  host: 'example.com',
  port: '80',
  path: '/pathname',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length
  }
};

var post_req = http.request(options, function (res) {
  res.setEncoding('utf8');
  var chunks = '';
  res.on('data', function (chunk) {
    chunks += chunk;
  });
  res.on('end', function() {
    console.log(chunks);
  });
});

post_req.write(post_data);
post_req.end();

答案 2 :(得分:0)

我也为这个IPN努力了一两天才能让它发挥作用。我在bodyparser和url-encoded方面遇到了类似的问题。

以下是NodeJS中的一些工作示例代码,用于侦听传入的IPN消息并对Paypal Sandbox进行验证。

https://github.com/HenryGau/node-paypal-ipn

您可以在mocha subscriptionMessage.js文件夹中tests运行subscriptionMessage.js来模仿/模拟Paypal IPN消息。

希望它有所帮助。