Quickbooks php curl 认证的 GET 请求失败

Quickbooks php curl authenticated GET request fails

我在 QuickBooks 开发者门户中成立了一家公司,并成功创建了一个 OAuth 令牌(我可以刷新 as specified in this answer)。因此,与这些问题中的大多数不同,这是关于 OAuth 的 而不是 ......我在这里使用裸 PHP,因为出于技术原因我无法使用 SDK。

获取 OAuth 令牌后,我尝试从 API 游乐场执行下一个 API 调用,获取公司信息。我用这段代码有效地调用了 QB API:

$query/v3/company/<companyID>/companyinfo/<companyID>(companyID 是来自 API 游乐场的“领域 ID”),$base 是 sandbox-URL(与header中的“Sandbox Base URL”,$access_tokens["access"]是OAuth访问令牌;$urlhttps://${base}${query})

$headers = array(
    "GET " . $query . " HTTP/2",
    "Host: " . $base,
    "Accept: application/json",
    "Authorization: Bearer " . $access_tokens["access"],
    "Production Base URL: https://quickbooks.api.intuit.com",
    "Sandbox Base URL: https://sandbox-quickbooks.api.intuit.com"
);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_HEADER, true);
$output = curl_exec($curl);

调用后$output的值为:

HTTP/2 400 
date: Tue, 31 Aug 2021 14:42:55 GMT
content-type: text/plain
content-length: 11
server: envoy

Bad Request

请求 headers(由 QB 服务器通过 curl_getinfo 返回)是:

GET /v3/company/4...0/companyinfo/4...0 HTTP/2
Host: sandbox-quickbooks.api.intuit.com
accept: application/json
authorization: Bearer e...Q
production base url: https://quickbooks.api.intuit.com
sandbox base url: https://sandbox-quickbooks.api.intuit.com

(auth token 和 company ID 已被截断)

如果我直接在浏览器中调用 URL,我会按预期收到 401(身份验证错误),因此我假设 OAuth 部分有效(正如我所说,我可以成功检索访问令牌并且刷新它)。我只是想知道是否还有其他我做错的事情导致 QB API 调用失败?

这里有很多看起来有点古怪的东西......我会先尝试这些东西:

  • 删除无效 GET header。 GET 不是有效的 HTTP header(它是 method/verb 的一部分),您不应该尝试以这种方式指定 HTTP/2。删除这个:
"GET " . $query . " HTTP/2",
  • 删除另外两个无效的 HTTP header。看起来您在这里混淆了 Intuit 的 HTTP headers 文档。这些是无效的 header,您不应该发送它们:
"Production Base URL: https://quickbooks.api.intuit.com",
"Sandbox Base URL: https://sandbox-quickbooks.api.intuit.com"
  • 不要将 Host: header 指定给 cURL。没有理由这样做,而且它可能会与您传递给 cURL 的 URL 发生冲突。 cURL 会计算并发送给您。
"Host: " . $base,

我还会检查以确保您将请求发送到正确的 URL。如果是沙盒公司,就去沙盒URL。如果是制作公司,就去制作URL.