Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何处理谷歌日历API推送通知?_Php_Google Calendar Api - Fatal编程技术网

Php 如何处理谷歌日历API推送通知?

Php 如何处理谷歌日历API推送通知?,php,google-calendar-api,Php,Google Calendar Api,我似乎不明白 我正在尝试在我的web应用程序和Google日历之间创建事件的双向同步。我已成功将我的事件同步到谷歌日历,但谷歌发送给我的推送通知没有任何用处 当我创建新事件,然后创建手表时: $channel = new Google_Service_Calendar_Channel(); $channel->setId($watchId); $channel->setType('web_hook'); $channel->setAddress(URL::route('gapi

我似乎不明白

我正在尝试在我的web应用程序和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

我只想知道是什么数据改变了?如何从推送通知中提取该信息


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

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

基本上,您希望使用
$\u服务器['HTTP\u X\u GOOG\u CHANNEL\u ID']
(您生成的手表ID)和/或
$\u服务器['HTTP\u X\u GOOG\u RESOURCE\u ID']
(谷歌生成的手表ID)在自己的数据库中查找您创建手表时使用的日历ID(创建手表时必须存储此ID)

一旦你有了日历ID,你就必须发出一个请求来找出发生了什么变化。该页面上有一个PHP示例,但是您必须添加
syncToken
,您还应该存储该示例

尽管处于“事件”下,但您实际上是在侦听日历的所有事件,而不是特定事件中的更改(不要被PHP API愚弄,它有一个
Google\u Service\u calendar\u Channel::setResourceId
选项——它什么都不做)。确保存储您返回的
resourceId
。你需要它来提醒我


此外,手表会在一段时间后过期。你也是。我建议你在旧表即将到期前一两周把它停下来,换一块新的。新的ID必须与旧的不同。

创建监视请求时,ID“:字符串,应为通道Id。请求成功后,响应将包括资源的资源Id。例如,如果您想要事件,您应该向events.w发送监视请求atchhttps://developers.google.com/google-apps/calendar/v3/reference/events/watchX-Goog-Resource-Id 是资源的资源id,并且是唯一的。这是给你的资源的数字。如果您正在观看活动,则对日历上的活动所做的任何更改都将收到通知。检查链接中的接收通知部分。然后你可以做events.list来检查变化,这是很模糊的。原来“资源ID”是“手表”的ID。这不是我生成的手表ID(又名频道ID),也不是日历ID,也不是事件ID——这是谷歌的内部手表标识符。知道我做错了什么吗?我花了很长时间才意识到你通过发出事件/列表请求获得了
syncToken
。可能想在你的回答中表现得更明显,因为在我看来,你是在无中生有地使用syncToken。