如何处理Google Calendar API推送通知?

时间:2015-08-11 02:28:05

标签: php google-calendar-api

我似乎无法理解this article

我正在尝试在我的网络应用和Google日历之间创建事件的双向同步。我已将我的活动成功同步到Google日历,但谷歌发送给我的推送通知没有任何用处。

当我创建一个新事件,然后我创建一个手表:

$channel = new Google_Service_Calendar_Channel();
$channel->setId($watchId);
$channel->setType('web_hook');
$channel->setAddress(URL::route('gapi.watchEvent'));
$channel->setResourceId($seg->gapi_event_id); // does this do anything??
$channel->setToken(json_encode(['segment_id'=>$seg->id]));
$channel->setParams([
    'ttl' => 2628000, // is this respected??
]);

$watchResp = $calendarService->events->watch($googleCalendarId, $channel);

首先,$channel->setResourceId做了什么?我想听取特定事件的更改,但似乎总是给我整个日历的通知。

Google向我发送的标题如下所示:

"X-Goog-Channel-Id": "qJSdaxkKKkXXXXXXXXXX",
"X-Goog-Channel-Expiration": "Thu, 10 Sep 2015 01:45:57 GMT",
"X-Goog-Resource-State": "exists",
"X-Goog-Message-Number": "1811101",
"X-Goog-Resource-Id": "wBkuOkYwEhDiXXXXXXXXX",
"X-Goog-Resource-Uri": "https://www.googleapis.com/calendar/v3/calendars/9t4rmmb2rfdvcXXXXXXX@group.calendar.google.com/events?alt=json",

X-Goog-Channel-Id是我选择的监视ID。 X-Goog-Resource-Uri似乎只是日历的链接。我不知道X-Goog-Resource-Id是什么。它似乎不是我的日历ID或我的事件ID。

我想知道的是数据有什么变化?如何从推送通知中提取该信息?

我不在乎我是否必须订阅我的应用创建的每个活动,或者每个日历只订阅一次。

1 个答案:

答案 0 :(得分:9)

当您收到推送通知时,它几乎不包含任何有用的信息。您必须向Google发出请求,询问自您上次同步后的更改情况。请阅读this article以获取更多信息。

基本上,您希望使用$_SERVER['HTTP_X_GOOG_CHANNEL_ID'](您生成的手表ID )和/或$_SERVER['HTTP_X_GOOG_RESOURCE_ID'](Google生成的手表ID)来查找日历ID你在自己的数据库中创建了一个手表(你在创建手表时必须存储它)。

获得日历ID后,您必须执行events/list请求才能找到更改的内容。他们在该页面上有一个PHP示例,但您必须添加您应该存储的syncToken

尽管events/watch处于"事件"之下,但您真的 特定事件的变化(不要被具有Google_Service_Calendar_Channel::setResourceId选项的PHP API所欺骗 - 它什么也不做。确保存储您获得的resourceId。您需要stop次通知。

此外,手表会在一段时间后过期。而你can't refresh them也是。我建议你在它即将到期之前一两周停止旧手表并创建一个新手表。新的ID必须与旧ID不同。