Создать простое событие Google Calendar в PHP
Я чертовски потратил время, пытаясь добавить очень простое событие в календарь с помощью API Календаря Google, и мне было бы очень приятно, если бы кто-то мог указать на мою (вероятно, очевидную) проблему. Я использую код, который я нашел здесь. Я поместил код в каталог "google-api-php-client / examples.calendar", где можно найти простой пример.
<?php
require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_CalendarService.php';
session_start();
$client = new Google_Client();
$client->setApplicationName("Google Calendar PHP Starter Application");
$client->setClientId('');
$client->setClientSecret('');
$client->setRedirectUri('worked.html'); //I made a file called "worked.html" in the same directory that just says "it worked!"
$client->setDeveloperKey('SecretLongDeveloperKey');
$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']);
}
$authUrl = $client->createAuthUrl();
if (!$client->getAccessToken()){
$event = new Google_Event();
$event->setSummary('Halloween');
$event->setLocation('The Neighbourhood');
$start = new Google_EventDateTime();
$start->setDateTime('2012-10-31T10:00:00.000-05:00');
$event->setStart($start);
$end = new Google_EventDateTime();
$end->setDateTime('2012-10-31T10:25:00.000-05:00');
$event->setEnd($end);
$createdEvent = $cal->events->insert('secretLongCalendarId@group.calendar.google.com', $event);
}
echo $createdEvent->getId();
?>
Когда я получаю доступ к этому сценарию, я получаю ошибку 404. Я попытался просмотреть код и закомментировать строки, пытаясь найти виновника - кажется, что это вторая строка, которая фактически вставляет событие.
Любой совет? Я был бы очень признателен за некоторые советы, поскольку я не могу заставить работать даже самые простые примеры.
2 ответа
Ваш код почти работает.
Тем не менее, вы перенаправляете на "works.html". Таким образом, ваше событие не будет создано после перенаправления аутентификации. Также setRedirectUri должно соответствовать тому, что вы ввели в консоль Google API plus (см. "URI перенаправления"), и это должен быть ЭТОТ файл, поскольку этот файл входит в событие после перенаправления. (Вам не нужен "works.html")
Таким образом, ваш simple.php должен выглядеть следующим образом (ТАКЖЕ измените "URI перенаправления" в Google Api на http://localhost/simple.php
, вам нужно указать домен, но вы можете использовать localhost, в setRedirectUri вы можете указать то же самое)
<?php
error_reporting(E_ALL);
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_CalendarService.php';
session_start();
if ((isset($_SESSION)) && (!empty($_SESSION))) {
echo "There are cookies<br>";
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
}
$client = new Google_Client();
$client->setApplicationName("Google Calendar PHP Starter Application");
$client->setClientId('###');
$client->setClientSecret('###');
$client->setRedirectUri('http://###/index.php');
$client->setDeveloperKey('###');
$cal = new Google_CalendarService($client);
if (isset($_GET['logout'])) {
echo "<br><br><font size=+2>Logging out</font>";
unset($_SESSION['token']);
}
if (isset($_GET['code'])) {
echo "<br>I got a code from Google = ".$_GET['code']; // You won't see this if redirected later
$client->authenticate($_GET['code']);
$_SESSION['token'] = $client->getAccessToken();
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
echo "<br>I got the token = ".$_SESSION['token']; // <-- not needed to get here unless location uncommented
}
if (isset($_SESSION['token'])) {
echo "<br>Getting access";
$client->setAccessToken($_SESSION['token']);
}
if ($client->getAccessToken()){
echo "<hr><font size=+1>I have access to your calendar</font>";
$event = new Google_Event();
$event->setSummary('Halloween');
$event->setLocation('The Neighbourhood');
$start = new Google_EventDateTime();
$start->setDateTime('2013-9-29T10:00:00.000-05:00');
$event->setStart($start);
$end = new Google_EventDateTime();
$end->setDateTime('2013-9-29T10:25:00.000-05:00');
$event->setEnd($end);
$createdEvent = $cal->events->insert('###', $event);
echo "<br><font size=+1>Event created</font>";
echo "<hr><br><font size=+1>Already connected</font> (No need to login)";
} else {
$authUrl = $client->createAuthUrl();
print "<hr><br><font size=+2><a href='$authUrl'>Connect Me!</a></font>";
}
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
echo "<br><br><font size=+2><a href=$url?logout>Logout</a></font>";
?>
Кроме того, как уже говорилось @BigMacAttack, вам нужно только$authURL = $client->createAuthURL();
один раз, только если getAccessToken
не удалось.
Счастливого Хэллоуина;-)
Редактировать: я много очистил код с рабочими ссылками для входа в систему и выхода из системы и сообщения журнала.
Последняя часть вашего кода не использует правильную логику. Суть проблемы заключается в if (!$client->getAccessToken())
, Это утверждение в контексте вашего примера кода примерно переводится на: Если вам не удалось получить токен доступа, создайте событие. Очевидно, это не то, что вы хотите, чтобы произошло.;)
Вместо этого попробуйте это:
if ($client->getAccessToken()){
//succeeded in getting an access token, so create and insert the event
} else {
$authUrl = $client->createAuthUrl();
//failed to get an access token, so display $authurl as a link to open the auth window
}