2013-12-20 162 views
0

我正在爲此苦苦掙扎:我試圖使用服務帳戶從PHP腳本創建Google日曆中的事件。使用服務器帳戶和PHP對Google Calendar API進行身份驗證

這是我做了什麼:

  • 創建一個谷歌雲項目
  • 啓用日曆API
  • 創建一個OAuth 2.0服務帳戶,與客戶端ID,郵箱地址和公共密鑰
  • 下載的密鑰文件,並在我的網站保存在此
  • 共享我的服務帳戶創建的電子郵件地址,日曆(以及管理共享權限)

這裏是我的代碼:

<?php 

require_once 'google_api_src/Google_Client.php'; 
require_once 'google_api_src/contrib/Google_CalendarService.php'; 

const CLIENT_ID = 'xxxxxxxxxxxxx.apps.googleusercontent.com'; 
const SERVICE_ACCOUNT_NAME = '[email protected]'; 

// Make sure you keep your key.p12 file in a secure location, and isn't 
// readable by others. 
const KEY_FILE = 'google_api_src/xxxxxxxxx-privatekey.p12'; 

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

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

// Load the key in PKCS 12 format 
$key = file_get_contents(KEY_FILE); 
$client->setClientId(CLIENT_ID); 

$client->setAssertionCredentials(new Google_AssertionCredentials(
    SERVICE_ACCOUNT_NAME, 
    array('https://www.googleapis.com/auth/calendar', "https://www.googleapis.com/auth/calendar.readonly"), 
    $key)); 

$service = new Google_CalendarService($client); 

//Save token in session 
if ($client->getAccessToken()) 
{ 
    $_SESSION['token'] = $client->getAccessToken(); 
} 

?> 

我已經是盡我所能調試的代碼,而是調用SetAssertionCredentials後的令牌始終設置爲null。沒有PHP錯誤。

任何想法是什麼錯誤,或如何進一步調試? 我是否必須對api src文件夾中的config.php進行任何更改(我還沒有到目前爲止)? 應用程序名稱是否重要?它用於什麼?

回答

1

好吧 - 事實證明,上面的代碼工作正常。我的誤解是認爲Google_CalendarService執行了認證。事實上,只有在對日曆進行實際調用時纔會執行認證(例如插入事件)。

但是,我認爲在會話中保存令牌存在錯誤的地方 - 它應該在執行操作之後。

要回答我的其他問題:不,您不必對config.php進行任何更改。應用程序名稱可以設置爲任何內容(但我不知道它的用途)。

我碰到的另外一個問題是:我使用日曆ID爲'primary'的方式創建了一個事件。這會發回成功消息,但我無法在日曆中看到該事件(我只有該帳戶的一個日曆)。只有當我將'primary'改爲'[email protected]'時,它纔開始工作。聽起來像API中的一個bug對我來說?

1

結帳演示:http://amazewebs.com/demo

或者獲得1對1的幫助,在此:http://amazewebs.com/go-premium

我已經得到了這方面的工作與服務帳戶,您使用的是錯誤的URL在你的代碼,或至少我把它與我的方法沒有任何問題的工作...

看到這裏我的代碼:http://amazewebs.com

或者在這裏:

<!-- language: php --> 

<?php 
ini_set('display_errors', 1); 
require_once '../google-api/Google_Client.php'; 
require_once '../google-api/contrib/Google_CalendarService.php'; 

session_start(); 

const CLIENT_ID = '<YOUR-CLIENT-ID-HERE>.apps.googleusercontent.com'; 
const SERVICE_ACCOUNT_NAME = '<YOUR-SERVICE-EMAIL-HERE>@developer.gserviceaccount.com'; 
const KEY_FILE = '<YOUR-FINGERPRINT-HERE>-privatekey.p12'; 

$client = new Google_Client(); 
$client->setApplicationName("<PUT-YOUR-PROJECT-NAME-HERE"); 
$client->setUseObjects(true); //IF USING SERVICE ACCOUNT (YES) 


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

/* This next snippet of code is commonly written wrong, be sure to use the correct URL specified as below: */ 

$key = file_get_contents(KEY_FILE); 
$client->setClientId(CLIENT_ID); 
$client->setAssertionCredentials(new Google_AssertionCredentials(
SERVICE_ACCOUNT_NAME, 'https://www.google.com/calendar/feeds/<YOUR-CALENDAR-ID-HERE-WITHOUT-THE-TRAILING"@group.calendar.google.com">/private/full/', 
$key) 
); 

$client->setClientId(CLIENT_ID); 
$cal = new Google_CalendarService($client); 
$event = new Google_Event(); 
$event->setSummary('<PUT-AN-EVENT-TITLE-HERE-OR-PASSED-VARIABLE>'); 
$event->setLocation('<PUT-A-LOCATION-HERE-OR-PASSED-VARIABLE>'); 

...The Full script can be found @ AmazeWebs.com 

&另外,我建議下載舊的谷歌api庫,因爲它似乎沒有與他們的最新0.6.7的工作!

...我已經下載並封裝在正確的道路結構中的所有文件,爲您提供:http://amazewebs.com/downloads/google-api.zip

或者,您也可以下載每一個人文件和自己打包,如果你想從谷歌直接下載: http://google-api-php-client.googlecode.com/svn/trunk/src/

祝你好運:)

+0

<您的日曆-ID-HERE> @ group.calendar.google.com 什麼是日曆ID? 我在日曆ID中傳遞了我的電子郵件ID,它不起作用。 請幫忙。 – Madurai

+0

我已經通過視頻和幫助文件全面解釋了這一點。 http://amazewebs.com/go-premium –

相關問題