Задать вопрос
@Alexndr_KLL

Функция для экранирования текста в MarkdownV2?

Не удается правильно отформатировать текст.
Кто знает решение проблемы, может помочь

[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Початок виконання process_order.php
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Отримано товар із кошика: product_id = 4, image = 670436a2223c04.79809976.jpg
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Замовлення успішно створено. order_id = 20
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Товар успішно записано у замовлення: product_id = 4
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Запит до Telegram API -> {"inline_keyboard":[[{"text":" Написати клієнту","url":"https://t.me/oosadcuk_sasha"}],[{"text":" Набрати клієнта","url":"tel:+380983422429"}]]}
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Відповідь Telegram API: {"ok":false,"error_code":400,"description":"Bad Request: can't parse entities: Character '+' is reserved and must be escaped with the preceding '\\'"}
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Відповідь Telegram API: {"ok":false,"error_code":400,"description":"Bad Request: can't parse entities: Character '!' is reserved and must be escaped with the preceding '\\'"}
[31-Jan-2025 03:42:52 Europe/Kiev] DEBUG: Завершення process_order.php


<?php
include 'telegram_config.php';

// Функція для екранування тексту у MarkdownV2
function escapeMarkdownV2($text) {
    $reserved = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
    foreach ($reserved as $char) {
        $text = str_replace($char, '\\' . $char, $text);
    }
    return $text;
}

// Функція для перевірки валідності URL
function isValidUrl($url) {
    $headers = @get_headers($url);
    return $headers && strpos($headers[0], '200') !== false;
}

// Функція для відправки API-запиту через cURL
function sendTelegramRequest($url, $data) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    if ($response === false) {
        error_log("ERROR: Не вдалося виконати запит до Telegram API. Помилка: " . curl_error($ch));
    } else {
        error_log("DEBUG: Відповідь Telegram API: " . $response);
    }

    curl_close($ch);
    return json_decode($response, true);
}

// Функція для надсилання повідомлення магазину
function sendTelegramMessage($chat_id, $order_id, $name, $surname, $patronymic, $phone, $payment_method, $total_price, $delivery_office, $order_items, $comment, $telegram_username) {
    $message = " *Нове замовлення на сайті!* \n\n";
    $message .= " *ID замовлення:* _" . escapeMarkdownV2("\\#" . $order_id) . "_\n"; // Екранування #
    $message .= " *ПІБ клієнта:* _" . escapeMarkdownV2("$surname $name $patronymic") . "_\n";
    $message .= " *Контактний номер:* _" . escapeMarkdownV2($phone) . "_\n";
    $message .= " *Спосіб оплати:* _" . escapeMarkdownV2($payment_method) . "_\n";
    $message .= " *Загальна сума замовлення:* _" . escapeMarkdownV2(number_format($total_price, 2)) . " грн_\n";
    $message .= " *Адреса доставки:* _" . escapeMarkdownV2($delivery_office) . "_\n\n";

    if (!empty($comment)) {
        $message .= " *Коментар до замовлення:*\n_" . escapeMarkdownV2($comment) . "_\n\n";
    }

    $message .= " *Перелік товарів:*\n";
    foreach ($order_items as $item) {
        $message .= "  -  *" . escapeMarkdownV2($item['product_name']) . "* (x" . $item['quantity'] . ")\n";
    }

    $message .= "\n⏰ *Час замовлення:* _" . escapeMarkdownV2(date("d.m.Y H:i")) . "_\n";
    $message .= " *Перевірте систему для деталей замовлення!*\n";

    // Формуємо кнопки
    $buttons = [];

    if (!empty($telegram_username) && strpos($telegram_username, '@') !== false) {
        $telegram_username = trim(ltrim($telegram_username, '@')); // Прибираємо `@`
        $buttons[] = [['text' => ' Написати клієнту', 'url' => "https://t.me/" . $telegram_username]];
    }

    if (!empty($phone)) {
        $cleaned_phone = preg_replace('/\D/', '', $phone);
        if (!empty($cleaned_phone)) {
            $buttons[] = [['text' => ' Набрати клієнта', 'url' => "tel:+$cleaned_phone"]];
        }
    }

    $reply_markup = !empty($buttons) ? json_encode(['inline_keyboard' => $buttons], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : null;

    // Логування перед відправкою
    error_log("DEBUG: Запит до Telegram API -> " . print_r($reply_markup, true));

    // Отримуємо фото першого товару
    $photo_url = !empty($order_items) && isset($order_items[0]['image']) ? 'https://chmotop57777.clio.chost.com.ua/uploads/' . $order_items[0]['image'] : null;

    if ($photo_url && isValidUrl($photo_url)) {
        sendTelegramPhotoWithCaption($chat_id, $photo_url, $message, $reply_markup);
    } else {
        sendTelegramTextMessage($chat_id, $message, $reply_markup);
    }

    // Надсилаємо гумористичне повідомлення
    sendTelegramFunnyMessage($chat_id);
}

// Функція для надсилання текстового повідомлення
function sendTelegramTextMessage($chat_id, $message, $reply_markup = null) {
    $url = "https://api.telegram.org/bot" . TELEGRAM_BOT_TOKEN . "/sendMessage";

    $data = [
        'chat_id'    => $chat_id,
        'text'       => escapeMarkdownV2($message),
        'parse_mode' => 'MarkdownV2'
    ];

    if ($reply_markup) {
        $data['reply_markup'] = $reply_markup;
    }

    sendTelegramRequest($url, $data);
}

// Функція для надсилання фото із підписом та кнопками
function sendTelegramPhotoWithCaption($chat_id, $photo_url, $caption, $reply_markup = null) {
    $url = "https://api.telegram.org/bot" . TELEGRAM_BOT_TOKEN . "/sendPhoto";

    $data = [
        'chat_id'    => $chat_id,
        'photo'      => $photo_url,
        'caption'    => escapeMarkdownV2($caption),
        'parse_mode' => 'MarkdownV2'
    ];

    if ($reply_markup) {
        $data['reply_markup'] = $reply_markup;
    }

    sendTelegramRequest($url, $data);
}

// Функція для надсилання гумористичного повідомлення
function sendTelegramFunnyMessage($chat_id) {
    sendTelegramTextMessage($chat_id, escapeMarkdownV2(" *Хустіш до клієнта!* \nГотуйте пакунок із любов'ю! "));
}
?>
  • Вопрос задан
  • 16 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
31 янв. 2025, в 06:03
9999999 руб./за проект
31 янв. 2025, в 06:02
9999999 руб./за проект
31 янв. 2025, в 06:02
9999999 руб./за проект