首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接收PayPal网络时不获取参数

接收PayPal网络时不获取参数
EN

Stack Overflow用户
提问于 2016-05-11 13:18:41
回答 1查看 389关注 0票数 0

我使用Node.js作为我的服务器,paypal用于IPN验证.当我从模拟器发送一个IPN到我自己(我的IP +端口转发)时,我看到IPN被发送并且握手被验证了。所以我的听众工作正常。

这是我的服务器代码:

代码语言:javascript
复制
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,.This是paypal-ipn代码的一部分。

代码语言:javascript
复制
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丢失了。相反,我看到的是:

代码语言:javascript
复制
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设置为真,我得到了同样的东西。这是因为paypal-ipn接收到一个没有test_ipn集的请求,并且当它不是的时候认为IPN是真实的。

我还尝试自己将test_ipn添加到请求中,但随后手动更改了初始请求,这使得事务无效,并显示如下:

代码语言:javascript
复制
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沙箱帐户上,我在审查测试付款完成之前,将其设置为 On 。

EN

回答 1

Stack Overflow用户

发布于 2016-05-11 14:17:17

结果发现,不仅缺少test_ipn参数,而且还缺少所有其他有关支付的参数。当我做console.log(req.params)时,我得到了一个空对象{}

我要做的是添加body-parser。解析请求体,使事情正常工作,并在req.body中放置实际的IPN参数。一旦我加上这个,交易就被验证了。

下面是代码:

代码语言:javascript
复制
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安装npm install body-parsernpm install body-parser --save(将body-parser放在package.json依赖项中)。

请访问这里以获得更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37163910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档