Аудитория: разработчик, DevOps Требует: публичный HTTPS-домен, токен бота Max
Max (ранее ICQ New) — мессенджер экосистемы VK/Mail.ru. Модуль app/Modules/Max/ принимает входящие сообщения через вебхук и пересылает их в Telegram-группу поддержки. Ответы менеджеров доставляются пользователю обратно в Max.
Эндпоинт вебхука: POST /api/max/bot
- Откройте мессенджер Max (web: max.ru или мобильное приложение)
- Найдите бота @metabot (официальный BotFather для Max)
- Отправьте
/newbotи следуйте инструкциям:- Введите имя бота
- Введите username бота (должен оканчиваться на
bot)
- Скопируйте полученный токен — он понадобится для
MAX_TOKEN
Откройте .env на сервере и добавьте:
MAX_TOKEN="ваш_токен_бота"
MAX_SECRET_KEY="придумайте_произвольный_секретный_ключ"
MAX_SECRET_KEY— произвольная строка для верификации запросов от Max. Max будет передавать её в заголовкеX-Max-Bot-Api-Secretпри каждом вебхук-запросе.
Перезапустите контейнер, чтобы конфиг применился:
docker compose restart appMax не имеет веб-интерфейса для регистрации вебхука. Регистрация выполняется через API с помощью токена бота.
curl -X POST "https://platform-api.max.ru/subscriptions" \
-H "Authorization: Bearer ВАШ_MAX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://ВАШ_ДОМЕН/api/max/bot",
"update_types": ["message_created", "bot_started"],
"secret": "ВАШ_MAX_SECRET_KEY"
}'Ожидаемый ответ:
{ "success": true }docker exec -it pet php artisan tinkeruse MaxBotApi\Config;
use MaxBotApi\MaxClient;
$client = new MaxClient(new Config(config('traffic_source.settings.max.token')));
$result = $client->subscriptions->subscribe(
url: config('app.url') . '/api/max/bot',
updateTypes: ['message_created'],
secret: config('traffic_source.settings.max.secret_key'),
);
echo $result ? 'OK' : 'FAILED';Max принимает вебхуки только на следующих портах:
| Порты |
|---|
| 80, 443 |
| 8080, 8443 |
| 16384–32383 |
curl "https://platform-api.max.ru/subscriptions" \
-H "Authorization: Bearer ВАШ_MAX_TOKEN"Ожидаемый ответ:
{
"subscriptions": [
{
"url": "https://ваш-домен.com/api/max/bot",
"time": 1700000000000,
"update_types": ["message_created", "bot_started"]
}
]
}curl -X POST https://ВАШ_ДОМЕН/api/max/bot \
-H "Content-Type: application/json" \
-H "X-Max-Bot-Api-Secret: ВАШ_MAX_SECRET_KEY" \
-d '{
"update_type": "message_created",
"timestamp": 1700000000000,
"message": {
"sender": { "user_id": 123456789, "name": "Test User" },
"recipient": { "user_id": 123456789 },
"timestamp": 1700000000000,
"body": {
"mid": "msg-test-001",
"seq": 1,
"text": "Тестовое сообщение"
}
}
}'Ожидаемый ответ: ok (HTTP 200)
При неверном секрете: HTTP 403:
{ "message": "Access is forbidden", "error": "Secret-Key is invalid!" }- Бот создан через @metabot, токен получен
-
MAX_TOKENзадан в.env -
MAX_SECRET_KEYзадан в.env - Контейнер перезапущен (
docker compose restart app) - Вебхук зарегистрирован через API (шаг 3)
- Регистрация вебхука подтверждена (шаг 4)
- Ручной тест эндпоинта возвращает
ok(шаг 5) - Тестовое сообщение от пользователя Max появляется в Telegram-группе
- Ответ менеджера из Telegram доставляется в Max
- Убедитесь, что домен доступен извне и работает по HTTPS
- Проверьте, что порт входит в список допустимых (80, 443, 8080, 8443, 16384–32383)
- Проверьте корректность токена в
MAX_TOKEN
- Убедитесь, что
MAX_SECRET_KEYв.envсовпадает со значениемsecretпри регистрации вебхука - Убедитесь, что в curl-запросе передаётся заголовок
X-Max-Bot-Api-Secretс правильным значением
Проверьте логи приложения:
docker exec -it pet tail -f storage/logs/laravel.logИли логи Loki (если настроен Grafana):
docker exec -it pet php artisan queue:work --onceУбедитесь, что очередь работает:
docker exec -it pet php artisan queue:workcurl -X DELETE "https://platform-api.max.ru/subscriptions" \
-H "Authorization: Bearer ВАШ_MAX_TOKEN"После сброса повторно зарегистрируйте вебхук (шаг 3).
| Компонент | Файл |
|---|---|
| Маршрут | app/Modules/Max/routes.php → POST /api/max/bot |
| Аутентификация | app/Modules/Max/Middleware/MaxQuery.php |
| Контроллер | app/Modules/Max/Controllers/MaxBotController.php |
| Обработка входящих | app/Modules/Max/Services/MaxMessageService.php |
| Пересылка в Telegram | app/Modules/Telegram/Jobs/SendMaxTelegramMessageJob.php |
| Ответ в Max | app/Modules/Max/Jobs/SendMaxMessageJob.php |
| API-обёртка SDK | app/Modules/Max/Api/MaxMethods.php |
| Конфиг | config/traffic_source.php → settings.max |
- SDK: prog-time/max-php-sdk
- Max Bot API: dev.max.ru
- Чек-лист вебхуков:
docs/webhook-checklist.md