【发布时间】: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://www.paypal.com/cgi-bin/webscr" on this server.<P>
Reference #18.8d5e6cc1.1462971151.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