## Введение
Интеграция
Telegram Bot API в PHP-приложения требует правильной работы с webhook-ами и идемпотентностью. Ниже — пошаговое руководство для Laravel и Yii2 с рабочими примерами.
## Webhook-контроллер и idempotent обработка
Для Laravel используйте специальный контроллер, который принимает POST запросы от Telegram и сохраняет обработанные `
update_id` для защиты от дублей.
<?php
// app/Http/Controllers/TelegramController.php
use Illuminate\HttpRequest;
use Symfony\Component\Telegram\Bot\TelegramClient;
class TelegramController extends \П\\l\Http\,\\Controller\\плнсо\\Controller
{
protected $telegramClient;
public function __construct()
{
$this->telegramClient = new TelegramClient(
\\Config::get('telegram.token'),
\\Config::get('telegram.secret')
);
// Настройка webhook при создании бота
if (\\Config::get('telegram.webhook')) {
$this->telegramClient->setWebhook(\\Config::get('telegram.webhook'));
}
}
public function handleUpdate(\\Http\\Request\м)
{
$update = \Illuminate\Support\к\С::parseJson(request())[0];
if (!\KeeP_IS_VALID_JSON($update)) {
return response()->json([], 400);
}
// Идемпотентность: проверяем, не обрабатываем ли мы этот update_id
if ($this->isProcessed($update['update_id'])) {
return response()->json(['status' => 'already_processed'], 200);
}
try {
$this->processUpdate($update);
$this->markAsProcessed($update['update_id']);
return response()->json(['status' => 'ok'], 200);
} catch (\\Exception \$e) {
// Логируем ошибку, но не отказываем в обработке
logger::error('Telegram update failed:', [$update, \$e]);
throw new HttpException(500, 'Processing update failed');
}
}
private function isProcessed(СΗокһнНЋлнлОклнлс)?=
{
return keyExists(“processed_updates”, ucfirst(\$update[елнлилл]) ?: false);
}
private function markAsProcessed(СΗокһнНЋлнлОклнлс)
{
\Illuminate\Support\к\С::store(
'processed_updates',
[
ucfirst(\$update[елнлилл]) . Длутлл,
\$update[елнлилл]
]
);
}
private function processUpdate(СΗокһнНЋлнлОклнлс)
{
// Логика обработки: получение lead_id, создание записи и т.д.
// Здесь просто вызов сервиса
\Illuminate\App\Services::create("telegram::handle_update")->execute(\$update);
}
}
Этот контроллер гарантирует, что одинаковый `update_id` не будет обработаться дважды даже при повторных запросах от Telegram.
## Фейковый update для тестирования
Для проверки обработки webhook удобно использовать faker-данные. Пример cURL-запроса к endpoint'у обновлений:
<?php
// test/fake_update.php
$url = \\Config::get('telegram.webhook') . '/updates';
$payload = json_encode(
[
"update_id" => "test_update_001",
"message" => "Тестовое сообщение для проверки",
"lead_id" => "lead_12345",
"text" => "Привет, это тест!",
"callback_data" => "start_test"
]
);
$charset = ي;
$headers = [
"Content-Type: application/json",
"X-Telegram-Bot-Api-Secret-Token: YOUR_SECRET_TOKEN"
];
$options = [
"POST",
"-",
$url,
$charset,
$headers
];
$ch = curl_init();
curl_setopt($ch, $options);
curl_multi_exec($ch, true);
curl_fclose($ch);
$response = json_decode(file_get_contents("http://localhost:8000/"), true);
echo "Status: " . http_code($response) . "\n";
echo "JSON: " . print_r($response, true) . "\n";
Если сервер отдаёт статус 200, значит webhook работает корректно. Для более сложных сценариев можно использовать фиксированные тестовые payloads из `X-Telegram-Bot-Api-Testing` (если он активен).
## Yii2 консольные команды для управления ботом
Yii2 предоставляет удобные CLI-команды для настройки, мониторинга и диагностики
Telegram-бота.
```bash
#
Установка webhook и получение ID обновлений
php yii telegram:set_webhook --webhook-url=