5

好的,这就是我想做的...

  1. 用户授权 iPhone 上的应用程序具有对 Google 日历的读/写访问权限
  2. 我从 Google 获得了某种身份验证令牌
  3. 将令牌传递给我的 PHP 服务器并将其保存在数据库中
  4. 使用令牌定期检查 Google 事件并将其存储在服务器的数据库中
  5. 将 Google 事件数据以 json 格式发送到应用程序

我想在服务器上实现谷歌事件的获取,这样我就可以围绕它们构建额外的功能,比如发送远程推送通知。

我被困在获取身份验证令牌并将其保存在服务器上并使用它从 Google 的日历 api 获取事件的部分,无法找到相同的资源。有人可以对此有所了解。


更新

在第 3 步之前,我已经能够成功实现该场景。

我从 Google 获取身份验证令牌和刷新令牌并将其保存在数据库中。现在使用Google API php 客户端,我正在尝试使用我之前获得的访问令牌连接到 Google 的日历 API。我正在使用以下代码...

require_once(APPPATH . "libraries/Google/Google_Client.php");
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php");

$client = new Google_Client();
$client->setAccessToken($google_access_token);

$calendar = new Google_CalendarService($client);
$calendarList = $calendar->calendarList->listCalendarList();
echo print_r($calendarList, true);

但现在我得到这个错误......

PHP 致命错误:在 /myserver/application/libraries/Google/auth/Google_OAuth2.php:162 中带有消息“无法 json 解码令牌”的未捕获异常“Google_AuthException”

堆栈跟踪:/myserver/application/libraries/Google/Google_Client.php(170): Google_OAuth2->setAccessToken('a_token...')

我知道我直接尝试在 Google 客户端 api 中设置访问令牌,而没有指定任何重定向 url 或用户授权访问服务器本身上的 Google 日历时通常使用的其他参数。这应该像我想要的那样工作吗?


更新 2

经过进一步挖掘,我发现直接设置访问令牌使用setAccessToken不起作用,因为 API 的 Google 客户端需要setAccessToken方法中的 JSON 编码字符串。经过一些调整后,我将代码更改为以下....

require_once(APPPATH . "libraries/Google/Google_Client.php");
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php");

$client = new Google_Client();
$client->setAccessType('offline');
$client->refreshToken($google_refresh_token);
$newToken = $client->getAccessToken();
$client->setAccessToken($newToken);

$calendar = new Google_CalendarService($client);
$calendarList = $calendar->calendarList->listCalendarList();
echo print_r($calendarList, true);

现在我得到的错误是invalid_request.

刷新 OAuth2 令牌时出错,消息:'{"error" : "invalid_request"}'

4

1 回答 1

3

最后我能够回答我自己的问题。希望这对其他人有帮助。

第 1 步和第 2 步。按照这个关于 mobiletuts 的优秀教程中的说明,我在我的 iOS 应用程序中使用了 Google OAuth 协议。

第 3 步。我将访问令牌和刷新令牌保存在我的 Web 服务器上的数据库中。

第 4 步。使用从 iOS 应用程序获得的刷新令牌,我使用此代码连接到 Google 日历 API...

require_once(APPPATH . "libraries/Google/Google_Client.php");
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php");

/* setup google client object */
$client = new Google_Client();
$client->setClientId(GOOGLE_CLIENT_ID);

/* refresh access token */
$client->refreshToken($google_refresh_token);
$newToken = $client->getAccessToken();
$client->setAccessToken($newToken);

/* get google calendars list */
$calendar = new Google_CalendarService($client);
$calendarList = $calendar->calendarList->listCalendarList();
echo print_r($calendarList, true);
于 2013-10-17T06:07:35.517 回答