Настройка push-уведомлений для Google Calendar API с помощью клиента PHP

Я хочу настроить push-уведомления для Google Calendar API , где мой сервер получает уведомление об изменении определенного ресурса в API календаря Google. Я хочу сделать это с помощью клиентской библиотеки API Google для PHP .

Но кажется, у них нет метода для просмотра ресурсов календаря Google в библиотеке PHP. Может быть, в других библиотеках есть метод watch, но я не уверен в этом.

В основном, чтобы настроить push-уведомления для определенного ресурса, вам нужно отправить запрос на публикацию по URL-адресу, подобному этому ...

POST https://www.googleapis.com/calendar/v3/calendars/[email protected]/events/watch
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications" // Your receiving URL.
}

Я могу легко сделать это с помощью curl в PHP, но моя проблема в том, что запрос не авторизован с помощью токена Google OAuth, поэтому он приводит к ошибке.

Я хочу знать, есть ли способ решения этой проблемы ...

ОБНОВЛЕНИЕ

Я пытался отправить соединение с Google без добавления правильных заголовков, поэтому я получал ошибку авторизации. После исправления этой части у меня все еще возникают проблемы с ошибкой Invalid Credentials. Вот как выглядит мой фрагмент ...

    $url = sprintf("https://www.googleapis.com/calendar/v3/calendars/%s/events/watch", $calendar);

    /* setup the POST parameters */
    $fields = array(
        'id'        => "some_unique_key",
        'type'      => "web_hook",
        'address'   => sprintf("http://%s//event_status/update_google_events", $_SERVER['SERVER_NAME'])
        );

    /* convert the POST parameters to URL query */
    $fields_string = '';
    foreach ($fields as $key => $value) {
        $fields_string .= sprintf("%s=%s&", $key, $value);
    }
    rtrim($fields_string, '&');

    /* setup POST headers */
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Authorization: OAuth ' . $access_token;

    /* send POST request */
    $channel = curl_init();
    curl_setopt($channel, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($channel, CURLOPT_URL, $url);
    curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($channel, CURLOPT_POST, true);
    curl_setopt($channel, CURLOPT_POSTFIELDS, $fields_string);
    curl_setopt($channel, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($channel, CURLOPT_TIMEOUT, 3);
    $response = curl_exec($channel);
    curl_close($channel);

    error_log($response);

person vikmalhotra    schedule 29.10.2013    source источник
comment
Есть идеи, что я здесь делаю не так: stackoverflow.com/questions/34654504/   -  person Sachin Prasad    schedule 07.01.2016


Ответы (2)


Вот мое решение проблемы. Я понял, что делаю неправильно, немного повозившись с Google Play.

Я сделал то, что

  • Я закодировал тело запроса POST в формате JSON вместо отправки параметров запроса URL.
  • Изменена Authorization часть запроса POST с OAUth {access_token} на Bearer {access_token}.

В основном просто следовал документации Google по настройке push-уведомлений.

$url = sprintf("https://www.googleapis.com/calendar/v3/calendars/%s/events/watch", $calendar);

/* setup the POST parameters */
$fields = json_encode(array(
    'id'        => "some_unique_key",
    'type'      => "web_hook",
    'address'   => sprintf("http://%s//event_status/update_google_events", $_SERVER['SERVER_NAME'])
    ));

/* setup POST headers */
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer ' . $access_token;

/* send POST request */
$channel = curl_init();
curl_setopt($channel, CURLOPT_HTTPHEADER, $headers);
curl_setopt($channel, CURLOPT_URL, $url);
curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);
curl_setopt($channel, CURLOPT_POST, true);
curl_setopt($channel, CURLOPT_POSTFIELDS, $fields);
curl_setopt($channel, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($channel, CURLOPT_TIMEOUT, 3);
$response = curl_exec($channel);
curl_close($channel);

error_log($response);
person vikmalhotra    schedule 29.10.2013
comment
Спасибо, как вы получили уведомления об изменениях? Я пытаюсь использовать get_headers (), но всякий раз, когда я что-то меняю в своем календаре, я не получаю уведомления по указанному URL-адресу. Как я могу узнать, что получил уведомление? - person prateekkathal; 12.05.2014
comment
Вы можете использовать apache_request_headers () @ kakashihatake2 - person Chandrew; 21.05.2014
comment
@Chandrew хорошо, но Google перезванивает не только этой странице - person prateekkathal; 22.05.2014
comment
Затем вам может потребоваться отправить фактический запрос на просмотр. Я бы рекомендовал регистрировать любой запрос POST, поступающий на ваш URL-адрес уведомлений о часах. - person Chandrew; 22.05.2014
comment
@vikkun Есть идеи, как получить push-уведомление на удаленный скрипт php? Что мне нужно вставить в скрипт, чтобы правильно получать и перехватывать сообщения? Я пробовал с getallheaders(). Но там пусто. - person Khurshid Alam; 12.07.2015
comment
@ kakashihatake2 К вашему сведению, убедитесь, что у вашего сайта есть действующий сертификат SSL, иначе вы вообще не будете получать никаких уведомлений. - person Sam; 19.12.2015
comment
@SamuelKilada Спасибо за ответ. Да, потом разобрался ... Сейчас все нормально работает ... :) - person prateekkathal; 21.12.2015

Мне удалось это сделать через клиентскую библиотеку php:

$channel = new Google_Service_Calendar_Channel($client);
$channel->setId('00000000-0000-0000-0000-000000000001');
$channel->setType('web_hook');
$channel->setAddress('https://www.yourserver.com/handleWatch.php');
$watchEvent = $service->events->watch(yourCalendarId, $channel, array());

BR

person Wim    schedule 02.03.2016
comment
Какой сервис является переменной $ service? - person Berni; 01.06.2021