如何修复 grant_type 错误为 NULL - 使用 Pay Pal 的 REST API 访问令牌不受支持的授权类型

Posted

技术标签:

【中文标题】如何修复 grant_type 错误为 NULL - 使用 Pay Pal 的 REST API 访问令牌不受支持的授权类型【英文标题】:How to fix grant_type error is NULL - unsupported grant type with Pay Pal's REST API for access token 【发布时间】:2019-09-10 15:29:02 【问题描述】:

我正在调用 Paypal 的 REST API 以获取访问令牌 https://developer.paypal.com/docs/api/overview/#get-an-access-token

我正在使用带有superagent 的节点来进行 AJAX 调用。

这是我的代码:

const basicAuth = Buffer.from(`$PAYPAL_CLIENT:$PAYPAL_SECRET`).toString('base64')

request
  .post(PAYPAL_OAUTH_API)
  .set('Accept', 'application/json')
  .set('grant_type', 'client_credentials')
  .set('Authorization', `Basic $basicAuth`)
  .send()
  .end((result) => 
    console.log(result.response.error)
  )

这是我遇到的错误日志


 Error: cannot POST /v1/oauth2/token/ (400)
    at Response.toError (C:\Users\shlomo\projects\tribewise-backend-v1\node_modules\superagent\lib\node\response.js:94:15)
    at ResponseBase._setStatusProperties (C:\Users\shlomo\projects\tribewise-backend-v1\node_modules\superagent\lib\response-base.js:123:16)
    at new Response (C:\Users\shlomo\projects\tribewise-backend-v1\node_modules\superagent\lib\node\response.js:41:8)
    at Request._emitResponse (C:\Users\shlomo\projects\tribewise-backend-v1\node_modules\superagent\lib\node\index.js:850:20)
    at parser (C:\Users\shlomo\projects\tribewise-backend-v1\node_modules\superagent\lib\node\index.js:1036:38)
    at IncomingMessage.res.on (C:\Users\shlomo\projects\tribewise-backend-v1\node_modules\superagent\lib\node\parsers\json.js:19:7)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)
  status: 400,
  text: '"error":"unsupported_grant_type","error_description":"Grant Type is NULL"',
  method: 'POST',
  path: '/v1/oauth2/token/' 

为什么我收到错误 unssuported grant type - grant type 为 NULL? 在邮递员中它可以工作,但我无法让它与超级代理和节点一起工作。 Paypal 给出了两个例子here 和 postman 和 curl。为什么它不能与 superagent 一起使用?

【问题讨论】:

【参考方案1】:

来自您链接到的贝宝文档:

如果您使用 cURL 以外的命令行工具,请将 Accept header 设置为 application/x-www-form-urlencoded

来自您链接到的 superget 文档:

默认发送字符串会将Content-Type设置为application/x-www-form-urlencoded

所以将您的请求更改为:

// PAYPAL_LINK = "https://api.sandbox.paypal.com"
// PAYPAL_OAUTH_API = "/v1/oauth2/token"
request(PAYPAL_LINK)
  .post(PAYPAL_OAUTH_API)
  .send('grant_type=client_credentials')
  .auth(PAYPAL_CLIENT, PAYPAL_SECRET)
  .then(response => console.log(response))
  .catch(error => console.error(error))

如果您希望回复为json,可选择设置Accept: application/json

【讨论】:

我试过了,最后通过的结果对象是NULL。一点反应都没有。奇怪 更新了答案(正在检查错误的属性)。还添加了错误处理程序来检查错误检查现在 结果仍为 NULL。这里是日志` C:\Users\shlomo\projects\tribewise-backend-v1\app\controllers\miscellaneous.js:140 console.log(result.body); ^ 类型错误:无法在 C:/Users/shlomo/projects/tribewise-backend-v1/app/controllers/miscellaneous.js:123:24 处读取 null 的属性“body”` 已更新答案,尝试替换您的 Authorization 标头 我想通了。它显示为 null 因为我错误地使用了 .end() 承诺。根据 superagent 文档的 .end() 承诺返回 2 个值:.end(err, res)。第一个值为空,因为代码没有错误。我不应该使用旧的回调样式 .end()。我应该使用 .then() 和 .catch()。如果使用 .end() ,则传入的第二个参数是响应值。你的回答确实是对的!它需要格式化为 application/x-www-form-urlencoded。这解决了 grant_type 问题。请更新您的答案以反映这一点。谢谢!

以上是关于如何修复 grant_type 错误为 NULL - 使用 Pay Pal 的 REST API 访问令牌不受支持的授权类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复错误:类型 'Null' 不是类型 '() => void' 的子类型

如何修复未捕获的类型错误:无法读取 null 的属性“值”

如何修复错误:在 null 上调用了 getter 'email'。接收者:空尝试呼叫:电子邮件

如何修复“value null Copy-Item Powershell”错误

如何在php中修复“未捕获的错误:在null上调用成员函数insertOne()”

错误:如何在 Opencv python 中修复“SystemError:<built-in function imshow> 返回 NULL 而未设置错误”