接收 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://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 沙盒帐户中,我有在测试付款完成前查看它们。设置为开启。
【问题讨论】:
【参考方案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-parser
或npm install body-parser --save
安装body-parser
(将body-parser
放入package.json
依赖项中)。
去here了解更多信息。
【讨论】:
我一直在寻找这个问题的答案... 几天。谢谢以上是关于接收 PayPal IPN 时不获取任何参数的主要内容,如果未能解决你的问题,请参考以下文章