Метод sendInvoice

Метод для отправки платёжного счёта пользователю с возможностью настройки товара, цены, способов оплаты и дополнительных параметров.

Описание

Используйте этот метод для отправки счетов. При успешном выполнении возвращается отправленное Message.

Параметр Тип Обязательный Описание
chat_id Целое число или строка Да Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
message_thread_id Целое число Необязательный Уникальный идентификатор целевой ветки сообщений (темы) форума; только для супергрупп-форумов
direct_messages_topic_id Целое число Необязательный Идентификатор темы личных сообщений, в которую будет отправлено сообщение; требуется, если сообщение отправляется в чат личных сообщений
title Строка Да Название товара, 1-32 символа
description Строка Да Описание товара, 1-255 символов
payload Строка Да Определённая ботом полезная нагрузка счёта, 1-128 байт. Не отображается пользователю, используйте её для ваших внутренних процессов.
provider_token Строка Необязательный Токен платёжного провайдера, полученный через @BotFather. Передайте пустую строку для платежей в Telegram Stars.
currency Строка Да Трёхбуквенный код валюты ISO 4217, см. подробнее о валютах. Передайте «XTR» для платежей в Telegram Stars.
prices Массив LabeledPrice Да Разбивка цены, JSON-сериализованный список компонентов (например, цена товара, налог, скидка, стоимость доставки, налог на доставку, бонус и т.д.). Должен содержать ровно один элемент для платежей в Telegram Stars.
max_tip_amount Целое число Необязательный Максимально принимаемая сумма чаевых в наименьших единицах валюты (целое число, не число с плавающей запятой/double). Например, для максимальных чаевых в 1,45 долл. США передайте max_tip_amount = 145. См. параметр exp в currencies.json, он показывает количество цифр после десятичной точки для каждой валюты (2 для большинства валют). По умолчанию 0. Не поддерживается для платежей в Telegram Stars.
suggested_tip_amounts Массив целых чисел Необязательный JSON-сериализованный массив предлагаемых сумм чаевых в наименьших единицах валюты (целое число, не число с плавающей запятой/double). Можно указать не более 4 предлагаемых сумм чаевых. Предлагаемые суммы чаевых должны быть положительными, переданы в строго возрастающем порядке и не должны превышать max_tip_amount.
start_parameter Строка Необязательный Уникальный параметр глубокой ссылки. Если оставить пустым, пересланные копии отправленного сообщения будут иметь кнопку Оплатить, позволяя нескольким пользователям оплачивать прямо из пересланного сообщения, используя тот же счёт. Если не пустой, пересланные копии отправленного сообщения будут иметь кнопку URL с глубокой ссылкой на бота (вместо кнопки Оплатить), где значение используется как стартовый параметр.
provider_data Строка Необязательный JSON-сериализованные данные о счёте, которые будут переданы платёжному провайдеру. Подробное описание обязательных полей должно быть предоставлено платёжным провайдером.
photo_url Строка Необязательный URL фотографии товара для счёта. Может быть фотографией товара или маркетинговым изображением для услуги. Людям больше нравится, когда они видят, за что платят.
photo_size Целое число Необязательный Размер фотографии в байтах
photo_width Целое число Необязательный Ширина фотографии
photo_height Целое число Необязательный Высота фотографии
need_name Логический Необязательный Передайте True, если вам требуется полное имя пользователя для завершения заказа. Игнорируется для платежей в Telegram Stars.
need_phone_number Логический Необязательный Передайте True, если вам требуется номер телефона пользователя для завершения заказа. Игнорируется для платежей в Telegram Stars.
need_email Логический Необязательный Передайте True, если вам требуется адрес электронной почты пользователя для завершения заказа. Игнорируется для платежей в Telegram Stars.
need_shipping_address Логический Необязательный Передайте True, если вам требуется адрес доставки пользователя для завершения заказа. Игнорируется для платежей в Telegram Stars.
send_phone_number_to_provider Логический Необязательный Передайте True, если номер телефона пользователя должен быть отправлен провайдеру. Игнорируется для платежей в Telegram Stars.
send_email_to_provider Логический Необязательный Передайте True, если адрес электронной почты пользователя должен быть отправлен провайдеру. Игнорируется для платежей в Telegram Stars.
is_flexible Логический Необязательный Передайте True, если итоговая цена зависит от способа доставки. Игнорируется для платежей в Telegram Stars.
disable_notification Логический Необязательный Отправляет сообщение бесшумно. Пользователи получат уведомление без звука.
protect_content Логический Необязательный Защищает содержимое отправленного сообщения от пересылки и сохранения
allow_paid_broadcast Логический Необязательный Передайте True, чтобы разрешить до 1000 сообщений в секунду, игнорируя ограничения рассылки за плату в размере 0,1 Telegram Stars за сообщение. Соответствующие Stars будут списаны с баланса бота.
message_effect_id Строка Необязательный Уникальный идентификатор эффекта сообщения, который будет добавлен к сообщению; только для личных чатов
suggested_post_parameters SuggestedPostParameters Необязательный JSON-сериализованный объект, содержащий параметры предлагаемой публикации для отправки; только для чатов личных сообщений. Если сообщение отправляется в ответ на другую предлагаемую публикацию, то эта предлагаемая публикация автоматически отклоняется.
reply_parameters ReplyParameters Необязательный Описание сообщения, на которое нужно ответить
reply_markup InlineKeyboardMarkup Необязательный JSON-сериализованный объект для встроенной клавиатуры. Если пустой, будет показана одна кнопка 'Оплатить общая цена'. Если не пустой, первая кнопка должна быть кнопкой Оплатить.

