【问题标题】:Quickbooks php curl authenticated GET request failsQuickbooks php curl经过身份验证的GET请求失败
【发布时间】:2021-09-01 02:35:21
【问题描述】:

我在 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 是沙盒 URL(与标题中的“沙盒基础 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

请求标头(由 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

(授权令牌和公司ID已被剪切)

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

【问题讨论】:

    标签: php http curl quickbooks intuit


    【解决方案1】:

    这里有很多看起来有点时髦的东西......我会从尝试这些东西开始:

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

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

    【讨论】:

    • 谢谢,就是这样 - 它适用于您提到的更改!
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多