如何使用node-fetch模块模拟curl请求

时间:2019-01-29 12:15:45

标签: javascript node.js curl paypal paypal-sandbox

我有一个电子商务应用程序,并尝试联系到paypal rest api,即“ paypal for partners”服务,我确实读过Paypal Documentation,其所有内容都很好,但问题是他们提到了使用示例curl的请求示例:

curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
   -H "Accept: application/json" \
   -H "Accept-Language: en_US" \
   -u "client_id:secret" \
   -d "grant_type=client_credentials"

使用具有基本Auth的邮递员:

  • 用户名:您的客户ID。

  • 密码:您的秘密。

iam试图实现同样的事情,但是使用从node.js获取节点

const fetch = require('node-fetch');

function authenticatePaypal() {
    fetch('https://api.sandbox.paypal.com/v1/oauth2/token', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Accept-Language': 'en_US',
            'client_id': 'secret'
        },
        body: {
            "grant_type": "client_credentials"
        }
    }).then(reply => {
        console.log('success');
        console.log(reply);
    }).catch(err => {
        console.log('error');
        console.log(err);
    });
}

module.exports = {
    authenticatePaypal: authenticatePaypal
};

我得到401未经授权的回应:

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]:
   { body:
      PassThrough {
        _readableState: [ReadableState],
        readable: true,
        _events: [Object],
        _eventsCount: 2,
        _maxListeners: undefined,
        _writableState: [WritableState],
        writable: false,
        allowHalfOpen: true,
        _transformState: [Object] },
     disturbed: false,
     error: null },
  [Symbol(Response internals)]:
   { url: 'https://api.sandbox.paypal.com/v1/oauth2/token',
     status: 401,
     statusText: 'Unauthorized',
     headers: Headers { [Symbol(map)]: [Object] } } }

我尝试过邮递员,并且在邮递员中工作,我知道我的节点获取实现中有问题,这是我第一次处理json格式的基本Auth。

2 个答案:

答案 0 :(得分:1)

授权标头错误。

-u "client_id:secret"

说curl正在使用Basic Authentication

您应该添加授权标头

Authorization: Basic <base64 encoded "client_id:secret">

答案 1 :(得分:1)

以您的解决方案为基础的解决方案,因为我花了几分钟才能使它起作用。

// get the client_id and secret from https://developer.paypal.com/developer/applications/
const clientIdAndSecret = <client_id:secret>
const base64 = Buffer.from(clientIdAndSecret).toString('base64')

fetch('https://api.sandbox.paypal.com/v1/oauth2/token', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept-Language': 'en_US',
        'Accept': 'application/json',
        'Authorization': `Basic ${base64}`,
      },
      body: 'grant_type=client_credentials'
})