用 PHP 创建简单的 Google 日历事件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18690653/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Create Simple Google Calendar Event in PHP
提问by Jake
I'm having a heck of a time trying to get a very simple event added to a calendar using the Google Calendar API, and I would love it if someone could point out my (probably obvious) issue. I'm using code that I found here. I've put the code in the "google-api-php-client/examples.calendar" directory, where a simple example can be found.
我有一段时间试图使用 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('[email protected]', $event);
}
echo $createdEvent->getId();
?>
When I access this script, I get a 404 error. I've tried going through the code and commenting out lines in an attempt to find the culprit - it appears to be the second-to-last line, which actually inserts the event.
当我访问此脚本时,出现 404 错误。我尝试浏览代码并注释掉行以试图找到罪魁祸首 - 它似乎是倒数第二行,实际上插入了事件。
Any advice? I'd really appreciate some pointers, as I cannot seem to get even the simplest of examples to work.
有什么建议吗?我真的很感激一些指点,因为我似乎连最简单的例子都无法工作。
采纳答案by Rik
Your code almost works.
你的代码几乎可以工作。
However, you redirect to "worked.html". That way your event does notget created after the redirect of authentication. Also the setRedirectUri should match what you entered in Google API plus console (see "Redirect URIs") ANDit should be THISfile because this file is entering the event after the redirect. (You don't need the "worked.html")
但是,您重定向到“worked.html”。这样,你的事件并没有得到验证的重定向后创建。此外,setRedirectUri 应该与您在 Google API 和控制台中输入的内容相匹配(请参阅“重定向 URI”)并且它应该是这个文件,因为该文件在重定向后进入事件。(你不需要“worked.html”)
So your simple.php should look like this (ALSO change the "Redirect URIs" on Google Api to http://localhost/simple.php
, you need to specify the domain but can use localhost, in setRedirectUri you can specify the same)
所以你的 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>";
?>
Also, like @BigMacAttack already stated, you only need the$authURL = $client->createAuthURL();
once, only if getAccessToken
failed.
另外,就像@BigMacAttack 已经说过的,你只需要$authURL = $client->createAuthURL();
一次,只有在getAccessToken
失败时。
Happy Halloween ;-)
万圣节快乐 ;-)
Edit: I cleaned up the code a lot with working links to login and logout and log-messages.
编辑:我使用登录和注销以及日志消息的工作链接对代码进行了大量清理。
回答by BigMacAttack
The last portion of your code isn't using correct logic. The crux of the problem is with if (!$client->getAccessToken())
. This statement, in the context of your sample code, roughly translates to: If you fail to get the access token, create the event. Obviously this is not what you want to happen. ;)
代码的最后一部分没有使用正确的逻辑。问题的关键在于if (!$client->getAccessToken())
. 在示例代码的上下文中,此语句大致翻译为:如果您无法获取访问令牌,则创建事件。显然这不是你想要发生的。;)
Instead try this:
而是试试这个:
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
}