1

我正在尝试了解有关用于生成访问令牌的快速手册 PHP SDK 的更多信息。以下代码完美运行。它将获取我存储到数据库中的最后一个有效访问令牌,将其分配给 quickbooks 数据服务,然后获取 500 条发票记录并打印发票编号:

<?php
require __DIR__.'/vendor/autoload.php';
require '../../../wp-config.php';
 
use QuickBooksOnline\API\DataService\DataService;
use QuickBooksOnline\API\Core\OAuth\OAuth2\OAuth2LoginHelper;
 
$con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
 
if ($con->connect_errno) {
 
    printf("connection failed: %s\n", $con->connect_error());
    exit();
}
$sql = "SELECT * FROM wp_forbook ORDER BY create_date DESC LIMIT 1";
$result = $con->query($sql);
$row = $result->fetch_object();
$accessToken = unserialize($row->token);
$con->close();
 
// 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' => $config['mode']
));
/*
$oauth2LoginHelper = new OAuth2LoginHelper($config['client_id'], $config['client_secret']);
$accessToken = $oauth2LoginHelper->refreshAccessTokenWithRefreshToken($accessToken->getRefreshToken());
*/
$dataService->updateOAuth2Token($accessToken);
$allInvoices = $dataService->FindAll('Invoice', 0, 500);
echo '<pre>';
if($allInvoices) {
  foreach ($allInvoices as $oneInvoice)
    echo $oneInvoice->DocNumber."\n";
} else {
  echo print_r($dataService->getLastError(),1);
}
echo '</pre>';

同样,我刚刚粘贴的脚本完美运行。

但是,如果我启用这两行来获取 refreshToken

$oauth2LoginHelper = new OAuth2LoginHelper($config['client_id'], $config['client_secret']);
$accessToken = $oauth2LoginHelper->refreshAccessTokenWithRefreshToken($accessToken->getRefreshToken());

然后我看到错误消息:

QuickBooksOnline\API\Core\HttpClients\FaultHandler Object
(
    [context:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => 
    [httpStatusCode:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => 400
    [responseBody:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => Unsupported OperationOperation 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.
    [helpMsg:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => Invalid auth/bad request (got a 400, expected HTTP/1.1 20X or a redirect)
    [intuit_tid:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => 1-5ffb7959-7079cde00c9068e3506236c7
    [intuitErrorType:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => ValidationFault
    [intuitErrorCode:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => 500
    [intuitErrorElement:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => 
    [intuitErrorMessage:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => Unsupported Operation
    [intuitErrorDetail:QuickBooksOnline\API\Core\HttpClients\FaultHandler:private] => 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.
)

如果我再次注释掉刷新令牌的行,请在我的网页上按刷新,然后一切正常。换句话说,即使我refreshAccessTokenWithRefreshToken()在前一个会话中执行过,直接来自数据库的旧令牌仍然有效。

为什么我新刷新的令牌会导致错误消息?

为什么过去一小时内发出的旧令牌在a)我尝试创建刷新然后b)看到错误消息然后c)禁用刷新令牌代码然后d)刷新页面之后仍然有效?

如何正确刷新访问令牌?

4

0 回答 0