Інтеграція Telegram у Laravel без магії: webhook, Yii2 та тестування
## Вступ Інтеграція Telegram Bot API у PHP-застосунки вимагає правильної роботи з webhook-ами та ідемпотентністю. Нижче — покрокове керівництво для Laravel та Yii2 з робочими прикладами. ## Webhook-контролер та ідемпотентна обробка Для 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= ```

Нові статті — у Telegram

Розбираємо, що автоматизувати в бізнесі та як це працює на практиці. Без спаму.