当前位置: 首页 > 知识库问答 >
问题:

Node.js中的Paypal express结帐(错误10410)

章宏恺
2023-03-14

我无法成功解析返回的令牌来验证最终的Paypal沙箱支付过程。如有任何帮助或投入,将不胜感激:)

ACK: 'Failure',
VERSION: '52.0',
BUILD: '22708556'
L_ERRORCODE0: '10410',
L_SHORTMESSAGE0: 'Invalid token',
L_LONGMESSAGE0: 'Invalid token.',
L_SEVERITYCODE0: 'Error'
<form id="myContainer" method="post" action="/api/payment/payone"></form>
    <script>
        window.paypalCheckoutReady = function () {
           paypal.checkout.setup('XXX', {
           environment: 'sandbox',
           container: 'myContainer'
           });
        };
     </script>
     <script src="//www.paypalobjects.com/api/checkout.js" async></script>

API:

payone: function(req, res) {
    var paypal = require('paypal-express-checkout').init('username', 'password', 'signature', 'return url', 'cancel url', 'debug');



    paypal.pay('20130001', 10.00, 'XX', 'USD', false, function(err, url) {
        if (err) {
            console.log(err);
            return;
        }
        res.redirect(url);
    });


    paypal.detail( "token", "PayerID", function(err, data, invoiceNumber, price) {

        if (err) {
            console.log(err);
            return;
        }
    });

}

最后,paypal-express文档:

var parser = require('url');
var https = require('https');
var qs = require('querystring');

function Paypal(username, password, signature, returnUrl, cancelUrl, debug) {
this.username = "XXX";
this.password = "XXX";
this.solutiontype = 'Mark';
this.signature = "XXX";
this.debug = debug || false;
this.returnUrl = 'XXX';
this.cancelUrl = 'XXX';
this.url = 'https://' + 'api-3t.sandbox.paypal.com' + '/nvp';   //'https://' +        (debug ? 'api-3t.sandbox.paypal.com' : 'api-3t.paypal.com') + '/nvp';
this.redirect = 'https://' + 'www.sandbox.paypal.com/cgi-bin/webscr';      //https://' + (debug ? 'www.sandbox.paypal.com/cgi-bin/webscr' : 'www.paypal.com/cgi-bin/webscr');
};

Paypal.prototype.params = function() {
var self = this;
return {
    USER: self.username,
    PWD: self.password,
    SIGNATURE: self.signature,
    SOLUTIONTYPE: self.solutiontype,
    VERSION: '52.0'
};
console.log(self);
};


Paypal.prototype.detail = function(token, payer, callback) {

if (token.get !== undefined && typeof(payer) === 'function') {
    callback = payer;
    payer = token.get.PayerID;
    token = token.get.token;
}

console.log(token);
var self = this;
var params = self.params();




params.TOKEN = token;
params.METHOD = 'GetExpressCheckoutDetails';

self.request(self.url, 'POST', params, function(err, data) {



    if (err) {
        callback(err, data);
        return;
    }

    if (typeof(data.CUSTOM) === 'undefined') {
        callback(data, null);
        return;
    }

    console.log('3.3');
    var custom = data.CUSTOM.split('|');
    var params = self.params();

    params.PAYMENTACTION = 'Sale';
    params.PAYERID = payer;
    params.TOKEN = token;
    params.AMT = custom[1];
    params.CURRENCYCODE = custom[2];
    params.METHOD = 'DoExpressCheckoutPayment';


    self.request(self.url, 'POST', params, function(err, data) {

        if (err) {
            callback(err, data);
            return;
        }
        console.log('3.4');
        callback(null, data, custom[0], custom[1]);
    });
});

return self;
};




 Paypal.prototype.request = function(url, method, data, callback) {




var self = this;
var params = qs.stringify(data);

if (method === 'GET')
    url += '?' + params;

var uri = parser.parse(url);
var headers = {};


headers['Content-Type'] = method === 'POST' ? 'application/x-www-form-urlencoded' : 'text/plain';
headers['Content-Length'] = params.length;

var location = '';
var options = { protocol: uri.protocol, auth: uri.auth, method: method || 'GET', hostname: uri.hostname, port: uri.port, path: uri.path, agent: false, headers: headers };

var response = function (res) {
    var buffer = '';

    res.on('data', function(chunk) {
        buffer += chunk.toString('utf8');
    })

    req.setTimeout(exports.timeout, function() {
        callback(new Error('timeout'), null);
    });

    res.on('end', function() {

        var error = null;
        var data = '';

        if (res.statusCode > 200) {
            error = new Error(res.statusCode);
            data = buffer;
        } else
            data = qs.parse(buffer);

        callback(error, data);
    });
};

var req = https.request(options, response);

req.on('error', function(err) {
    callback(err, null);
});

if (method === 'POST')
    req.end(params);
else
    req.end();

return self;
};

