Xero OAuth2 问题
Xero OAuth2 Questions
我已将我的网站迁移到 Xero 2.0,它可以用于创建发票。但是几个小时后,我必须通过单击浏览器中的 https://something.com/xero-oauth2/authorization.php 文件重新授权,重新连接到 Xero 帐户,否则我的客户会看到类似于下面的内容...
致命错误:未捕获 BadMethodCallException:未传递必需参数:/var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php:35 堆栈跟踪中的“refresh_token”:#0 /var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php(53): League\OAuth2\Client\Grant\AbstractGrant->checkRequiredParameter('refresh_token', 数组) #1 /var/www/vhosts/nasschools.org.uk/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Grant/AbstractGrant.php(76): League\OAuth2\Client\Grant\AbstractGrant->checkRequiredParameters(数组, 数组) #2 /var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(535): League\OAuth2\Client\Grant\AbstractGrant->prepareRequestParameters(Array, Array) #3 /var/www/vhosts/something.com/httpdocs/xero-oauth2/createInvoice.php(160): League\OAuth2\Client\Provider\AbstractProvider->getAccessToken(对象(League\OAuth2\Client\Grant\Refre in /var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php 第 35
行
这有什么明显的错误吗?
<?php
$storage = new StorageClass();
$xeroTenantId = (string)$storage->getSession()['tenant_id'];
if ($storage->getHasExpired()) {
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => 'XXXXXX',
'clientSecret' => 'XXXXXX',
'redirectUri' => 'https://something.com/xero-oauth2/callback.php',
'urlAuthorize' => 'https://login.xero.com/identity/connect/authorize',
'urlAccessToken' => 'https://identity.xero.com/connect/token',
'urlResourceOwnerDetails' => 'https://api.xero.com/api.xro/2.0/Organisation'
]);
$newAccessToken = $provider->getAccessToken('refresh_token', [
'refresh_token' => $storage->getRefreshToken()
]);
// Save my token, expiration and refresh token
$storage->setToken(
$newAccessToken->getToken(),
$newAccessToken->getExpires(),
$xeroTenantId,
$newAccessToken->getRefreshToken(),
$newAccessToken->getValues()["id_token"]);
}
// Configure OAuth2 access token for authorization: OAuth2
$config = XeroAPI\XeroPHP\Configuration::getDefaultConfiguration()->setAccessToken((string)$storage->getSession()['token']);
$config->setHost("https://api.xero.com/api.xro/2.0");
$apiInstance = new XeroAPI\XeroPHP\Api\AccountingApi(
new GuzzleHttp\Client(),
$config
);
$xero_tenant_id = $xeroTenantId; // string | Xero identifier for Tenant
// \XeroAPI\XeroPHP\Models\Accounting\Invoices | Invoices with an array of invoice objects in body of request
$summarize_errors = true; // bool | If false return 200 OK and mix of successfully created objects and any with validation errors
$unitdp = 4; // int | e.g. unitdp=4 – (Unit Decimal Places) You can opt in to use four decimal places for unit amounts
$purchaseNumber = str_replace("&", "&", $_SESSION['purchasenumber']);
$schoolOrGname = str_replace("&", "&", $_SESSION['schoolorgname1']);
$billingEmail = str_replace("&", "&", $_SESSION['billingemail']);
$billingAddress = str_replace("&", "&", $_SESSION['billingaddress']);
$billingCity = str_replace("&", "&", $_SESSION['billingcity']);
$billingPostalCode = str_replace("&", "&", $_SESSION['billingpostcode']);
$billingFullName = str_replace("&", "&", $_SESSION['billingfullname']);
$date = str_replace("&", "&", $_SESSION['now']);
$dueDate = str_replace("&", "&", $_SESSION['thirty']);
$eventTitle = str_replace("&", "&", $_SESSION['eventtitle']);
$eventPrice = str_replace("&", "&", $_SESSION['eventprice']);
$address = new Address();
$address->setAddressType('POBOX');
$address->setAddressLine1($billingAddress);
$address->setCity($billingCity);
$address->setPostalCode($billingPostalCode);
$address->setAttentionTo($billingFullName);
$contact = new Contact();
$contact->setName($schoolOrGname)
->setContactStatus('ACTIVE')
->setEmailAddress($billingEmail)
->setAddresses([$address]);
$lineItem = new LineItem();
$lineItem->setDescription($eventTitle)
->setQuantity(1)
->setAccountCode(4002)
->setUnitAmount($eventPrice)
->setTaxAmount(0)
->setTaxType('NONE');
$invoice = new Invoice();
$invoice->setDate($date)
->setDueDate($dueDate)
->setLineAmountTypes('Exclusive')
->setType('ACCREC')
->setReference($_SESSION['purchasenumber'])
->setStatus('AUTHORISED')
->setContact($contact)
->setLineItems([$lineItem]);
try {
$result = $apiInstance->createInvoices($xero_tenant_id, $invoice, $summarize_errors, $unitdp);
header("Location: https://something.com/order-confirmation/");
} catch (Exception $e) {
print_r($e);
echo '<br/><br/>Exception when calling AccountingApi->createInvoices: ', $e->getMessage(), PHP_EOL;
}
?>
您的用户创建令牌后,您似乎只需要在使用前刷新令牌即可。 access_token只持续了30分钟。您需要在每次使用前刷新(和更换)它。您正在使用 SDK,因此很容易得到支持。
自述文件中有一些示例代码可以向您展示如何避免以下错误:
- 为授权配置 OAuth2 访问令牌:OAuth2
https://github.com/XeroAPI/xero-php-oauth2#authorizedresourcephp
主要部分是确保您在拨打电话之前将刷新的令牌集替换到 api 客户端上。您确定它在配置和会计客户端上设置正确吗?
$config = XeroAPI\XeroPHP\Configuration::getDefaultConfiguration()->setAccessToken((string)$storage->getSession()['token']);
我已将我的网站迁移到 Xero 2.0,它可以用于创建发票。但是几个小时后,我必须通过单击浏览器中的 https://something.com/xero-oauth2/authorization.php 文件重新授权,重新连接到 Xero 帐户,否则我的客户会看到类似于下面的内容...
致命错误:未捕获 BadMethodCallException:未传递必需参数:/var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php:35 堆栈跟踪中的“refresh_token”:#0 /var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php(53): League\OAuth2\Client\Grant\AbstractGrant->checkRequiredParameter('refresh_token', 数组) #1 /var/www/vhosts/nasschools.org.uk/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Grant/AbstractGrant.php(76): League\OAuth2\Client\Grant\AbstractGrant->checkRequiredParameters(数组, 数组) #2 /var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(535): League\OAuth2\Client\Grant\AbstractGrant->prepareRequestParameters(Array, Array) #3 /var/www/vhosts/something.com/httpdocs/xero-oauth2/createInvoice.php(160): League\OAuth2\Client\Provider\AbstractProvider->getAccessToken(对象(League\OAuth2\Client\Grant\Refre in /var/www/vhosts/something.com/httpdocs/xero-oauth2/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php 第 35
行这有什么明显的错误吗?
<?php
$storage = new StorageClass();
$xeroTenantId = (string)$storage->getSession()['tenant_id'];
if ($storage->getHasExpired()) {
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => 'XXXXXX',
'clientSecret' => 'XXXXXX',
'redirectUri' => 'https://something.com/xero-oauth2/callback.php',
'urlAuthorize' => 'https://login.xero.com/identity/connect/authorize',
'urlAccessToken' => 'https://identity.xero.com/connect/token',
'urlResourceOwnerDetails' => 'https://api.xero.com/api.xro/2.0/Organisation'
]);
$newAccessToken = $provider->getAccessToken('refresh_token', [
'refresh_token' => $storage->getRefreshToken()
]);
// Save my token, expiration and refresh token
$storage->setToken(
$newAccessToken->getToken(),
$newAccessToken->getExpires(),
$xeroTenantId,
$newAccessToken->getRefreshToken(),
$newAccessToken->getValues()["id_token"]);
}
// Configure OAuth2 access token for authorization: OAuth2
$config = XeroAPI\XeroPHP\Configuration::getDefaultConfiguration()->setAccessToken((string)$storage->getSession()['token']);
$config->setHost("https://api.xero.com/api.xro/2.0");
$apiInstance = new XeroAPI\XeroPHP\Api\AccountingApi(
new GuzzleHttp\Client(),
$config
);
$xero_tenant_id = $xeroTenantId; // string | Xero identifier for Tenant
// \XeroAPI\XeroPHP\Models\Accounting\Invoices | Invoices with an array of invoice objects in body of request
$summarize_errors = true; // bool | If false return 200 OK and mix of successfully created objects and any with validation errors
$unitdp = 4; // int | e.g. unitdp=4 – (Unit Decimal Places) You can opt in to use four decimal places for unit amounts
$purchaseNumber = str_replace("&", "&", $_SESSION['purchasenumber']);
$schoolOrGname = str_replace("&", "&", $_SESSION['schoolorgname1']);
$billingEmail = str_replace("&", "&", $_SESSION['billingemail']);
$billingAddress = str_replace("&", "&", $_SESSION['billingaddress']);
$billingCity = str_replace("&", "&", $_SESSION['billingcity']);
$billingPostalCode = str_replace("&", "&", $_SESSION['billingpostcode']);
$billingFullName = str_replace("&", "&", $_SESSION['billingfullname']);
$date = str_replace("&", "&", $_SESSION['now']);
$dueDate = str_replace("&", "&", $_SESSION['thirty']);
$eventTitle = str_replace("&", "&", $_SESSION['eventtitle']);
$eventPrice = str_replace("&", "&", $_SESSION['eventprice']);
$address = new Address();
$address->setAddressType('POBOX');
$address->setAddressLine1($billingAddress);
$address->setCity($billingCity);
$address->setPostalCode($billingPostalCode);
$address->setAttentionTo($billingFullName);
$contact = new Contact();
$contact->setName($schoolOrGname)
->setContactStatus('ACTIVE')
->setEmailAddress($billingEmail)
->setAddresses([$address]);
$lineItem = new LineItem();
$lineItem->setDescription($eventTitle)
->setQuantity(1)
->setAccountCode(4002)
->setUnitAmount($eventPrice)
->setTaxAmount(0)
->setTaxType('NONE');
$invoice = new Invoice();
$invoice->setDate($date)
->setDueDate($dueDate)
->setLineAmountTypes('Exclusive')
->setType('ACCREC')
->setReference($_SESSION['purchasenumber'])
->setStatus('AUTHORISED')
->setContact($contact)
->setLineItems([$lineItem]);
try {
$result = $apiInstance->createInvoices($xero_tenant_id, $invoice, $summarize_errors, $unitdp);
header("Location: https://something.com/order-confirmation/");
} catch (Exception $e) {
print_r($e);
echo '<br/><br/>Exception when calling AccountingApi->createInvoices: ', $e->getMessage(), PHP_EOL;
}
?>
您的用户创建令牌后,您似乎只需要在使用前刷新令牌即可。 access_token只持续了30分钟。您需要在每次使用前刷新(和更换)它。您正在使用 SDK,因此很容易得到支持。
自述文件中有一些示例代码可以向您展示如何避免以下错误:
- 为授权配置 OAuth2 访问令牌:OAuth2
https://github.com/XeroAPI/xero-php-oauth2#authorizedresourcephp
主要部分是确保您在拨打电话之前将刷新的令牌集替换到 api 客户端上。您确定它在配置和会计客户端上设置正确吗?
$config = XeroAPI\XeroPHP\Configuration::getDefaultConfiguration()->setAccessToken((string)$storage->getSession()['token']);