Я новичок в Goole API.Я хотел бы использовать Google Calendar API на своем веб-сайте.Пользователи дают мне доступ, и я сохраняю access token
в файле (например).
В течение дня задача CRON выполняет синхронизацию с календарями пользователей, извлекая ее.
Все работает нормально, кроме обновления доступа к токену.Вот мой код.
Для моего теста я храню access_token
в харде.
<?php
require __DIR__ . '/../vendor/autoload.php';
session_start();
$redirect_uri = 'https://' . $_SERVER['HTTP_HOST'] . '/';
$client = new Google_Client();
$client->setClientId("aaaaaaa");
$client->setClientSecret("bbbbbbbb");
$client->setRedirectUri($redirect_uri);
$client->addScope("email");
$client->addScope(Google_Service_Calendar::CALENDAR);
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$client->setAccessType('offline');
$client->setRedirectUri('https://' . $_SERVER['HTTP_HOST'] . '/');
$service = new Google_Service_Oauth2($client);
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
}
//var_dump($_SESSION['access_token']);
if (!isset($_SESSION['access_token']) || (isset($_SESSION['access_token']) && $_SESSION['access_token'] == "")) {
//pour les tests
echo "Come from database for example <br /><br />";
$_SESSION['access_token'] = [
"access_token" =>
yyyyyyyy",
"expires_in" =>
3600,
"scope" =>
"https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/plus.me",
"token_type" =>
"Bearer",
"id_token" =>
"xxxxxxxxxxxxx",
"created" =>
1538556145
];
//Refresh
}
$client->setAccessToken($_SESSION['access_token']);
if ($client->isAccessTokenExpired()) {
echo "<br/><h2>Refresh Token</h2><br />";
// save refresh token to some variable
$refreshTokenSaved = $client->getRefreshToken();
// update access token
$client->fetchAccessTokenWithRefreshToken($refreshTokenSaved);
// pass access token to some variable
$accessTokenUpdated = $client->getAccessToken();
// append refresh token
$accessTokenUpdated['refresh_token'] = $refreshTokenSaved;
//Set the new acces token
$_SESSION['access_token'] = $refreshTokenSaved;
$client->setAccessToken($_SESSION['access_token']);
}
$calendar = new Google_Service_Calendar($client);
$calendarList = $calendar->calendarList->listCalendarList();
foreach ($calendarList->getItems() as $calendarListEntry) {
echo $calendarListEntry->getSummary() . "<br>";
}
Если я жду задержки истечения срока действия токена, когда я нажимаю F5,У меня есть эта ошибка:
Неустранимая ошибка: Uncaught LogicException: токен обновления должен быть передан или установлен как часть setAccessToken в /xcxcxcxcxcxcxcxcxcxcxcx/vendor/google/apiclient/src/Gph/Client258 Стек трассировки: # 0 /xcxcxcxcxcxcxcxcxcxcxcx/quickstart.php(55): Google_Client-> fetchAccessTokenWithRefreshToken (NULL) # 1 {главный} бросили в /xcxcxcxcxcxcxcxcxcxcxcx/vendor/google/apiclient/src/Google/Client.php на линии 258
И я вижу, что $refreshTokenSaved
- это NULL
Я что-то пропустил, но что?Спасибо