5

我正在尝试使用 Google 日历 API 将一个非常简单的事件添加到日历中,如果有人能指出我的(可能是显而易见的)问题,我会很高兴。我正在使用在这里找到的代码。我已将代码放在“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 错误。我试图通过代码并注释掉行以试图找到罪魁祸首 - 它似乎是倒数第二行,它实际上插入了事件。

有什么建议吗?我真的很感激一些建议,因为我似乎连最简单的例子都无法工作。

4

2 回答 2

4

您的代码几乎可以正常工作。

但是,您重定向到“worked.html”。这样,您的事件不会身份验证重定向后创建。此外,setRedirectUri 应该与您在 Google API 和控制台中输入的内容相匹配(请参阅“重定向 URI”)并且它应该是THIS文件,因为该文件在重定向后输入事件。(您不需要“worked.html”)

所以你的 simple.php 应该看起来像这样(也将 Google Api 上的“重定向 URI”更改为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失败的情况下。

万圣节快乐 ;-)

编辑:我用登录和注销以及日志消息的工作链接清理了很多代码。

于 2013-09-13T11:51:44.447 回答
0

您的代码的最后一部分没有使用正确的逻辑。问题的症结在于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
}
于 2013-09-11T05:46:56.710 回答