我使用 node.js 和 express 创建了一个 paypal ipn 侦听器。这是我的监听器代码:
exports.ipn = function(req, res, next) {
    console.log('Paypal');
    var ipn = require('paypal-ipn');
    if(typeof req.body != "undefined") {
        ipn.verify(req.body, function callback(err, msg) {
            if (err) {
                winston.error('IPN: ' + err);
            } else {
                if (req.body.payment_status == 'Completed' && msg == "VERIFIED") {
                    winston.info('IPN: ' + msg + " " + req.body.txn_id + " " + req.body.payer_email);
                }
            }
            res.send(200);
            res.end();
        });
    }
    res.send(200);
    res.end();
};
这是我的 expressjs 设置和路线:
    var app = express();
    // all environments
    app.set('port', process.env.PORT || 3000);
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    // development only
    if ('development' == app.get('env')) {
      app.use(express.errorHandler());
    }
    app.get('/', routes.index);
    app.options('/', routes.options);
    app.post('/', routes.up);
    app.post('/ipn', routes.ipn);
    http.createServer(app).listen(app.get('port'), function(){
      console.log('Express server listening on port ' + app.get('port'));
    });
我使用这个模块https://github.com/andzdroid/paypal-ipn来验证 ipn 消息,它可以与 paypal ipn 模拟器一起正常工作,但是当我尝试实时使用它时,我将它发送到我的节点控制台:
undefined
POST /ipn 500 351ms
没有其他错误消息,只有这个错误 500 和未定义。有人可以帮我找出这个未定义的变量是什么以及为什么会发生这个错误 500。即使我注释掉侦听器中的所有内容,它也会发生。
编辑:
我将 paypal ipn url 更改为一些我没有定义的随机 url。我仍然得到未定义和错误 500。如果我使用 curl 发布我应该得到错误 404。
编辑:
我发现如果我像这样使用 curl 发布:
curl -d "test" -A "-" http://127.0.0.1/randomurl
然后我会得到错误 500。这给了我 404:
curl -d "test=er" -A "-" http://127.0.0.1/randomurl