[QuickBooks-V3-PHP-SDK让我很难受。
我正在尝试使用它来同步发票数据。我可以使用OAuth 2.0成功获得授权,并将客户端PHP Web应用程序连接到QuickBooks Online。但是,尽管我可以成功进行getCompanyInfo调用并接收结果,但是我无法进行getUserInfo调用(或与此有关的大多数其他API调用),因为它会抱怨未设置“访问令牌对象”还没有。
连接到QuickBooks并获得授权时,所有内容似乎都能正常运行-并且访问令牌对象已成功放置在PHP会话中。但是由于某些原因,当我尝试获取UserInfo数据或使用任何其他API调用时,它会抱怨。
这是我收到的错误:
Fatal error: Uncaught QuickBooksOnline\API\Exception\SdkException: [0]: Can't get OAuth 2 Access Token Object. It is not set yet.
thrown in /compiled/src/Core/OAuth/OAuth2/OAuth2LoginHelper.php on line 129
这是我尝试获取UserInfo的方法:
$dataService->updateOAuth2Token($accessToken);
$OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
$result = $OAuth2LoginHelper->getUserInfo();
同样,获取CompanyInfo不会有任何问题。
有人知道发生了什么吗?
[下面包括apiCall.php中的代码(来自HelloWorld示例包,由我自己进一步编辑)。在我已经连接到QuickBooks Online并获得其授权后,该文件用于通过Ajax发出请求。
<?php
require_once(__DIR__ . '/vendor/autoload.php');
use QuickBooksOnline\API\Core\ServiceContext;
use QuickBooksOnline\API\DataService\DataService;
use QuickBooksOnline\API\Core\Http\Serialization\XmlObjectSerializer;
use QuickBooksOnline\API\Facades\Invoice;
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'];
$dataService->throwExceptionOnError(true);
/*
* Update the OAuth2Token of the dataService object
*/
$dataService->updateOAuth2Token($accessToken);
//Get the requested data:
$action = filter_input(INPUT_GET, "action", FILTER_SANITIZE_SPECIAL_CHARS);
$method = "get$action";
switch($action){
case "CompanyInfo":
$result = $dataService->$method();
break;
case "UserInfo":
$OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
$result = $OAuth2LoginHelper->getUserInfo();
break;
case "InvoiceExample":
$allInvoices = $dataService->Query("SELECT * FROM Invoice");
$result = $allInvoices;
break;
}
var_dump($result);
return $result;
}
$result = makeAPICall();
?>
有人知道我在做什么错吗?
Intuit(QuickBooks)支持团队向我提供了答案。在上面的ApiCall代码中,我必须使用以下代码来发出UserInfo请求:
$result = $OAuth2LoginHelper->getUserInfo($accessToken->getAccessToken(), 'development');
显然,如果这涉及生产密钥,那么我将不得不用'生产'代替'开发'。