Моя боль с google api продолжается …
Я могу использовать скрипт для использования токена обновления – автоматически обновлять и сохранять доступ к календарю живым. Я могу взаимодействовать с календарем, и все хорошо.
Теперь я хочу перейти к использованию клиента google api для php, и вчера у меня это работало, пока мой токен был действительным, но теперь это истекло. Я не могу решить, как использовать токен обновления, чтобы получить новый токен и сохранить когда он истекает в будущем.
Я нашел несколько ссылок и попробовал их – вот мой тестовый скрипт, основанный на примере simple.php:
<?php require_once '../../src/Google_Client.php'; require_once '../../src/contrib/Google_CalendarService.php'; session_start(); $client = new Google_Client(); $client->setAccessType('offline'); $client->setApplicationName("Downs Golfmanager"); // Visit https://code.google.com/apis/console?api=calendar to generate your // client id, client secret, and to register your redirect uri. $client->setClientId('XXXXXX.apps.googleusercontent.com'); $client->setClientSecret('XXXXXX'); $client->setRedirectUri('XXXXXX'); $client->setDeveloperKey('XXXXXX'); $client->refreshToken('X/XXXXX'); $client->setUseObjects(true); $cal = new Google_CalendarService($client); if (isset($_GET['logout'])) { unset($_SESSION['token']); } if (isset($_GET['code'])) { $client->authenticate($_GET['code']); $_SESSION['token'] = $client->getAccessToken(); header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } if($client->isAccessTokenExpired()) { / echo 'Access Token Expired'; // Debug //$client->refreshToken($refreshToken); } if ($client->getAccessToken()) { $event = new Google_Event(); $event->setSummary('Appointment'); $event->setLocation('Somewhere'); $start = new Google_EventDateTime(); $start->setDateTime('2013-08-28T14:00:00.000+01:00'); $event->setStart($start); $end = new Google_EventDateTime(); $end->setDateTime('2013-08-28T15:25:00.000+01:00'); $event->setEnd($end); $createdEvent = $cal->events->insert('XXXXXX@group.calendar.google.com', $event); //echo "<pre>" . print_r($createdEvent, true) . "</pre>"; echo $createdEvent->getId(); //test pulling events $events = $cal->events->listEvents('XXXXXX@group.calendar.google.com'); while(true) { foreach ($events->getItems() as $event) { echo $event->getSummary(); } $pageToken = $events->getNextPageToken(); if ($pageToken) { $optParams = array( 'pageToken' => $pageToken, 'timeMin'=>'2013-08-26T00:00:00+01:00', 'timeMax'=>'2013-08-31T00:00:00+01:00' ); $events = $cal->events->listEvents('XXXXXX@group.calendar.google.com', $optParams); } else { break; } } //print "<h1>Events List</h1><pre>" . print_r($events, true) . "</pre>"; $calList = $cal->calendarList->listCalendarList(); print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>"; $_SESSION['token'] = $client->getAccessToken(); } else { $authUrl = $client->createAuthUrl(); print "<a class='login' href='$authUrl'>Connect Me!</a>"; }
Как и в моих предыдущих сообщениях, я не понимаю, что должно происходить здесь. Мой токен истек – у меня есть токен обновления. какие изменения в моем коде мне нужно для автоматического обновления авторизации при каждом доступе.
Изменить: код ошибки: The OAuth 2.0 access token has expired, and a refresh token is not available
Я прокомментировал несколько дополнительных строк, над которыми я включил свои попытки решить, чтобы попытаться избежать путаницы
спасибо
OK. Основываясь на нескольких сообщениях, я исправил проблему получения токена обновления, чтобы получить новый токен доступа. Я использовал этот код, прежде чем я начал пытаться любой доступ:
if($client->isAccessTokenExpired()) { echo 'Access Token Expired'; // Debug $client->refreshToken('X/XXXXXX'); }
Где заглушенная часть в refreshToken
– это токен обновления. Я закодировал ключ в коде.
Это, вероятно, не правильное решение, поскольку я видел ссылки на сохранение ключа в базе данных, поэтому, предположительно, я мог бы хранить токен доступа в db с токеном обновления и вытаскивать эти формы как db как и когда требуется, чтобы сэкономить их кодирование?
Надеюсь, этот метод, который я использовал, будет работать снова после его истечения – пальцы скрещены!