Примеры

php

<?php

$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/sendInvoice";

$chatId = 123456789; // или '@channelusername'
$payload = uniqid('invoice_', true); // уникальный payload для идентификации платежа
$providerToken = 'YOUR_PROVIDER_TOKEN'; // токен от @BotFather, для Stars оставить пустую строку

$data = [
    'chat_id' => $chatId,
    'title' => 'Premium Subscription',
    'description' => 'Access to all premium features for 1 month',
    'payload' => $payload,
    'provider_token' => $providerToken,
    'currency' => 'USD',
    'prices' => json_encode([
        ['label' => 'Subscription', 'amount' => 999] // $9.99 в центах
    ]),
    'max_tip_amount' => 500, // $5.00 максимальные чаевые
    'suggested_tip_amounts' => json_encode([100, 200, 300, 500]), // $1, $2, $3, $5
    'start_parameter' => 'premium_sub',
    'photo_url' => 'https://example.com/product.jpg',
    'photo_size' => 20000,
    'photo_width' => 400,
    'photo_height' => 300,
    'need_name' => true,
    'need_email' => true,
    'need_shipping_address' => false,
    'is_flexible' => false,
    'disable_notification' => false,
    'protect_content' => false,
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Pay Now', 'pay' => true],
                ['text' => 'Cancel', 'callback_data' => 'cancel_invoice']
            ]
        ]
    ])
];

// Отправка запроса через cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // только для тестов, в продакшене убрать

$response = curl_exec($ch);
curl_close($ch);

// Обработка ответа
$result = json_decode($response, true);
if ($result['ok']) {
    echo "Invoice sent successfully. Message ID: " . $result['result']['message_id'];
} else {
    echo "Error: " . $result['description'];
}

// Альтернативный вариант с использованием библиотеки (например, TelegramBotPHP)
class TelegramBot {
    private $token;
    
    public function __construct($token) {
        $this->token = $token;
    }
    
    public function sendInvoice($params) {
        $url = "https://api.telegram.org/bot{$this->token}/sendInvoice";
        
        // Подготовка prices
        if (isset($params['prices']) && is_array($params['prices'])) {
            $params['prices'] = json_encode($params['prices']);
        }
        
        // Подготовка reply_markup
        if (isset($params['reply_markup']) && is_array($params['reply_markup'])) {
            $params['reply_markup'] = json_encode($params['reply_markup']);
        }
        
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $params,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => ['Content-Type: multipart/form-data']
        ]);
        
        $response = curl_exec($ch);
        curl_close($ch);
        
        return json_decode($response, true);
    }
}

// Пример использования класса
$bot = new TelegramBot($botToken);

$invoiceParams = [
    'chat_id' => $chatId,
    'title' => 'Digital Product',
    'description' => 'Instant download of digital content',
    'payload' => 'order_12345',
    'provider_token' => $providerToken,
    'currency' => 'EUR',
    'prices' => [
        ['label' => 'Product', 'amount' => 2990],
        ['label' => 'VAT 20%', 'amount' => 598]
    ],
    'need_email' => true,
    'photo_url' => 'https://example.com/digital.jpg'
];

$result = $bot->sendInvoice($invoiceParams);

