我的服务器使用 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_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
设置,我应该看到 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://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 网址,而不是沙盒网址。
与 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-parser
或 npm install body-parser --save
安装 body-parser
(将 code>body-parser
在你的 package.json
依赖项中)。
去here获取更多信息。
关于node.js - 接收 PayPal IPN 时未获取任何参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37163910/