Paypal.prototype.pay = function(invoiceNumber, amount, description, currency,      requireAddress, callback) {

// Backward compatibility
if (typeof(requireAddress) === 'function') {
    callback = requireAddress;
    requireAddress = false;
}

var self = this;
var params = self.params();


params.PAYMENTACTION = 'Sale';
params.AMT = prepareNumber(amount);
params.RETURNURL = self.returnUrl;
params.CANCELURL = self.cancelUrl;
params.DESC = description;
params.NOSHIPPING = requireAddress ? 0 : 1;
params.ALLOWNOTE = 1;
params.CURRENCYCODE = currency;
params.METHOD = 'SetExpressCheckout';
params.INVNUM = invoiceNumber;
params.CUSTOM = invoiceNumber + '|' + params.AMT + '|' + currency;

self.request(self.url, 'POST', params, function(err, data) {

    if (err) {
        callback(err, null);
        return;
    }

    if (data.ACK === 'Success') {
        callback(null, self.redirect + '?cmd=_express-    checkout&useraction=commit&token=' + data.TOKEN);
        return;
    }

    callback(new Error('ACK ' + data.ACK + ': ' + data.L_LONGMESSAGE0), null);
});

return self;
console.log(self);
 };


 function prepareNumber(num, doubleZero) {
var str = num.toString().replace(',', '.');

var index = str.indexOf('.');
if (index > -1) {
    var len = str.substring(index + 1).length;
    if (len === 1)
        str += '0';
    if (len > 2)
        str = str.substring(0, index + 3);
} else {
    if (doubleZero || true)
        str += '.00';
}
return str;
};

exports.timeout = 10000;
 exports.Paypal = Paypal;

exports.init = function(username, password, signature, returnUrl, cancelUrl,    debug) {
return new Paypal(username, password, signature, returnUrl, cancelUrl, debug);
 };

 exports.create = function(username, password, signature, returnUrl, cancelUrl, debug) {
return exports.init(username, password, signature, returnUrl, cancelUrl,   debug);
 };

共有1个答案

范云
2023-03-14

通常,如果存在不正确的令牌或没有传递令牌,我们会遇到错误10410。请确保您传递的是正确的PayPal Express令牌。

有关错误代码的信息,请参阅:https://developer.paypal.com/docs/classic/api/errorcodes/

 类似资料:
  • 问题内容: 我正在尝试通过节点https.request()获得一个网页。这样做会导致我的代码记录错误。使用节点请求模块具有相同的结果: 请求的问题:140398870042432:错误:140773F2:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报意外消息:s23_clnt.c:658: 以下内容指示使用了错误的SSL版本,但我找不到更改版本的方法:url错误:“ss

  • 终端打印消息,如下所示: 错误:at对象。(/users/suoyong/express//error.js:1:73)在module._compile(module.js:556:32)在object.module._extensions...js(module.js:565:10)在module.load(module.js:473:32)在tryModuleLoad(module.js:43

  • 问题内容: 最近,我的运行Node.js的网站收到了大量访问量。随着流量的增加,它开始崩溃很多,这是以前从未发生过的。我的日志中出现以下错误: 有人知道为什么会崩溃吗?和想法如何解决呢? 我正在使用Express.js和Socket.io。它可以在Ubuntu上运行。 问题答案: 错误表示操作系统拒绝您的程序打开更多文件/插槽。 看一下:如何更改Linux中打开文件的数量限制?

  • 问题内容: 为什么我无法连接到mysql服务器? 在同一台服务器上,Apache / PHP服务器正在运行,并且连接正常! 更新 问题答案: 如果以前能解决这个问题,我的第一个猜测就是您已经在后台运行了持有连接的node.js脚本副本。 我认为连接被拒绝是tcp / ip错误消息,而不是来自MySQL的消息,它表明该连接未运行或正在其他端口上运行或通过套接字运行。 您可以尝试远程登录到端口3308

  • 怎么修好?oAuth2有问题吗?

  • 问题内容: 我知道Node.js中不存在,但是我在客户端和服务器上都使用React和相同的代码。我用来检查是否存在的任何方法都可以使我: 未捕获ReferenceError:未定义窗口 如何解决我做不到的事实? 问题答案: Sawtaytoes知道了。我将运行您在componentDidMount()中拥有的任何代码,并将其包含在以下内容中: 如果在React渲染组件时仍未创建窗口对象,则始终可以