if ($result['ok']) {
    // Инвойс успешно отправлен
    $message = $result['result'];
    file_put_contents('invoice_log.txt', 
        date('Y-m-d H:i:s') . " - Invoice sent to {$chatId}\n", 
        FILE_APPEND
    );
}

// Пример для Telegram Stars (без provider_token)
$starsInvoice = [
    'chat_id' => $chatId,
    'title' => '100 Telegram Stars',
    'description' => 'Purchase Stars for premium content',
    'payload' => 'stars_purchase_001',
    'provider_token' => '', // Пустая строка для Stars
    'currency' => 'XTR', // Валюта для Stars
    'prices' => [
        ['label' => 'Stars', 'amount' => 100] // ровно один элемент для Stars
    ],
    'photo_url' => 'https://example.com/stars.jpg'
];

?>

python

import asyncio
from telegram import Bot, LabeledPrice
from telegram.constants import ParseMode

async def send_invoice_example():
    # Инициализация бота с токеном
    bot = Bot(token="YOUR_BOT_TOKEN")
    
    # Параметры для отправки инвойса
    chat_id = 123456789  # ID чата пользователя
    title = "Premium Subscription"
    description = "Access to premium features for 1 month"
    payload = "subscription_001"  # Внутренний идентификатор
    provider_token = "YOUR_PROVIDER_TOKEN"  # Токен платежного провайдера
    currency = "USD"
    
    # Цены (в минимальных единицах валюты, например центы для USD)
    prices = [
        LabeledPrice(label="Monthly Subscription", amount=999),  # $9.99
    ]
    
    # Дополнительные параметры (опционально)
    suggested_tip_amounts = [100, 200, 300, 500]  # $1, $2, $3, $5
    max_tip_amount = 1000  # $10
    photo_url = "https://example.com/product.jpg"
    
    try:
        # Отправка инвойса
        message = await bot.send_invoice(
            chat_id=chat_id,
            title=title,
            description=description,
            payload=payload,
            provider_token=provider_token,
            currency=currency,
            prices=prices,
            max_tip_amount=max_tip_amount,
            suggested_tip_amounts=suggested_tip_amounts,
            photo_url=photo_url,
            need_email=True,  # Запрашиваем email
            need_shipping_address=False,
            is_flexible=False,
            disable_notification=False,
            protect_content=False
        )
        
        print(f"Invoice sent successfully! Message ID: {message.message_id}")
        
    except Exception as e:
        print(f"Error sending invoice: {e}")

# Запуск асинхронной функции
if __name__ == "__main__":
    asyncio.run(send_invoice_example())

История изменений

  • API 3.0. Добавлен метод sendInvoice
  • API 3.5. Обновлен метод sendInvoice: Добавлены поля provider_data, send_phone_number_to_provider, send_email_to_provider
  • API 5.0. Обновлен метод sendInvoice: Добавлено поле allow_sending_without_reply
  • API 5.2. Обновлен метод sendInvoice: Добавлены поля max_tip_amount и suggested_tip_amounts для добавления чаевых, параметр start_parameter стал опциональным
  • API 5.6. Обновлен метод sendInvoice: Добавлено поле protect_content
  • API 6.3. Обновлен метод sendInvoice: Добавлен параметр message_thread_id
  • API 7.0. Обновлен метод sendInvoice: Заменены параметры reply_to_message_id и allow_sending_without_reply на reply_parameters
  • API 7.4. Обновлен метод sendInvoice: Добавлен параметр message_effect_id
  • API 7.11. Обновлен метод sendInvoice: Добавлен параметр allow_paid_broadcast
  • API 9.2. Обновлен метод sendInvoice: Добавлен параметр direct_messages_topic_id
  • API 9.3. Обновлен метод sendInvoice: Поддержан параметр message_thread_id в личных чатах с темами для отправки сообщения в конкретную тему.

Дополнительно

  • Message - Это основной объект, представляющий сообщение в Telegram, который содержит информацию об отправителе, чате, контенте (текст, медиа, служебные данные) и различные метаданные.
  • LabeledPrice - Объект, представляющий отдельную позицию в структуре цены товаров или услуг с указанием названия и стоимости в минимальных единицах валюты.
  • SuggestedPostParameters - Объект содержит параметры публикации, предлагаемой ботом, включая цену и дату отправки.
  • ReplyParameters - Объект, описывающий параметры для ответа на сообщение, включая идентификатор сообщения, чат, цитирование и дополнительные настройки.
  • InlineKeyboardMarkup - Объект для создания встроенной клавиатуры, которая отображается непосредственно в сообщении.
Комментарии