Quickbooks Online 中的 ApplicationAuthenticationFailed 错误 API

ApplicationAuthenticationFailed error in Quickbooks Online API

当我使用 'Postman' 运行 Quickbooks Online API 时,它工作正常。 Postman 自动生成 nonce 和 oauth_signature 值。但是当我 运行 API 使用 PHP 时,我遇到了以下错误。

message=ApplicationAuthenticationFailed; errorCode=003200; statusCode=401 SignatureBaseString: POST&https%3A%2F%2Fsandbox-quickbooks.api.intuit.com%2Fv3%2Fcompany%2F193514525%2Faccount&oauth_consumer_key%3DqyprdH7kq5iG34sV2fSaj9tKC1KzXG%26oauth_nonce%3DFWXxbP%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1491976910%26oauth_token%3DqyprdDXeKDQonYAz8O0OSnyewIsg34HjxZyH0X4Dk5dNE5LC%26oauth_version%3D1.0

我觉得可能跟生成签名值有关。我使用了 PHP '$oauth->generateSignature()' 函数来生成签名。它产生价值。但是仍然出现授权错误。请帮我解决问题。

这里我提供我使用的代码。

$ar =   array(
'authorization: OAuth oauth_consumer_key="'.OAUTH_CONSUMER_KEY.'",oauth_token="'.ACCESS_TOKEN_SECRET.'",oauth_signature_method="HMAC-SHA1",oauth_timestamp="'.$time.'",oauth_nonce="'.$randomvalue.'",oauth_version="1.0",oauth_signature="'.$signaturevalue.'"',
"cache-control: no-cache",
"content-type: application/json",
"Accept: application/json"

);

$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://sandbox- quickbooks.api.intuit.com/v3/company/{{companyid}}/account",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\n  \"AccountType\": \"Accounts Receivable\",\n  \"Name\": \"MyJobs\"\n}",
CURLOPT_HTTPHEADER =>  $ar,
));
$response = curl_exec($curl);

这是我用来创建帐户的代码。 我使用以下代码生成签名。

    $oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
    $signature  =   $oauth->generateSignature('POST','https://sandbox-quickbooks.api.intuit.com/v3',$params);

本例$params数组定义如下

     $params = array(
        'oauth_consumer_key' => OAUTH_CONSUMER_KEY,
        'oauth_nonce' => $randomvalue,
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_timestamp' => $time,
        'oauth_version' => '1.0',
        'oauth_token' => ACCESS_TOKEN
    );

你应该使用一个库来为你处理所有这些东西——你的代码中有很多问题。这是一个为您处理所有这些的库:

按照该页面上的快速入门进行操作。

我可以看到您的代码的具体问题:

您不能拥有固定的访问令牌。它每 5 到 6 个月变化一次,因此不是一个常数:

oauth_token="'.ACCESS_TOKEN_SECRET.'"

这个 URL 有两个问题:

  • 其中有一个 space
  • 公司 ID 是一个整数,您在这里似乎用了占位符

CURLOPT_URL => "https://sandbox- quickbooks.api.intuit.com/v3/company/{{companyid}}/account",

此 URL 不正确 -- 您签署的 URL 与您发布到的不同

$signature = $oauth->generateSignature('POST','https://sandbox-quickbooks.api.intuit.com/v3',$params);