node.js - 接收 PayPal IPN 时未获取任何参数

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

我的服务器使用 Node.js,IPN 验证使用 paypal-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_sandboxfalse .这是来自 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设置,我应该看到 Received request with test_ipn parameter while sandbox is disabled,但我没有。这意味着不满足条件的另一部分 - 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设置为真,我得到同样的东西。那是因为 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 沙盒帐户中,我将在测试付款完成前对其进行审核。设置为开启

最佳答案

事实证明,不仅 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(将 code>body-parser 在你的 package.json 依赖项中)。

here获取更多信息。

关于node.js - 接收 PayPal IPN 时未获取任何参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37163910/

相关文章:

node.js - 在 Nodejs 中隐藏 URL 中的 index.html

node.js - Uncaught Error : Type HttpClient does not have 'ɵmod' property

java - 在android中使用List<NameValuePair>创建一个json字符串

ruby-on-rails - 如何在 Nginx 中启用 TLS 1.2?

ruby-on-rails - 让 ActiveMerchant PayPal Gateway 在 rails 3 上工作的问题

node.js - DialogFlow V2 Webhook - 期望语音响应立即而不是在异步请求之后

javascript - 是否可以将 JS 应用程序 + NodeJS 解释器编译成单个可执行文件?

angularjs - Angular 模块 'cordovaHTTP' 不可用

java - 保存 ServletHttpRequest (Java)

php - Laravel 在线购物车