gpt4 book ai didi

php - 快速手册 PHP API : Refresh OAuth 2 Token Failed

转载 作者:行者123 更新时间:2023-12-05 03:56:15 26 4
gpt4 key购买 nike

我正在尝试使用 PHP SDK 访问 Quickbooks API,但出现以下错误:

Refresh OAuth 2 Access token with Refresh Token failed. Body: [{"error":"invalid_grant"}].

我的 token 似乎可以工作 24 小时,但之后我收到上述错误。每次我调用 API 时,我都会将更新的 token 保存到我的数据库中:

//Client ID & Secret
$qbClientId = $this->scopeConfig->getValue('quickbooks/api/qb_client_id', $storeScope);
$qbClientSecret = $this->scopeConfig->getValue('quickbooks/api/qb_client_secret', $storeScope);

//Retrieve currently saved Refresh_Token from DB
$qbRefreshToken = $this->scopeConfig->getValue('quickbooks/api/qb_refresh_token', $storeScope);

$OAuth2LoginHelper = new OAuth2LoginHelper($qbClientId, $qbClientSecret);
$accessTokenObj = $OAuth2LoginHelper->refreshAccessTokenWithRefreshToken($qbRefreshToken);

$error = $OAuth2LoginHelper->getLastError();

if($error) {
throw new \Exception($error);
} else {
// The refresh token and access token expiration
$refreshTokenValue = $accessTokenObj->getRefreshToken();
$refreshTokenExpiry = $accessTokenObj->getRefreshTokenExpiresAt();

// Save new Refresh Token & Expiry to DB
$this->configInterface->saveConfig('quickbooks/api/qb_refresh_token', $this->encryptor->encrypt($refreshTokenValue), 'default', 0);
$this->configInterface->saveConfig('quickbooks/api/qb_refresh_token_expiry', $refreshTokenExpiry, 'default', 0);

// The access token and access token expiration
$accessTokenValue = $accessTokenObj->getAccessToken();
$accessTokenExpiry = $accessTokenObj->getAccessTokenExpiresAt();

// Save new Access Token & Expiry to DB
$this->configInterface->saveConfig('quickbooks/api/qb_access_token', $this->encryptor->encrypt($accessTokenValue), 'default', 0);
$this->configInterface->saveConfig('quickbooks/api/qb_access_token_expiry', $accessTokenExpiry, 'default', 0);

return DataService::Configure(array(
'auth_mode' => 'oauth2',
'ClientID' => $qbClientId,
'ClientSecret' => $qbClientSecret,
'accessTokenKey' => $accessTokenValue,
'refreshTokenKey' => $refreshTokenValue,
'QBORealmID' => 'MyRealmID',
'baseUrl' => 'Development'
));
}

如您所见,在每次 API 调用时,我都使用 refreshAccessTokenWithRefreshToken($qbRefreshToken) 方法来获取新的刷新和访问 token 并将它们保存到我的数据库中以供下次使用,但是24 小时后我仍然收到 invalid_grant 错误。

有什么想法吗?

最佳答案

我遇到了同样的问题。在我的例子中,我已经更新了数据库中的 token ,但不是内存中的所有地方(特别是在 $dataService 对象中)。因此,继续使用 $dataService 对象进行 API 调用是在使用旧 token 。哦!

虽然我认为它仍然有效,但您不需要在每次 API 调用时都刷新 token (正如 David 指出的那样)。我的解决方案是进行 API 调用,如果失败,则刷新 token 并再次进行 API 调用。这是我的代码的简化版本:

$user        = ...; // get from database
$dataService = getDataServiceObject();

$response = $dataService->Add(...); // hit the QBO API
$error = $dataService->getLastError();

if ($error) {
refreshTokens();
$response = $dataService->Add(...); // try the API call again
}

// ... "Add" complete, onto the next thing

////////////////////////////////

function getDataServiceObject() {
global $user;

return DataService::Configure(array(
'auth_mode' => 'oauth2',
'ClientID' => '...',
'ClientSecret' => '...',
'accessTokenKey' => $user->getQbAccessToken(),
'refreshTokenKey' => $user->getQbRefreshToken(),
'QBORealmID' => $user->getQbRealmId(),
'baseUrl' => '...',
));
}

function refreshTokens() {
global $dataService;
global $user;

$OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
$obj = $OAuth2LoginHelper->refreshAccessTokenWithRefreshToken($user->getQbRefreshToken());
$newAccessToken = $obj->getAccessToken();
$newRefreshToken = $obj->getRefreshToken();

// update $user and store in database
$user->setQbAccessToken($newAccessToken);
$user->setQbRefreshToken($newRefreshToken);
$user->save();

// update $dataService object
$dataService = getDataServiceObject();
}

关于php - 快速手册 PHP API : Refresh OAuth 2 Token Failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59568428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com