Вебхуки (webhooks)
Эта статья описывает обработку вебхуков на стороне внешнего сервера — форматы запросов и ответов.
Эта статья описывает обработку вебхуков на стороне внешнего сервера — форматы запросов и ответов.
Настройка вебхуков в Бипиуме описана в статье «Вебхуки».
События
Виды событий
Бипиум поддерживает 3 вида событий:
Вид | Описание |
Уведомления | Срабатывают ПОСЛЕ выполнения операции |
Запросы | Срабатывают ДО выполнения операции и ожидают подтверждения от сторонней системы |
Действия | Срабатывают после изменения поля во время редактирования карточки, до сохранения записи |
Типы событий
Код | Описание |
| После создания записи |
| После изменения записи |
| После удаления записи |
| Перед созданием — ожидает одобрения |
| Перед изменением — ожидает одобрения |
| Перед удалением — ожидает одобрения |
| После изменения поля в карточке, до сохранения записи |
Принцип работы
Когда наступает одно из событий, Бипиум выбирает подходящие подписки и рассылает сообщения сторонним системам. Если подходящих подписок несколько, то события отправляются параллельно на все адреса.
Вебхук-уведомления
Сервер Bpium отправляет запросы подписчикам одновременно и не ждет завершения их работы. Работа сотрудника в системе не блокируется.
Вебхук-запросы
Сервер Bpium отправляет запросы подписчикам одновременно и ждет завершения хотя бы одного с ошибкой или завершения всех подписчиков без ошибок.
Таймаут ожидания — 10 секунд.
Ответ с ошибкой от первого подписчика сразу возвращается сотруднику.
Вебхук-действия
Сервер Bpium:
Отправляет запросы подписчикам.
Ждет завершения всех подписчиков.
Объединяет результаты.
Возвращает новые значения полей сотруднику.
Очередь отправки
Бипиум не использует очередь отправки событий. Если сторонняя система не доступна, Бипиум не станет повторять запрос позже. В случае вебхук-запросов будет считаться, что получен запрещающий код ответа.
Порядковый номер сообщения
Бипиум отсчитывает сколько раз сработал каждый вебхук и отправляет это число (sequenceId) в сообщении. Этот счетчик помогает отследить были ли пропущены события принимающей стороной
Формат запроса
Запрос — HTTP-запрос сервера Bpium к сторонней системе с информацией о событии. Запрос состоит из:
Поле | Описание |
| Информация о вебхуке |
| Измененные данные |
| Идентификатор сотрудника |
Пример запроса
{ "timestamp" : "1459500623", // время события "hook" : { "id" : "2", // номер вебхука в системе "event" : "record.before.updated", // тип события "sequenceId" : 84 // порядковый номер сообщения }, "payload" : { "catalogId" : "5", // каталог с изменениям "recordId" : "199", // запись с изменениям "values" : { // список измененных полей и значений в формате API Бипиума "2" : "Текст", "3" : null, "4" : ["1"], "5" : [ {"id":"1", "title":"admin"} ], "6" : "2016-04-01T08:49:15.920Z", "9" : [ {"contact":"+7-987-654-32-10", "comment":"Сотовый"} ] }, "prevValues" : { // предыдущие значения записи } }, "user" : { "id" : "1" } // идентификатор сотрудника }
Измененные данные (payload)
События *.created
Поле | Описание |
| Идентификатор каталога, в котором создана запись |
| Идентификатор созданной записи (не отправляется в |
| Измененные значения полей в формате метода API на получение записи |
События *.updated
Поле | Описание |
| Идентификатор каталога, в котором изменена запись |
| Идентификатор измененной записи |
| Измененные значения полей в формате метода API на получение записи |
| Предыдущие значения всех полей в формате метода API на получение записи |
События *.deleted
Поле | Описание |
| Идентификатор каталога, в котором удалена запись |
| Идентификатор удаленной записи |
События *.updating
Поле | Описание |
| идентификатор каталога, в котором изменено поле |
| идентификатор редактируемой записи (если запись создана) |
| измененные значения полей в формате метода API на получение записи |
| все значения полей в формате метода API на получение записи |
Формат ответа
Ответ — HTTP-ответ сторонней системе на запрос от сервера Bpium.
Коды ответов
Успешные коды ответов
Код | Описание |
| Успешный ответ |
| Перенаправление |
| Вебхук будет удален |
Неуспешные коды ответов
Код | Описание |
| Ошибка клиента |
| Ошибка сервера |
Тело ответа
Сторонний сервер отправляет HTTP-ответ в формате JSON и должен указать заголовок Content-type: 'application/json; charset=utf-8' .
Вебхук-уведомления
Сервер Bpium не ожидает никакого ответа от стороннего сервера.
Вебхук-запросы
HTTP-ответ может включать сообщение (message) , которое будет показано сотруднику, если сторонний сервер ответит неуспешным кодом на вебхук-запрос событие. Сообщение для сотрудника может быть указано в виде строки или объекта с полями title и text.
Пример
{ "message": { // опционально, string или object{title, text} "title": "Информация", "text": "Отказано в доступе!" } }
Вебхук-действия
HTTP-ответа может включать сообщение (message) , которое будет показано сотруднику, и новые значения полей (values) для автоматической подстановки в карточку записи на экране сотрудника. Сообщение для сотрудника может быть указано в виде строки или объекта с полями title и text.
Пример
{ "message": { // опционально, string или object{title, text} "title": "Информация", "text": "Сотрудник найден" }, "values": { // опционально "2": "Steve", // текстовое поле "3": [ // поле контакт { "contact": "+78000000000" } ], "4": [ // поле контакт { "contact": "Steve@gmail.com" } ], "5": [ // поле связанный объект { "recordId": "5", "catalogId": "65", "sectionId": "18", "recordTitle": "Отдел продаж", "catalogIcon": "content-11" } ] } }
Примечание: Значения полей user, object и file должны быть переданы со всеми дополнительными параметрами. У каждого из этих полей имеется свой формат, как при получении записи.
Безопасность
Бипиум подтверждает свою подлинность, подписывая сообщения закрытым ключом алгоритмом HMAC-MD5. Закрытый ключ задаётся в настройках вебхука.
Подпись передается в HTTP-заголовке X-Hook-Signature закодированная алгоритмом Base64.
Пример PHP
$signature = base64_encode( hash_hmac('md5', $body, $secretKey, true) );
Пример Node.js
var http = require('http'); var textBody = require("body"); var crypto = require('crypto'); http.createServer(function (req, res, opts) { textBody(req, function (err, body) { var hmac = crypto.createHmac( 'md5', secretKey ); hmac.setEncoding('base64'); hmac.write( body ); hmac.end(); signature = hmac.read(); // ... }); }).listen(80);
API
Список вебхуков хранится в каталоге «Вебхуки» в отделе «Управление». Это значит, что для получения вебхуков и создания новых можно использовать стандартные методы API Бипиума.