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访问令牌;$url
是https://${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.
我在 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访问令牌;$url
是https://${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.