Кажется, я не могу понять эту статью .
Я пытаюсь создать двухстороннюю синхронизацию событий между моим веб-приложением и Календарем Google. У меня есть мои события, успешно синхронизирующиеся с Календарем Google, но push-уведомления, которые 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
– это идентификатор часов, который я выбрал. X-Goog-Resource-Uri
кажется просто ссылкой на календарь. И я не знаю, что X-Goog-Resource-Id
. Он не является ни моим идентификатором календаря, ни моим идентификатором события.
Все, что я хочу знать, это то, какие данные изменились? Как извлечь эту информацию из push-уведомления?
Мне все равно, нужно ли мне подписываться на каждое событие, созданное моим приложением, или только один раз в календаре.
Когда вы получаете push-уведомление, оно не содержит практически никакой полезной информации. Вы должны отправить запрос в Google, чтобы узнать, что изменилось с момента последней синхронизации. Прочтите эту статью для получения дополнительной информации.
В принципе, вы хотите использовать $_SERVER['HTTP_X_GOOG_CHANNEL_ID']
(созданный вами идентификатор часов) и / или $_SERVER['HTTP_X_GOOG_RESOURCE_ID']
(генерирует идентификатор часов Google), чтобы найти идентификатор календаря, в котором вы создали часы ваш собственный БД (вам придется хранить это при создании часов).
Когда у вас есть идентификатор календаря, вам нужно сделать запрос событий / списка, чтобы узнать, что изменилось. У них есть пример PHP на этой странице, но вам нужно добавить в syncToken
который вы также должны хранить.
Несмотря на то, что события / часы находятся под «событиями», вы действительно слушаете все события для календаря, а не изменения в конкретном событии (не обманывайте PHP API, который имеет параметр Google_Service_Calendar_Channel::setResourceId
– он ничего не делает). Не забудьте сохранить resourceId
вы вернетесь. Вам нужно будет остановить уведомления.
Кроме того, часы истекают через некоторое время. И вы не можете их обновить . Я предлагаю вам остановить старые часы неделю или две, прежде чем истечет срок действия и создаст новый. Новый должен иметь другой идентификатор, чем старый.