## Вступ
Інтеграція
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=
```