如何创建没有用户的Google日历条目?

时间:2013-11-25 21:37:18

标签: php google-calendar-api google-apps google-oauth

最近,我决定在我的网站上为用户提供以下功能:在我的员工的日历中预订在线时段。所有员工都在Google Apps(免费版)中将Google帐户与我们的域相关联。用户在某些前端进行预订(例如,不直接在员工Google日历中进行预订),然后在我们的PHP服务器上处理请求,如果正确,服务器应该能够在选定的员工Google日历中创建新的日历条目。注意 - 预订时不应要求用户和员工进行身份验证。

我已经扫描了Google日历v3 API和论坛,但仍然没有得到明确的答案而不是简明的例子 - Google日历是否可以实现这种情况?有人可以帮我回答Q(如果可能的话 - 与正确的例子分享一个链接)?

1 个答案:

答案 0 :(得分:0)

您是否熟悉添加认证的活动?就像我回答here 就像在下面的代码中一样。如果你......你可以进入下一个级别;)

(您可以在this页面上下载Google Api Php客户端。在this page上有一个教程。它适用于Google+,但原理相同)

您第一次需要身份验证。没有办法解决这个问题。在下面的示例中,您在身份验证后返回token,其中包括 access_token refresh_token 。 access_token仅在3600秒内有效,用于直接访问。当access_token过期时,您会收到401错误,您可以使用refresh_token(与client_id,client_secret和正确的grant_type一起)来请求新的access_token。

您可以在this page上找到更多信息(在底部“使用刷新令牌”)。请求这些数字有一些限制,在底部的页面上提到。


这是我上次帮助某人时所做的一些测试代码。它仅显示获取身份验证并将token存储在cookie中。它过期后不会请求新的access_token。

但正如我已经说过你需要存储token(在数据库中?),当你得到401时,你需要使用client_id,client_secret,正确的grant_type和refresh_token请求一个新的access_token。没有必要的(重新)认证。

<?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://###/add_calendar.php'); // <- registered web-page
//$client->setDeveloperKey('###'); // <- not always needed
$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']);
  // not strictly necessary to redirect but cleaner for the url in address-bar
  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('=== I ADDED THIS ===');
  $event->setLocation('The Neighbourhood');
  $start = new Google_EventDateTime();
  $start->setDateTime('2013-11-29T10:00:00.000-05:00');
  $event->setStart($start);
  $end = new Google_EventDateTime();
  $end->setDateTime('2013-11-29T10:25:00.000-05:00');
  $event->setEnd($end);
  $createdEvent = $cal->events->insert('###', $event); // <- ### = email of calendar
  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>";

?>

修改

如果您不想要初始身份验证,Google会提供“服务重置”,正如您所指出的那样 (我不知道这些:)

我挖出了一些链接,您可以在找到密钥文件后找到要使用的代码。

Edit Google calendar events from Google service account: 403
Access Google calendar events from with service account: { "error" : "access_denied" }. No google apps
Google OAuth 2.0 Service Account - Calendar API (PHP Client)
https://groups.google.com/forum/#!topic/google-api-php-client/B7KXVQvx1k8
https://groups.google.com/forum/?fromgroups#!topic/google-api-php-client/IiwRBKZMZxw


编辑#2 :是的,让它运转正常。 (即使使用我的免费Google帐户;)

以下是工作代码:

<?
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();

echo "Busy<br>";

const CLIENT_ID = 'xxxxxxxxxx.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME = 'xxxxxxxxxxx@developer.gserviceaccount.com';
const KEY_FILE = 'xxxxxxxxxxxxxxxxxxx-privatekey.p12';
const CALENDAR_NAME = 'xxxxxxx@gmail.com';

$client = new Google_Client();
$client->setApplicationName("mycal");

if (isset($_SESSION['token'])) {
 $client->setAccessToken($_SESSION['token']);
}

$key = file_get_contents(KEY_FILE);
$client->setClientId(CLIENT_ID);
$client->setAssertionCredentials(new Google_AssertionCredentials(
  SERVICE_ACCOUNT_NAME,
  array('https://www.google.com/calendar/feeds/'),
  $key)
);

$client->setClientId(CLIENT_ID);
$service = new Google_CalendarService($client);

$event = new Google_Event();
$event->setSummary('=== I MADE THIS ===');
$event->setLocation('Somewhere else');
$start = new Google_EventDateTime();
$start->setDateTime('2013-11-30T10:00:00.000-02:00');
$event->setStart($start);
$end = new Google_EventDateTime();
$end->setDateTime('2013-11-30T10:25:00.000-02:00');
$event->setEnd($end);

$createdEvent = $service->events->insert(CALENDAR_NAME, $event);

echo "Done<br>";

?>

我需要在https://cloud.google.com/console#/project上制作一个“新项目”。我无法使用现有的。激活“Calendar API”并注册一个带有证书的新Web应用程序后,我只需要与xxxx@developer.gserviceaccount.com及以上代码共享我的日历。 (不经过身份验证)。

编辑#3:现在它似乎也在使用默认的“Google+ API项目”