【问题标题】:Getting no parameters when receiving PayPal IPN接收 PayPal IPN 时不获取任何参数
【发布时间】:2016-09-06 22:19:09
【问题描述】:

我使用 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.');
            }
        }
    });
});

问题是我在req.params 中没有test_ipn 变量。我怎么知道?我故意将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 参数的请求,但我没有。这意味着不满足条件的另一部分 - 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 URL,而不是沙盒 URL。

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 沙盒帐户中,我有在测试付款完成前查看它们。设置为开启

【问题讨论】:

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


    【解决方案1】:

    事实证明,不仅缺少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.');
                }
            }
        });
    });
    

    没有提到您需要解析请求。至少我没有在任何地方看到它。 确保首先使用npm install body-parsernpm install body-parser --save 安装body-parser(将body-parser 放入package.json 依赖项中)。

    here了解更多信息。

    【讨论】:

    • 我一直在寻找这个问题的答案... 几天。谢谢
    猜你喜欢
    • 2017-01-20
    • 2012-05-15
    • 1970-01-01
    • 2017-08-01
    • 2017-12-15
    • 2015-11-30
    • 1970-01-01
    • 2011-02-23
    • 2015-11-01
    相关资源
    最近更新 更多