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

问题描述 投票:0回答:2

我似乎无法理解这篇文章

我正在尝试在我的网络应用程序和 Google 日历之间创建事件的双向同步。我的活动已成功同步到 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/9[email protected]/events?alt=json",

X-Goog-Channel-Id
是我选择的手表ID。
X-Goog-Resource-Uri
似乎只是日历的链接。而且我不知道什么
X-Goog-Resource-Id
。它似乎不是我的日历 ID 或我的活动 ID。

我想知道的是哪些数据发生了变化?如何从推送通知中提取该信息?

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

php google-calendar-api
2个回答
25
投票

当您收到推送通知时,它几乎不包含任何有用的信息。您必须向 Google 发出请求,询问自上次同步以来发生了什么变化。阅读本文了解更多信息。

基本上,您想要使用

$_SERVER['HTTP_X_GOOG_CHANNEL_ID']
you 生成的手表 ID)和/或
$_SERVER['HTTP_X_GOOG_RESOURCE_ID']
(Google 生成的手表 ID)来查找您在自己的数据库中创建手表的日历 ID(您创建手表时必须存储它)。

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

syncToken

尽管 events/watch 位于“事件”下,但您真的正在监听日历的所有事件,而不是特定事件中的更改(不要被具有

 的 PHP API 所愚弄) Google_Service_Calendar_Channel::setResourceId
选项——它什么也不做)。请务必保存您拿回来的
resourceId
。您需要它来停止通知。

此外,手表在一段时间后就会过期。而且您也无法刷新它们。我建议您在旧手表即将到期前一两周停止使用并制作一块新手表。新的 ID 必须与旧的不同。


0
投票

多年来,谷歌非常不稳定地更改了它发送的标头密钥......我已经经历过:

x-goog-channel-id
X-Goog-Channel-ID
X-Goog-Channel-Id

解决这个问题非常令人沮丧,因此您可以编辑标头以将其小写,或者在未找到预期标头的键之一时创建警报/日志。

© www.soinside.com 2019 - 2024. All rights reserved.