Настройка HTTP-уведомлений

Система уведомлений о событиях. Webhooks (вебхуки).

Webhooks (вебхуки) позволяют получать HTTP-уведомления в необходимый сервис о регистрации или покупке курса, завершении учеником урока или задания, об окончании доступа к курсу. 

Для отправки вебхуков необходимо:

1. Создать процесс в разделе «Автоматизация» и выбрать необходимый триггер.

2. Выбрать действие «Отправить HTTP-уведомление».

3. В поле URL вставить ссылку.
На указанный URL наша платформа будет отправлять уведомления о событиях. Ссылка может вести на собственный сервер, который должен быть заранее настроен на приём уведомлений, либо на готовую интеграцию со сторонним сервисом.

* Под готовой интеграцией предполагаются различные CRM, CMS-системы или сервисы Albato, Zapier и др. Подобные интеграции выдают ссылку, которую нужно вставить в поле URL.

** Мы отправляем только POST-запросы.

4. Далее потребуется сохранить процесс как черновик и снова зайти в редактирование созданного процесса.

На данном шаге появится поле «Секретный ключ» (не отображается при создании процесса автоматизации).

Секретный ключ невозможно изменить. Он предназначен для авторизации запросов от Zenclass. Принимающая сторона (сервер, готовая интеграция) может не проверять секретный ключ. В таком случае, будет возможна ситуация, когда кто-то посторонний пришлет HTTP-запрос на указанный URL, из-за чего могут произойти нежелательные действия на принимающей стороне.

5. Когда процесс по автоматизации будет полностью настроен, то можно его запустить.

Реализация защиты от посторонних запросов через проверку секретного ключа.

1. Сохраните секретный ключ в той системе, которая отвечает за прием вебхуков от Zenclass (CRM, CMS, Albato, Zapier и др.)

*Обращаем внимание, что хранить ключ требуется в секрете. То есть секретный ключ не нужно дополнительно хранить в других местах, а его просмотр не должен быть доступен посторонним.

2. Каждый раз, когда на указанный URL приходит запрос, требуется проверить подпись запроса по алгоритму (см. ниже). Это можно сделать с помощью секретного ключа, т.к. ключ известен только Zenclass и принимающей системе. Пройденная проверка будет означать, что запрос действительно был отправлен нашей платформой.

Алгоритм проверки подписи

1. Соедините с помощью символа & в одну строку следующие поля:

  • Секретный ключ
  • Поле id из тела запроса
  • Поле timestamp из тела запроса.

2. Получившуюся строку требуется передать в функцию sha1, чтобы посчитать хэш.

3. Сравните полученное значение с тем, что было отправлено в поле hash.

Приведем пример:

  • Предположим, секретный ключ это very_secret_phrase_123

  • В теле запроса отправлены поля

    • id со значением 123456

    • timestamp со значением 1703765506

Соединяем эти значения следующим образом:

very_secret_phrase_123&123456&1703765506

Далее по алгоритму эту строку требуется передать в функцию sha1 (пример кода на PHP):

$secret = 'very_secret_phrase_123';
$id = $request->get('id');
$timestamp = $request->get('timestamp');

$concatenated = "$secret&$id&$timestamp";
$hash = sha1($concatenated);

if ($hash === $request->get('hash')) {
    // Всё хорошо
}

Содержимое HTTP-запроса

Все запросы содержат следующие поля:

  • id – уникальный идентификатор запроса

  • hash – хэш для проверки подписи, см. выше

  • event_name – название события, к которому привязан вебхук

  • timestamp – целое число (Unix time) – дата события

  • payload – объект, содержимое которого напрямую зависит от того, какое событие привело к триггеру вебхука.

Доступные события и данные, которые отправляются в этих событиях (payload):

Событиеevent_namepayload
Урок завершенlesson_completed
  • user_id

  • user_email

  • course_id

  • course_name

  • lesson_id

  • lesson_name

Продукт оплаченpayment_accepted
  • user_id

  • user_email

  • payment_id

  • payment_variant

  • product_type

  • product_id

  • product_name

  • course_type (только для курсов)

Студент подписался на продуктproduct_user_subscribed
  • user_id

  • user_email

  • product_type

  • product_id

  • product_name

  • course_type (только для курсов)

Задание отправлено на проверкуlesson_task_submitted_for_review
  • user_id

  • user_email

  • course_id

  • course_name

  • task_id

  • task_name

Задание принятоlesson_task_accepted
  • user_id

  • user_email

  • course_id

  • course_name

  • task_id

  • task_name

Закончился доступ к курсуaccess_to_course_expired
  • user_id

  • user_email

  • course_id

  • course_name

Количество повторных попыток при отправке http-уведомления

Запрос считается доставленным, если сервер, указанный в поле URL, ответил HTTP-кодом 200. Если сервер ответил любым другим кодом или не ответил в течение 5 секунд, то производится повторная попытка, через 5 минут после неудачи. Далее следуют еще попытки:

  • через 30 минут

  • через 60 минут

  • через 3 часа

  • через 6 часов

Таким образом, не более 5 повторных попыток.

Если ни один запрос не завершился ответом 200, попытки доставить http-уведомление прекращаются.

Идемпотентность запросов

Каждый запрос содержит поле id. Значение этого поля будет отличаться в разных вебхуках, но будет повторяться при повторных попытках.

Это нужно для того, чтобы принимающая сторона могла проверить – возможно запрос с таким id уже был обработан ранее, а Zenclass по каким-то причинам прислал его еще раз.

👆 На этом пока всё