接收 PayPal IPN 时不获取任何参数

Posted

技术标签:

【中文标题】接收 PayPal IPN 时不获取任何参数【英文标题】:Getting no parameters when receiving 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 沙盒帐户中,我有在测试付款完成前查看它们。设置为开启

【问题讨论】:

【参考方案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了解更多信息。

【讨论】:

我一直在寻找这个问题的答案... 几天。谢谢

以上是关于接收 PayPal IPN 时不获取任何参数的主要内容,如果未能解决你的问题,请参考以下文章

python cgi监听器获取空的paypal IPN

收不到 PayPal IPN 回调

如何使用 sandbox.paypal 获取 IPN 进行支付

PayPal IPN 自定义表单数据

paypal IPN 获取买家交易ID

Paypal IPN:获取买家地址