2016-05-25 98 views
2

我已经创建了一个PHP页面fullcalendar jquery插件,它允许网站用户预订时间。在后台我将事件存储到我的数据库中,然后使用Google日历API为我的Google日历创建相同的事件。从我的网站添加事件到我的谷歌日历

但我的实现是要求用户登录到他们的谷歌帐户,并在用户的日历上创建事件。我怎样才能实现在我的(网站所有者)谷歌日历“无缝”创建用户事件?

我的代码如下:

<?php 
session_start(); 

require_once __DIR__ . '/vendor/autoload.php'; 

define('APPLICATION_NAME', 'Google Calendar'); 
define('CREDENTIALS_PATH', '~/.credentials/calendar-php-quickstart.json'); 
define('CLIENT_SECRET_PATH', __DIR__ . '/client_secret.json'); 
// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/calendar-php-quickstart.json 
define('SCOPES', implode(' ', array(
    Google_Service_Calendar::CALENDAR) 
)); 


/** 
* Returns an authorized API client. 
* @return Google_Client the authorized client object 
*/ 
function getClient() { 
    $client = new Google_Client(); 
    $client->setApplicationName(APPLICATION_NAME); 
    $client->setScopes(SCOPES); 
    $client->setAuthConfigFile(CLIENT_SECRET_PATH); 
    $client->setAccessType('offline'); 
    // Load previously authorized credentials from a file. 
    $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH); 

/*if (file_exists($credentialsPath)) { 
    $accessToken = file_get_contents($credentialsPath); 
} else {*/ 

    if(!$_REQUEST['code']) { 
     $authUrl = $client->createAuthUrl(); 
     //printf("Open the following link in your browser:\n%s\n", $authUrl); 
     header("Location:".$authUrl); 
    } 
    $authCode = $_REQUEST['code']; 
    $accessToken = $client->authenticate($authCode); 

    // Store the credentials to disk. 
    /*if(!file_exists(dirname($credentialsPath))) { 
     mkdir(dirname($credentialsPath), 0700, true); 
    } 
    file_put_contents($credentialsPath, $accessToken);*/ 
    //printf("Credentials saved to %s\n", $credentialsPath); 
//} 
$client->setAccessToken($accessToken); 

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
$client->refreshToken($client->getRefreshToken()); 
file_put_contents($credentialsPath, $client->getAccessToken()); 
} 
return $client; 
} 
/** 
* Expands the home directory alias '~' to the full path. 
* @param string $path the path to expand. 
* @return string the expanded path. 
*/ 
function expandHomeDirectory($path) { 
    $homeDirectory = getenv('HOME'); 
    if (empty($homeDirectory)) { 
    $homeDirectory = getenv("HOMEDRIVE") . getenv("HOMEPATH"); 
    } 
    return str_replace('~', realpath($homeDirectory), $path); 
} 

// Get the API client and construct the service object. 
$client = getClient(); 
$service = new Google_Service_Calendar($client); 


$event = new Google_Service_Calendar_Event(array(
    'summary' => $_SESSION['cal-data']['fname']." ".$_SESSION['cal-data']['lname'], 
    'location' => $_SESSION['cal-data']['address'], 
    'description' => "Contact: ".$_SESSION['cal-data']['phoneno']." for ".$_SESSION['cal-data']['title'], 
    'start' => array(
    'dateTime' => $_SESSION['cal-data']['starttm'], 
    //'timeZone' => 'America/Los_Angeles', 
), 
    'end' => array(
    'dateTime' => $_SESSION['cal-data']['endtm'], 
    //'timeZone' => 'America/Los_Angeles', 
), 
    /*'recurrence' => array(
    'RRULE:FREQ=DAILY;COUNT=2' 
),*/ 
    'attendees' => array(
    array('email' => $_SESSION['cal-data']['email']) 
), 
    'reminders' => array(
    'useDefault' => FALSE, 
    'overrides' => array(
     array('method' => 'email', 'minutes' => 24 * 60), 
     array('method' => 'popup', 'minutes' => 10), 
    ), 
), 
)); 

$calendarId = '[email protected]'; 
$event = $service->events->insert($calendarId, $event); 
//printf('Event created: %s\n', $event->htmlLink); 
unset($_SESSION['cal-data']); 

header("Location: next-page.php"); 
+0

应该有一个公开的设置,不是吗?我从来没有与这些工作过,但假设会有。 –

+0

是的,您可以公开您的日历并且我的日历已经公开。 – Paks

回答

0

有存储在共享/公共日历凭证的方式,使用日历ID为“正常”的API调用。

POST https://www.googleapis.com/calendar/v3/calendars/YOUR_SHARED_CALENDAR_ID/events

,但你要分享的人或与公众的日历。 https://support.google.com/calendar/answer/37082?hl=en

,否则你不能

+0

我已将我的日历设为公开。 – Paks

+0

你能帮我在我的代码中,我应该在哪里按照你的建议进行api调用? – Paks

0

您可以使用服务帐户作为代理用户访问您的日历(不提示用户登录自己的帐户)。基于Inserting Google Calendar Entries with Service Account,您可以将事件添加到共享日历。

下面是步骤:

  1. Create a Service Account
  2. 你需要创建一个公钥/私钥对。

在创建服务帐户窗口,为服务帐户的名称,并选择提供新的私钥。如果您要将Google Apps域范围授权授予服务帐户,请选择启用Google Apps域范围的授权。

注:Enable the API和共享日历,从服务帐户凭据您的电子邮件地址。不要忘记启用“更改事件”。