如何使用节点提取模块模拟 curl 请求



我有一个电子商务应用程序,并尝试联系PayPal REST API,特别是"合作伙伴PayPal"服务,我确实阅读了PayPal文档,它都很好,但问题是他们提到了使用 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"

使用具有基本身份验证的邮递员:

  • 用户名:您的客户 ID。

  • 密码:您的秘密。

我正在尝试实现同样的事情,但使用从节点获取的节点.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] } } }

我尝试了 Post Man,它在 Postman 中工作,我知道我的节点获取实现有问题,这是我第一次处理 JSON 格式的基本身份验证。

授权标头错误。

-u "client_id:secret"

表示 curl 正在使用基本身份验证。

您应该添加授权标头

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

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

// 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'
})

相关内容

  • 没有找到相关文章

最新更新