Создать простое событие 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
}
Другие вопросы по тегам