首页 > 解决方案 > 为什么新创建的用于快速书的 api 令牌在 PHP 中失败但在 curl 中有效

问题描述

当我使用 php sdk 刷新我的快速手册的 api 令牌时,它们不适用于 php sdk。它们只能curl通过命令行使用。为什么它不适用于 php sdk?我将在下面演示这个问题:

以下脚本完美运行。它会打印两次访问令牌和客户列表:

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use QuickBooksOnline\API\DataService\DataService;
use QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2LoginHelper;
session_start();

function makeAPICall()
{
    // Create SDK instance
    $config = include('config.php');
    $dataService = DataService::Configure(array(
        'auth_mode' => 'oauth2',
        'ClientID' => $config['client_id'],
        'ClientSecret' =>  $config['client_secret'],
        'RedirectURI' => $config['oauth_redirect_uri'],
        'scope' => $config['oauth_scope'],
        'baseUrl' => "development"
    ));
    /*
     * Retrieve the accessToken value from session variable
     */
    $accessToken = $_SESSION['sessionAccessToken'];

echo "OLD ACCESS TOKEN:\n"; print_r($accessToken);
    $oauth2LoginHelper = new OAuth2LoginHelper($config['client_id'], $config['client_secret']);
    //$accessToken = $oauth2LoginHelper->refreshAccessTokenWithRefreshToken($accessToken->getRefreshToken());

    /*
     * Update the OAuth2Token of the dataService object
     */
    $dataService->updateOAuth2Token($accessToken);

echo "NEW ACCESS TOKEN:\n"; print_r($accessToken);
    $i = 0;
    while (1) {
        $allCustomers = $dataService->FindAll('Customer', $i, 500);
        $error = $dataService->getLastError();
        if ($error) {
            echo "The Status code is: " . $error->getHttpStatusCode() . "\n";
            echo "The Helper message is: " . $error->getOAuthHelperError() . "\n";
            echo "The Response message is: " . $error->getResponseBody() . "\n";
            exit();
        }
        if (!$allCustomers || (0==count($allCustomers))) {
            break;
        }
        foreach ($allCustomers as $oneCustomer) {
            echo "Customer[".($i++)."]: {$oneCustomer->DisplayName}<br/>";
            echo "\t * Id: [{$oneCustomer->Id}]\n";
            echo "\t * Active: [{$oneCustomer->Active}]\n";
            echo "\n";
        }
    }
}

$result = makeAPICall();

如果我启用 line $accessToken = $oauth2LoginHelper->refreshAccessTokenWithRefreshToken($accessToken->getRefreshToken());,我会得到以下输出:

