收到PayPal IPN时没有参数

时间:2016-05-11 13:18:41

标签: node.js http paypal paypal-ipn paypal-sandbox

我使用Node.js作为我的服务器,使用paypal-ipn进行IPN验证。当我从the Simulator向我自己发送IPN(我的IP +端口转发)时,我在模拟器页面上看到已发送IPN并且已验证握手。消息。所以我的听众工作正常。

这是我的服务器代码:

ipn = require('paypal-ipn');
app.post('/ipn', function(req, res){
    res.sendStatus(200);

    ipn.verify(req.params, {'allow_sandbox':false}, function callback(err, msg){
        if(err){
            console.log(err);
        } else {
            console.log('Verify no error.');
            if(params.payment_status == 'Completed') {
                console.log('Payment completed.');
            }
        }
    });
});

问题是我在test_ipn中没有req.params变量。我怎么知道的?我故意将allow_sandbox设置为false。这是paypal-ipn代码的一部分:

if (params.test_ipn && !settings.allow_sandbox) {
    process.nextTick(function () {
        callback(new Error('Received request with test_ipn parameter while sandbox is disabled'));
    });
    return;
}

如果allow_sandbox被禁用(它是)并且我设置了test_ipn,我应该看到带有test_ipn参数的已接收请求,而沙箱被禁用,但我不知道#39;吨。这意味着不满足条件的其他部分 - 缺少test_ipn。我明白了这一点:

Error: IPN Verification status: <HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http&#58;&#47;&#47;www&#46;paypal&#46;com&#47;cgi&#45;bin&#47;webscr" on this server.<P>
Reference&#32;&#35;18&#46;8d5e6cc1&#46;1462971151&#46;3d758294
</BODY>
</HTML>

    at IncomingMessage.response_end (C:\Users\Hristiyan\Desktop\StickGame\node_modules\paypal-ipn\lib\paypal-ipn.js:57:18)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:926:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

请注意,它会尝试使用实时paypal网址,而不是沙盒网址。

如果allow_sandbox设置为true,我会得到同样的结果。这是因为paypal-ipn收到没有test_ipn设置的请求,并认为IPN是真实的,而不是。

我还尝试自己将test_ipn添加到请求中,但之后,我手动更改了初始请求,这使得事务无效并显示:

Error: IPN Verification status: INVALID
    at IncomingMessage.response_end (C:\Users\Hristiyan\Desktop\StickGame\node_modules\paypal-ipn\lib\paypal-ipn.js:57:18)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:926:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

在我的PayPal沙盒帐户中,我在完成测试付款之前查看测试付款。设置为开启

1 个答案:

答案 0 :(得分:3)

事实证明,不仅test_ipn参数丢失了,而且还有所有其他关于付款的参数。当我console.log(req.params)时,我得到了一个空对象{}

我必须做的是添加body-parser ...解析请求正文,使事情有效并将实际的IPN参数放在req.body中。一旦我添加了,交易就会得到验证。

以下是代码:

ipn = require('paypal-ipn');
bodyParser = require('body-parser');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
    extended: true
})); 
app.post('/ipn', function(req, res){
    var params = req.body;

    res.sendStatus(200);

    ipn.verify(params, {'allow_sandbox':true}, function callback(err, msg){
        if(err){
            console.log(err);
        } else {
            console.log('Verify no error.');
            if(params.payment_status == 'Completed') {
                console.log('Payment completed.');
            }
        }
    });
});

没有提到您需要解析请求。至少我在任何地方都没有看到它。 请务必先使用body-parsernpm install body-parser安装npm install body-parser --save(将body-parser放入package.json个相关内容中。

转到here了解详情。