【问题标题】:How to handle Google Calendar API push notifications?如何处理 Google Calendar API 推送通知?
【发布时间】:2015-08-11 02:28:04
【问题描述】:

我似乎无法理解this article

我正在尝试在我的网络应用程序和 Google 日历之间创建 2 向事件同步。我的活动已成功同步到 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。

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

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

【问题讨论】:

  • 创建watch请求时,id":string,应该是channelId,一旦请求成功,response就会包含资源的resource id,比如想要事件,您应该将观看请求发送到 events.watchhttps://developers.google.com/google-apps/calendar/v3/reference/events/watch
  • X-Goog-Resource-Id 是您的资源的资源 ID,并且是唯一的。它是给您的资源的编号。如果您正在观看活动,那么对日历上的活动进行任何更改,您都会收到通知。检查链接developers.google.com/google-apps/calendar/v3/push 中的接收通知部分。然后你可以做 events.list 来检查变化。
  • 这很模糊。事实证明,“资源 ID”是“手表”的。这不是我生成的手表 ID(又名频道 ID),也不是日历 ID,也不是事件 ID——它是 Google 的内部手表标识符。

标签: php google-calendar-api


【解决方案1】:

当您收到推送通知时,它几乎不包含任何有用的信息。您必须向 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 不同。

【讨论】:

  • 我花了很长时间才意识到您可以通过发出事件/列表请求获得syncToken。可能想在您的回答中明确表示,因为在我看来,您似乎是凭空获得了 syncToken。
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2013-11-08
  • 2012-04-25
相关资源
最近更新 更多