OLD ACCESS TOKEN:
QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken Object
(
    [accessTokenKey:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..KPBgO13eC2F6tGTYO-eBjg.n1B1jaePPz9krqEaRuy3k5QO70CmMneddPKHq_U-_Lf4kHiOu5zhhhTIoSvmjoX7cB8HPqKZCkGo_oBTwrTHgvFVIRGxsk4iJOp8eMuM34s6FNux6mzeDGB89Q-yKzDuJbMSYInm694Tdyun6YgOwOlsktRPqktOWVXUqbt6wmGa0YARV8lAT8CX1YnlgzJsS2uz0qfgFufnQd3IPOtzVmgR7X40eu64qQmIseHRvETw5myVLnkKHNPrjCAzr97-TtCZpxx9MIKqaSzDoDlnko4gOHUQB_eWrbTC9j3eeI2vX8xNFrHQh34SgSDWJBBvWdDuEgxCzJwdkvXd_c2yhW4jRJrgGuE7456EJjz7Qm-j2emWKLAS5SRJcEHcYYIZvKa1gO1SvsF0YMNz3aanyfP-ci-J_ipuVv4-lu_-NBjfopzieSLkbsJob6voVLAmEdXDAg2hjXe9VjAoI_fcPnMS_Nxt3bvXd2DLbqKDi5x0zatRQVVzSV9npOUz2Rwd2k7XtsdzkwzvVg9Nw3M-XZp7USgXzNqqIQCqzZqqWSomUsxtB7ZLlAXBR32pj_8Thnj2ail_qW_KpBlqqKtij-T0dbprx-I0hWGDOnpUFhCmip-oKLocBiAugBMWAaY6IHZ2U9tmZhWDC5XNbhqy_NLIkjh5YPBrAv3EvizGa1l_hfS3oc86EGpvFoBf8bvWpqkJiZt1vYNkvDV6pOk1ZgOmpPqhiRw-HEOAmBzONC3VI57u0dwVkM1m95HoSI4T49BFQSg5B1Rvg6BY3D_IKIT7Ve2dyTf0ApZXhPnZXqq3sDuy6b1113v-Q5k9xfa8TRNFZmkA5XN4tjy0bpO4sue5wGO-BG0aMBntM-1VEKvp0t2m3u2-RWJ6X2x3uvwn.YTlB02ihKoPJFoxHyuidhQ
    [tokenType:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => bearer
    [refresh_token:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => AB11619101552M4mvRdPUzPdddQQQDrruD2sf4Wc1nJ69GJsTs
    [accessTokenExpiresAt:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 1610378752
    [refreshTokenExpiresAt:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 1619101552
    [accessTokenValidationPeriod:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 3600
    [refreshTokenValidationPeriod:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 8726400
    [clientID:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => AB5xEvDqPW14gGkIz5cEBWsaUQkK9gP7gg8zDrsWtay4JcqISS
    [clientSecret:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => FJJG6S6Lr9NxTJOynnH448FZ9A3sVNEIT2exlezB
    [realmID:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 4620816365156528260
    [baseURL:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 
)
NEW ACCESS TOKEN:
QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken Object
(
    [accessTokenKey:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..t-Dz4BeWjc8YKRyi2gESsw.YiG8g5LYBkI7s39gc_PfDWMoeNJfPPMh6ExTNONcWhDV1_H6cglhmttm4F1Hd-0xxGMtISYSxwH2ywCxn7Bz9twf-1R-QMv4k70nYrn8fesNi0OY9FsHl2ZHX7xJo76eUkCq1PQFV9iiZ4khL0VGXm-C8Cyqogzh23CdnjIJqG2s3ykhtUWjCHSy2PRpU1-_FZzBlFFUqxigeuLU8u1fLj7NAVuVzxx0sSEBNNl76fQ-iAzwjmuGBiM1IxgCSbRWJqMXoZPcuPuKD-lD8-EZMB4pNfJCjYeA2qRZ9COycaK_iJh9vuIfTTq49GhdwbIiBggvc0BbyccaGtQNK4UfLlb7SRogfG-AxRhNq1g54fOo9PkfeZ5Mn2VAWxgKzPLRbIupXIcwOpiWJVMz3zFvjBd64qj8OzITPhYhz0hJ5rATdBe3U20Z4DA8Klqy3A6DshCaiEwBFwd8QKmmorAFLF8HBWuD4kHVn5_NuuMsviqhN0JLkQ0JwZ01WsUxMEvS9Lj6O_OqFzpjWZrqNO8hW6k7GAX5tcnw2TaISL9l6eEXH_C3MQwg9fcKItehiPtQReM4rylgXfcfIQWVn1BiReOV2ctlcZbzhmi5WXsDU_0fxQdhr49DLZttiPDYA4iiCRY6BogbpeOg7_ekZpzpTpYYZzVWwapxreT6ZawrPYkq_KCxbMqJ8vL8uToDpfdHFPF92ITmIAQkuFGsji2ay4GnnAjHqmXey5tboWc0ahmHyZJh4Ujr_Mr1jnycHyXjK-_zLuuT036P2zCmZdgHR3sfv4G3wKeiqw8brKLj2J3ft441AS7FsuwnIXO0xZfefFdBX38yElqyDdCnSUm0KvIxQKW6-Veu4qr8aLuNG-RtJWO47BgRbCZguxoyNbXo.6x5sd3kIBdvUBsmfXkKSgg
    [tokenType:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => bearer
    [refresh_token:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => AB11619101552M4mvRdPUzPdddQQQDrruD2sf4Wc1nJ69GJsTs
    [accessTokenExpiresAt:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 1610378756
    [refreshTokenExpiresAt:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 1619101552
    [accessTokenValidationPeriod:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 3600
    [refreshTokenValidationPeriod:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 8726396
    [clientID:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => AB5xEvDqPW14gGkIz5cEBWsaUQkK9gP7gg8zDrsWtay4JcqISS
    [clientSecret:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => FJJG6S6Lr9NxTJOynnH448FZ9A3sVNEIT2exlezB
    [realmID:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 
    [baseURL:QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2AccessToken:private] => 
)
The Status code is: 400
The Helper message is: Invalid auth/bad request (got a 400, expected HTTP/1.1 20X or a redirect)
The Response message is: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2021-01-11T06:25:56.985-08:00"><Fault type="ValidationFault"><Error code="500"><Message>Unsupported Operation</Message><Detail>Operation Could not find resource for relative : /v3/company/query of full path: https://c50.sandbox.qbo.intuit.com/qbo50/v3/company/query?minorversion=57 is not supported.</Detail></Error></Fault></IntuitResponse>

如上所示,使用新令牌查询客户会出现 400 错误。如果我使用,这两个令牌都可以工作curl

Success with old token:

curl -X GET 'https://sandbox-quickbooks.api.intuit.com/v3/company/4620816365156528260/query?query=SELECT%20*%20FROM%20Customer' \
-H 'accept: application/json' \
-H 'authorization:Bearer eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..KPBgO13eC2F6tGTYO-eBjg.n1B1jaePPz9krqEaRuy3k5QO70CmMneddPKHq_U-_Lf4kHiOu5zhhhTIoSvmjoX7cB8HPqKZCkGo_oBTwrTHgvFVIRGxsk4iJOp8eMuM34s6FNux6mzeDGB89Q-yKzDuJbMSYInm694Tdyun6YgOwOlsktRPqktOWVXUqbt6wmGa0YARV8lAT8CX1YnlgzJsS2uz0qfgFufnQd3IPOtzVmgR7X40eu64qQmIseHRvETw5myVLnkKHNPrjCAzr97-TtCZpxx9MIKqaSzDoDlnko4gOHUQB_eWrbTC9j3eeI2vX8xNFrHQh34SgSDWJBBvWdDuEgxCzJwdkvXd_c2yhW4jRJrgGuE7456EJjz7Qm-j2emWKLAS5SRJcEHcYYIZvKa1gO1SvsF0YMNz3aanyfP-ci-J_ipuVv4-lu_-NBjfopzieSLkbsJob6voVLAmEdXDAg2hjXe9VjAoI_fcPnMS_Nxt3bvXd2DLbqKDi5x0zatRQVVzSV9npOUz2Rwd2k7XtsdzkwzvVg9Nw3M-XZp7USgXzNqqIQCqzZqqWSomUsxtB7ZLlAXBR32pj_8Thnj2ail_qW_KpBlqqKtij-T0dbprx-I0hWGDOnpUFhCmip-oKLocBiAugBMWAaY6IHZ2U9tmZhWDC5XNbhqy_NLIkjh5YPBrAv3EvizGa1l_hfS3oc86EGpvFoBf8bvWpqkJiZt1vYNkvDV6pOk1ZgOmpPqhiRw-HEOAmBzONC3VI57u0dwVkM1m95HoSI4T49BFQSg5B1Rvg6BY3D_IKIT7Ve2dyTf0ApZXhPnZXqq3sDuy6b1113v-Q5k9xfa8TRNFZmkA5XN4tjy0bpO4sue5wGO-BG0aMBntM-1VEKvp0t2m3u2-RWJ6X2x3uvwn.YTlB02ihKoPJFoxHyuidhQ' \
-H 'content-type: application/json'

Success with new token:

curl -X GET 'https://sandbox-quickbooks.api.intuit.com/v3/company/4620816365156528260/query?query=SELECT%20*%20FROM%20Customer' \
-H 'accept: application/json' \
-H 'authorization:Bearer eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..t-Dz4BeWjc8YKRyi2gESsw.YiG8g5LYBkI7s39gc_PfDWMoeNJfPPMh6ExTNONcWhDV1_H6cglhmttm4F1Hd-0xxGMtISYSxwH2ywCxn7Bz9twf-1R-QMv4k70nYrn8fesNi0OY9FsHl2ZHX7xJo76eUkCq1PQFV9iiZ4khL0VGXm-C8Cyqogzh23CdnjIJqG2s3ykhtUWjCHSy2PRpU1-_FZzBlFFUqxigeuLU8u1fLj7NAVuVzxx0sSEBNNl76fQ-iAzwjmuGBiM1IxgCSbRWJqMXoZPcuPuKD-lD8-EZMB4pNfJCjYeA2qRZ9COycaK_iJh9vuIfTTq49GhdwbIiBggvc0BbyccaGtQNK4UfLlb7SRogfG-AxRhNq1g54fOo9PkfeZ5Mn2VAWxgKzPLRbIupXIcwOpiWJVMz3zFvjBd64qj8OzITPhYhz0hJ5rATdBe3U20Z4DA8Klqy3A6DshCaiEwBFwd8QKmmorAFLF8HBWuD4kHVn5_NuuMsviqhN0JLkQ0JwZ01WsUxMEvS9Lj6O_OqFzpjWZrqNO8hW6k7GAX5tcnw2TaISL9l6eEXH_C3MQwg9fcKItehiPtQReM4rylgXfcfIQWVn1BiReOV2ctlcZbzhmi5WXsDU_0fxQdhr49DLZttiPDYA4iiCRY6BogbpeOg7_ekZpzpTpYYZzVWwapxreT6ZawrPYkq_KCxbMqJ8vL8uToDpfdHFPF92ITmIAQkuFGsji2ay4GnnAjHqmXey5tboWc0ahmHyZJh4Ujr_Mr1jnycHyXjK-_zLuuT036P2zCmZdgHR3sfv4G3wKeiqw8brKLj2J3ft441AS7FsuwnIXO0xZfefFdBX38yElqyDdCnSUm0KvIxQKW6-Veu4qr8aLuNG-RtJWO47BgRbCZguxoyNbXo.6x5sd3kIBdvUBsmfXkKSgg' \
-H 'content-type: application/json'

所以我的问题是如何使用新的访问令牌通过 php sdk 查询客户?

编辑,当您阅读此消息时,令牌可能已过期。但我想强调的是,如果您同时运行我在上面发布的两个 curl 语句,它们都将起作用。

如有必要,我可以再次生成新的代币供大家试用。

标签: phpcurlquickbooks

解决方案


在使用以下方法刷新访问令牌后,这也发生在我身上:

$token = $loginHelper->refreshAccessTokenWithRefreshToken($refresh_token);

之后,我必须realmId在令牌中这样设置:

$token->setRealmID($myRealmId);

它奏效了。

更奇怪的是,我在 Trait 函数中执行此操作并返回我更新的访问令牌(据说已经设置了 realmId),但是当我尝试使用 SDK 调用查询时:

$dataService->query("select * from class");

它仍然给我那个错误。因此,在返回访问令牌并尝试将其用于之前query,我不得不realmId再次设置。


推荐阅读