如何捕获 Quickbooks PHP SDK OAuth2LoginHelper 中的异常?

问题描述 投票:0回答:1

我正在尝试将我的自定义 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());

php oauth-2.0 quickbooks
1个回答
0
投票

有时我必须把它全部写出来才能弄清楚。

我现在看到了。这不是异常,而是 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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.