В данный момент существует несколько видов хуков:
- Для каждого сообщения отправленного из amoCRM в канал чата
- Есть 2 версии данных хуков. v1 и v2. v1 является устаревшим и больше не поддерживается.
- Для событий “Менеджер печатает” (требуется отдельная подписка на хук для каждого канала через техническую поддержку)
Хук отправляется только один раз и не повторяется в случае ошибок при получении на стороне интеграции. Время ответа на хук тоже ограничено, поэтому хорошей практикой считается обработка бизнес логики в фоне, а при приеме хука только проверять подпись запроса.
Оглавление
Проверка подлинности хуков
Каждый хук содержит заголовок X-Signature, который рассчитывается только от тела запроса методом HMAC-SHA1. В качестве секрета используется секрет канала. Таким образом вы сможете проверить подлинность входящих хуков. Для этого вам необходимо рассчитать хэш от тела входящего запроса и сравнить с тем, который приходит в заголовке X-Signature.
Пример на PHP:
$secret = '5a44c5dff55f3c15a4cce8d7c4cc27e207c7e189';
$str = file_get_contents('php://input');
$signature = hash_hmac('sha1', $str, $secret);
if (isset($_SERVER['HTTP_X_SIGNATURE']) && $signature === $_SERVER['HTTP_X_SIGNATURE']) {
//valid hook
}
Хук сообщения v2
Описание
Хук отправляется при отправке сообщений из amoCRM, если при подключении канала аккаунта выставлена версия хука v2. Необязательные поля могут не приходить в хуке.
Важно отметить, что сообщение может прийти одновременно с медиа, текстом и кнопками. Также стоит отметить, что при отправке нескольких вложений за раз, сообщение будет разбито на несколько хуков, но у них будет общий message[message][media_group_id].
Параметры запроса
Параметр |
Тип данных |
Описание |
account_id |
string |
ID аккаунта в API чатов |
time |
int |
Время генерации хука, метка unix |
message[conversation] |
object |
Объект с информацией о чате. Описание объекта |
message[source] |
object |
Объект с информацией об источнике. Описание объекта |
message[sender] |
object |
Объект с информацией об отправителе сообщения. Описание объекта |
message[receiver] |
object |
Объект с информацией о получателе сообщения. Описание объекта |
message[timestamp] |
int |
Время сообщения, метка unix |
message[msec_timestamp] |
int |
Время сообщения, метка unix c миллисекундами |
message[message] |
object |
Объект с информацией об отправляемом сообщении. Описание объекта |
Описание объекта conversation
Параметр |
Тип данных |
Описание |
id |
string |
Идентификатор чата в API чатов |
client_id |
string |
Идентификатор чата на стороне интеграции. Необязательное поле. Если чат создан через функцию “Написать первым”, поле будет отсутствовать в хуке |
Описание объекта source
Параметр |
Тип данных |
Описание |
external_id |
string |
Идентификатор источника чата на стороне интеграции. |
Описание объекта sender
Параметр |
Тип данных |
Описание |
id |
string |
Идентификатор отправителя сообщения в API чатов |
name |
string |
Имя отправителя сообщения в API чатов |
Описание объекта receiver
Параметр |
Тип данных |
Описание |
id |
string |
Идентификатор получателя сообщений в API чатов |
phone |
string |
Телефон получателя сообщения. Поле приходит пустой строкой, если не передавался профиль при создании чата. При создании чата через функционал “Написать первым”, будет передан выбранный номер телефона |
email |
string |
Email получателя сообщения. Поле приходит пустой строкой, если не передавался профиль при создании чата |
Описание объекта message
Параметр |
Тип данных |
Описание |
id |
string |
Идентификатор сообщения в API чатов |
type |
string |
Тип сообщений, может быть одним из списка: text, file, video, picture, voice, audio, sticker |
text |
string |
Текст сообщения. Для типа text обязательно, для других типов сообщений может быть пустым |
tag |
string |
Тег, выбранный пользователем при отправки сообщений. В данный момент функционал не поддерживается для сторонних интеграций |
media |
string |
Ссылка на медиа, если тип сообщения не text |
thumbnail |
string |
Ссылка на картинку-предпросмотр. Приходит только для типов picture и video |
file_name |
string |
Название файла |
file_size |
int |
Размер файла в байтах |
markup |
object |
Объект клавиатуры, которую нужно отобразить вместе с сообщением. Структура объекта клавиатуры |
template |
object |
Объект шаблона, если сообщение было отправлено с использованием шаблона. Структура объекта шаблона |
reply_to |
object |
Объект цитаты-ответа. Структура объекта цитирования |
forwards |
object |
Объект цитаты c перессылки. Структура объекта цитирования |
Структура объекта разметки клавиатуры
Хуки сообщений поддерживают разметку клавиатуры amoCRM. Клавиатура это массив массивов кнопок с указанным способом их расположения. Способ расположения указывается в поле mode. В данный момент для интеграций mode объекта всегда содержит значение inline. Значение inline говорит о том, что клавиатура должна под текстом сообщения. В данный момент в одном объекте не могут прийти кнопки разных типов.
Также на Kommo.com доступна поддержка функционала WhatsApp List Message, при отправке подобного сообщения с помощью Salesbot, информация также находится в объекте markup. Для List Message, в этом объекте, не будет свойств mode и buttons, но будет доступно свойство list_message.
Параметр |
Тип данных |
Описание |
mode |
string |
Способ расположения клавиатуры. Возможные значения: inline — кнопки отображаются под текстом сообщения |
buttons |
button[][] |
Массив массивов с объектами-кнопками. Структура объекта кнопки |
list_message |
list_message |
Объект сообщения типа WhatsApp List Message. Структура объекта List Message |
Структура объекта кнопки
Параметр |
Тип данных |
Описание |
text |
string |
Текст. Когда пользователь нажимает на текстовую кнопку, мессенджер должен отправить сообщение с текстом этой кнопки в чат |
url |
string |
Ссылка. Когда пользователь нажимает на ссылочную кнопку, мессенджер должен осуществить переход по этой ссылке. Свойство может отсутствовать, если передана обычная кнопка |
Структура объекта List Message
Параметр |
Тип данных |
Описание |
header |
string |
Заголовок сообщения. Строка длиной до 60 символов (поддерживаются эмодзи) |
body |
string |
Тело сообщения. Строка длиной да 1024 символов (поддерживаются эмодзи и разметка Markdown) |
footer |
string |
Нижняя часть сообщения. Строка длиной да 60 символов (поддерживаются эмодзи, ссылки и разметка Markdown) |
button |
string |
Название главной кнопки, которая будет показываться пользователю, при нажатии на эту кнопку открывается меню с переданными sections |
sections |
array |
Массив объектов (от 1 до 10 элементов), описывающий интерактивные элементы (секции) |
sections[0] |
object |
Объект, описывающий интерактивную секцию |
sections[0][title] |
string |
Название секции. Строка длиной до 24 символов. |
sections[0][rows] |
array |
Массив объектов (от 1 до 10 элементов), описывающий отдельные кнопки в секции |
sections[0][rows][0] |
object |
Объект, описывающий отдельную кнопки в секции |
sections[0][rows][0][callback_data] |
string |
Уникальный идентификатор, который нужно передать в WhatsApp и который необходимо прислать с выбранной пользователем кнопкой в свойстве callback_data объекта message. |
sections[0][rows][0][title] |
string |
Название кнопки |
sections[0][rows][0][description] |
string |
Описание кнопки |
Пример хука о сообщении с List Message доступен ниже
Структура объекта шаблона
Сообщение, отправленное из amoCRM может быть шаблонизированным. Если отправленное сообщение шаблонизированное, то в хуке вы получите информацию о шаблоне.
Параметр |
Тип данных |
Описание |
id |
int |
ID шаблона на стороне amoCRM |
external_id |
string |
Если у шаблона на стороне amoCRM, при создании через API был указан external_id, то вы получите его в хуке |
content |
string |
Оригинальный текст шаблона, может содержать маркеры |
params |
array |
Массив объектов заменяемых маркеров в тексте |
params[][key] |
string |
Маркер, используемый в сообщении |
params[][value] |
string |
Значение, которое должно быть использовано вместо маркера |
Структура объекта цитаты с ответом
Сообщение, отправленное из amoCRM может содержать цитату с ответом. Чтобы включить возможность отправлять сообщения, содержащие цитату с ответом, из amoCRM в интеграцию – нужно обратиться техническую поддержку Сообщение из цитаты может принадлежать только тому же чату, что и отправляемое сообщение
Структура объекта цитаты с перессылкой
Сообщение, отправленное из amoCRM может содержать цитату c перессылкой. Чтобы включить возможность отправлять сообщения, содержащее цитату с перессылаемыми сообщениями, из amoCRM в интеграцию – нужно обратиться техническую поддержку Сообщения из цитаты с перессылкой могут принадлежать любому чату, который принадлежит интеграции Сообщения из цитаты могут принадлежать любому внешнему чату, что принадлежит интеграции
Структура объекта вложенного сообщения
Параметр |
Тип данных |
Описание |
id |
string |
Идентификатор сообщения в API чатов |
type |
string |
Тип сообщений, может быть одним из списка: text, file, video, picture, voice, audio, sticker |
text |
string |
Текст сообщения. Для типа text обязательно, для других типов сообщений может быть пустым |
media |
string |
Ссылка на медиа, если тип сообщения не text |
thumbnail |
string |
Ссылка на картинку-предпросмотр. Приходит только для типов picture и video |
file_name |
string |
Название файла |
file_size |
int |
Размер файла в байтах |
timestamp |
int |
Время сообщения, метка unix |
msec_timestamp |
int |
Время сообщения, метка unix c миллисекундами |
sender |
object |
Объект с информацией об отправителе сообщения. Описание объекта |
receiver |
object |
Объект с информацией о получателе сообщения (без телефона и почты). Описание объекта |
Пример запроса
{
"account_id": "52e591f7-c98f-4255-8495-827210138c81",
"time": 1639572261,
"message": {
"receiver": {
"id": "2ed64e26-70a1-4857-8382-bb066a076219",
"phone": "79161234567",
"email": "example.client@example.com",
"client_id":"my_int-1376265f-86df-4c49-a0c3-a4816df41af8"
},
"sender": {
"id": "76fc2bea-902f-425c-9a3d-dcdac4766090"
},
"conversation": {
"id": "8e4d4baa-9e6c-4a88-838a-5f62be227bdc",
"client_id":"my_int-d5a421f7f218"
},
"source":{
"external_id":"78001234567"
},
"timestamp": 1639572260,
"msec_timestamp": 1639572260980,
"message": {
"id": "0371a0ff-b78a-4c7b-8538-a7d547e10692",
"type": "picture",
"text": "Текст сообщения Сделка #15926745",
"markup": {
"mode": "inline",
"buttons": [
[
{
"text":"Принять заказ"
},
{
"text":"Отменить заказ"
}
]
]
},
"tag": "",
"media": "https://amojo.amocrm.ru/attachments/image.jpg",
"thumbnail": "https://amojo.amocrm.ru/attachments/image_320x200.jpg",
"file_name": "",
"file_size": 0,
"template": {
"id": 7103,
"external_id": "my_external_id",
"content": "Текст сообщения {{lead.name}}",
"params": [
{
"key": "{{lead.id}}",
"value": "15926745"
}
]
}
}
}
}
Пример запроса c List Message
{
"account_id": "52e591f7-c98f-4255-8495-827210138c81",
"time": 1639572261,
"message": {
"receiver": {
"id": "2ed64e26-70a1-4857-8382-bb066a076219",
"phone": "79161234567",
"email": "example.client@example.com",
"client_id": "my_int-1376265f-86df-4c49-a0c3-a4816df41af8"
},
"sender": {
"id": "76fc2bea-902f-425c-9a3d-dcdac4766090"
},
"conversation": {
"id": "8e4d4baa-9e6c-4a88-838a-5f62be227bdc",
"client_id": "my_int-d5a421f7f218"
},
"source": {
"external_id": "78001234567"
},
"timestamp": 1639572260,
"msec_timestamp": 1639572260980,
"message": {
"id": "0371a0ff-b78a-4c7b-8538-a7d547e10692",
"type": "text",
"text": "Текст сообщения Сделка #15926745",
"markup": {
"list_message": {
"header": "Какой вид услуги вы хотите получить?",
"body": "Пожалуйста, выберите один из вариантов ответа в меню по кнопке ниже.",
"footer": "С уважением, Тестовая Компания",
"button": "Меню услуг",
"sections": [
{
"title": "Доступные услуги",
"rows": [
{
"callback_data": "vG9ujre8N7",
"title": "Услуга 1",
"description": "Описание услуги 1"
}
]
}
]
}
}
}
}
}
HTTP коды ответа
Адрес, получающий данный вебхук должен ответить http-кодом 200, в таком случае мы считаем хук успешно принятым.
Код ответа |
Условие |
200 |
Хук успешно принят |
Хук о печати
Описание
Хук отправляется, когда менеджер печатает сообщение в интерфейсе amoCRM. Хук отправляется не чаще, чем раз в 5 секунд.
Параметры запроса
Параметр |
Тип данных |
Описание |
account_id |
string |
ID аккаунта в API чатов |
time |
int |
Время генерации хука, метка unix |
action[typing][conversation][id] |
string |
Идентификатор чата в API чатов |
action[typing][conversation][client_id] |
string |
Идентификатор чата на стороне интеграции. Необязательное поле. Если чат создан через функцию “Написать первым”, поле будет отсутствовать в хуке |
action[typing][expired_at] |
int |
timestamp временной метки, когда мы считаем, что пользователь уже не печатает. Мы передаем временную метку окончания тайпинга, как текущее время начала печати + 5 секунд |
action[user][id] |
string |
Идентификатор пользователя, который совершает действие в API чатов |
Пример запроса
{
"account_id": "81ede28b-8952-4785-abe2-c8d93f5fcc7d",
"time": 1637087558,
"action": {
"typing": {
"user": {
"id": "fb0fb604-9e04-4e1d-bee9-37c71924cdc2"
},
"conversation": {
"id": "f1e4e02c-f502-4165-9377-8575c55c5ebd",
"client_id": "c7"
},
"expired_at": 1637087563
}
}
}
HTTP коды ответа
Адрес, получающий данный вебхук должен ответить http-кодом 200, в таком случае мы считаем хук успешно принятым.
Код ответа |
Условие |
200 |
Хук успешно принят |
Хук о реакции
Описание
Хук отправляется, когда менеджер реагирует на сообщение или убирает реакцию в интерфейсе amoCRM.
Параметры запроса
Параметр |
Тип данных |
Описание |
account_id |
string |
ID аккаунта в API чатов |
time |
int |
Время генерации хука, метка unix |
action[reaction][message] |
object |
Объект сообщения Описание объекта |
action[reaction][user] |
object |
Объект с информацией об отправителе реакции Описание объекта |
action[reaction][conversation][id] |
string |
Идентификатор чата в API чатов |
action[reaction][conversation][client_id] |
string |
Идентификатор чата на стороне интеграции. Необязательное поле. Если чат создан через функцию “Написать первым”, поле будет отсутствовать в хуке |
action[reaction][type] |
string |
Тип события: react, unreact |
action[reaction][emoji] |
string |
Реакция поставленная пользователем. Необязательное поле. Если пользователь убрал реакцию, то поле будет отсутствовать в хуке |
Описание объекта message реакции
Параметр |
Тип данных |
Описание |
id |
string |
Идентификатор сообщения в API чатов |
client_id |
string |
Идентификатор сообщения чата на стороне интеграции. Необязательное поле. Если сообщение было создана на стороне amoCRM, то поле будет отсутствовать в хуке |
receiver |
object |
Объект с информацией о получателе сообщения Описание объекта |
sender |
object |
Объект с информацией об отправителе сообщения Описание объекта |
timestamp |
int |
Время сообщения, метка unix |
msec_timestamp |
int |
Время сообщения, метка unix c миллисекундами |
Пример запроса
{
"account_id": "81ede28b-8952-4785-abe2-c8d93f5fcc7d",
"time": 1637087558,
"action": {
"reaction": {
"msgid": "cd05887d-bb16-4e11-b298-40455cc77195",
"user": {
"id": "fb0fb604-9e04-4e1d-bee9-37c71924cdc2"
},
"conversation": {
"id": "f1e4e02c-f502-4165-9377-8575c55c5ebd",
"client_id": "c7"
},
"type": "react",
"emoji": "😍"
}
}
}
HTTP коды ответа
Адрес, получающий данный вебхук должен ответить http-кодом 200, в таком случае мы считаем хук успешно принятым.
Код ответа |
Условие |
200 |
Хук успешно принят |
Хук сообщения v1
Описание
Данная версия хука не поддерживается и не получает обновлений Хук отправляется при отправке сообщения в канал, если при подключении канала аккаунта выставлена версия хука v1.
Параметры запроса
Параметр |
Тип данных |
Описание |
receiver |
string |
Идентификатор учаcтника чата (клиента) на стороне интеграции |
conversation_id |
string |
Идентификатор чата на стороне интеграции |
type |
string |
Тип сообщений, может быть одним из списка: text,file,video,picture |
media |
string |
Url на картинку,файл,видео |
thumbnail |
string |
Поле содержит url на предпросмотр, актуально только для типа picture,video |
file_name |
string |
Название файла для url в поле media |
file_size |
int |
Размер данных в байтах поля media |
msec_timestamp |
int |
Время сообщения, метка unix c миллисекундами |
Пример запроса
{
"receiver": "b55770b5-974f-4dd6-8dd3-0356c08dc600",
"conversation_id": "a4a5ab10-ea6f-4af4-8514-a8265e5c71bd",
"msec_timestamp": 1596470952116,
"type": "text",
"text": "Можете уточнить адрес доставки заказа ?",
"media": "",
"thumbnail": "",
"file_name": "",
"file_size": 0
}
HTTP коды ответа
Код ответа |
Условие |
200 |
Хук успешно обработан |