node.js 贝宝 https 请求

Posted

技术标签:

【中文标题】node.js 贝宝 https 请求【英文标题】:node.js paypal https request 【发布时间】:2011-12-26 18:58:37 【问题描述】:

这里是第一个问题,如果结果很明显,请道歉

我正在尝试通过 node.js 调用 paypal 自适应支付 api,并收到 580001 无效请求错误。我可以通过 curl 使用以下消息和标头成功调用,但不能通过节点。

任何帮助将不胜感激。

    var API_endpoint = "svcs.sandbox.paypal.com";   
    var API_user = '';
    var API_pass = '';
    var API_sig = '';

    message='requestEnvelope.errorLanguage=en_US&actionType=PAY&senderEmail=test_1320882990_per@gmail.com&receiverList.receiver(0).email=test2_1320887729_biz@gmail.com& receiverList.receiver(0).amount=100.00&currencyCode=USD&cancelUrl=http://your_cancel_url&  returnUrl=http://your_return_url'

    //var params = qs.parse(message);
    //params = qs.stringify(params);

    var req_options = 
        host: API_endpoint,
        method: 'POST',
        path: '/AdaptivePayments/Pay',
        headers: 
                'Host': API_endpoint,
                'Content-Type': 'application/x-www-form-urlencoded',
                //'Content-Type': 'text/namevalue',
                'Content-Length': message.length,
                'X-PAYPAL-REQUEST-DATA-FORMAT:':'NV',
                'X-PAYPAL-RESPONSE-DATA-FORMAT':'NV',
                'X-PAYPAL-SECURITY-USERID':API_user,
                'X-PAYPAL-SECURITY-PASSWORD':API_pass,
                'X-PAYPAL-SECURITY-SIGNATURE':API_sig,
                'X-PAYPAL-APPLICATION-ID':'APP-80W284485P519543T'
            
    

    fs.readFile('/home/dev/.ssh/sandbox-paypal-private.pem', 'ascii', function(err, key)
       fs.readFile('/home/dev/.ssh/sandbox-paypal-public.pem', 'ascii', function(err, cert)
            req_options.key=key
            req_options.cert=cert
            var req = https.request(req_options, function(res)
                console.log('STATUS: ' + res.statusCode);
                console.log('HEADERS: ' + JSON.stringify(res.headers));
                res.on('data', function(d)
                    var response = d.toString();
                    console.log(response)
                );
            );
            req.write(message);
            req.end();

            req.on('error', function request_error(e) 
                console.log(e);
            );
        );
    );

【问题讨论】:

【参考方案1】:

我不确定这是否只是复制粘贴问题,但您的消息变量似乎不包含格式正确的字符串。它有空格,特殊字符没有编码。

requestEnvelope.errorLanguage=en_US&actionType=PAY&senderEmail=test_1320882990_per@gmail.com&receiverList.receiver(0).email=test2_1320887729_biz@gmail.com&receiverList.receiver(0).amount=100.00&currencyCode=USD&cancelUrl=http://your_cancel_url&  returnUrl=http://your_return_url'.

应该是这样的:

requestEnvelope.errorLanguage=en_US&actionType=PAY&senderEmail=test_1320882990_per%40gmail.com&receiverList.receiver(0).email=test2_1320887729_biz%40gmail.com& receiverList.receiver(0).amount=100.00&currencyCode=USD&cancelUrl=http%3A%2F%2Fyour_cancel_url&returnUrl=http%3A%2F%2Fyour_return_url

【讨论】:

感谢您的回复,是复制粘贴问题,注释掉的函数parse和stringify会处理特殊字符 嗯,但是注释掉的函数将编码版本存储到“参数”变量而不是消息。此外,您不能使用原始 message.length 作为内容长度,因为编码会使它变得更长的字符串。【参考方案2】:

您的一个标题字段中有一个尾随冒号;而不是:

'X-PAYPAL-REQUEST-DATA-FORMAT:'

你应该有:

'X-PAYPAL-REQUEST-DATA-FORMAT'

【讨论】:

以上是关于node.js 贝宝 https 请求的主要内容,如果未能解决你的问题,请参考以下文章

Node.js log4j-like 日志系统

使用 javascript (Node.js) 规范化 URL

node.js开发环境的搭建

Node.js 贝宝休息 sdk

带你从零学Node.js

node.js 1