我正在尝试将我的自定义 PHP 应用程序与 QuickBooks Online 连接。我正在使用他们的 SDK,网址为 https://github.com/intuit/QuickBooks-V3-PHP-SDK。但如果我有一个错误的令牌,此代码将引发异常:
try {
// Refresh the token
$OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
$refresh = $accessToken->getRefreshToken();
$accessTokenObj = $OAuth2LoginHelper->refreshAccessTokenWithRefreshToken($refresh);
$accessTokenObj->setRealmID($currentServiceContext->realmId);
$dataService->updateOAuth2Token($accessTokenObj);
$_SESSION['sessionAccessToken'] = serialize($accessTokenObj);
} catch (Exception $e) {
print_r($e);
}
也许我的 PHP 知识有漏洞,但我认为 try{}catch(){} 应该可以阻止异常关闭我的整个应用程序。在这种情况下,try catch 不执行任何操作。整个系统停止到白页,并且我的错误日志中列出了一个异常。
显然,我需要能够测试令牌是好是坏,并通知用户重新连接quickbooks,而无需关闭整个应用程序。
我错过了什么?
相关错误:
"class": "QuickBooksOnline\\API\\Exception\\ServiceException",
"message": "Refresh OAuth 2 Access token with Refresh Token failed. Body: [{\"error\":\"invalid_grant\"}].",
"code": 400,
"file": "/var/www/html/vendor/quickbooks/v3-php-sdk/src/Core/OAuth/OAuth2/OAuth2LoginHelper.php:309",
"trace": [
"/var/www/html/config.php:274",
"/var/www/html/index.php:2"
]
这是 QBO PHP SDK 中的函数:
/**
* Get a new access token based on the refresh token. Static function to make easy refreshToken API call.
* @return OAuth2AccessToken A new OAuth2AccessToken that contains all the information(accessTokenkey, RefreshTokenKey, ClientID, and ClientSecret, Expiration Time, etc)
*/
public function refreshAccessTokenWithRefreshToken($refreshToken){
$http_header = $this->constructRefreshTokenHeader();
$requestBody = $this->constructRefreshTokenBody($refreshToken);
$this->LogAPIRequestToLog($requestBody, CoreConstants::OAUTH2_TOKEN_ENDPOINT_URL, $http_header);
$intuitResponse = $this->curlHttpClient->makeAPICall(CoreConstants::OAUTH2_TOKEN_ENDPOINT_URL, CoreConstants::HTTP_POST, $http_header, $requestBody, null, true);
$this->LogAPIResponseToLog($intuitResponse->getBody(), CoreConstants::OAUTH2_TOKEN_ENDPOINT_URL, $intuitResponse->getHeaders());
$this->faultHandler = $intuitResponse->getFaultHandler();
if($this->faultHandler) {
throw new ServiceException("Refresh OAuth 2 Access token with Refresh Token failed. Body: [" . $this->faultHandler->getResponseBody() . "].", $this->faultHandler->getHttpStatusCode());
}else{
$this->faultHandler = false;
$this->oauth2AccessToken = $this->parseNewAccessTokenFromResponse($intuitResponse->getBody());
return $this->getAccessToken();
}
}
这是第 309 行:
throw new ServiceException("Refresh OAuth 2 Access token with Refresh Token failed. Body: [" . $this->faultHandler->getResponseBody() . "].", $this->faultHandler->getHttpStatusCode());
有时我必须把它全部写出来才能弄清楚。
我现在看到了。这不是异常,而是 ServiceException。所以我需要在我的 try catch 中使用它,如下所示:
try {
// Refresh the token
$OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
$refresh = $accessToken->getRefreshToken();
$accessTokenObj = $OAuth2LoginHelper->refreshAccessTokenWithRefreshToken($refresh);
$accessTokenObj->setRealmID($currentServiceContext->realmId);
$dataService->updateOAuth2Token($accessTokenObj);
$_SESSION['sessionAccessToken'] = serialize($accessTokenObj);
} catch (ServiceException $e) {
echo "Error: " . $e->getMessage();
}