Как настроить прием платежей 2.0 в Telegram за 5 часов

С выходом обновления Платежи 2.0, были интересно написать и потрогать своего бота. Расскажем о нашем опыте и нюансах, с которыми столкнулись при разработке. В конце статьи есть ссылка на канал, в котором живет бот.

Создание бота

Первым делом мы зашли и создали бота в BotFather. Тут всё просто, опираемся на документацию: https://core.telegram.org/bots#creating-a-new-bot

Если в инструкции по ссылке ничего не понятно, то вот инструкция от нас:
1. Находим в Телеграм бота BotFather и добавляем себе в контакт-лист
2. Смотрим доступные команды бота с помощью команды /help
3. Выбираем /newbot и далее по подсказкам выполняем действия
4. После создания бота вы получите токен, которые нужно будет использовать в коде вашего бота. Сообщение с токеном необходимо сохранить.

Подключаем оплату

  • В боте BotFather вводим команду /mybots
  • В созданном боте выбираем поле Payments и выбираем, например, Stripe
  • Выбираем Connect Stripe Test и следуем инструкции
  • После выполнения, вы получите токен оплаты, его нужно сохранить

Связываем бота с приложением

Мы выбрали библиотеку https://github.com/php-telegram-bot/core
В конфиге params.php указали все токены из предыдущего шага. Выглядит так:

<?php return [ 'bot_api_key' => '', 'bot_username' => '', 'bot_payment_token' => '', ];

И с помощью библиотеки организовали взаимодействие бота с приложением:

$botApiKey = \Yii::$app->params['bot_api_key']; $botUsername = \Yii::$app->params['bot_username']; $telegram = new Telegram($botApiKey, $botUsername); $result = $telegram->setWebhook($url); if ($result->isOk()) { echo $result->getDescription(); }

Одна из первых тонкостей: для реализации нужен домен и SSL сертификат. Для наших задач мы взяли VDS c панелью Vesta и бесплатный SSL Let’s Encrypt. Бот работает на PHP, поэтому подойдет и обычный хостинг.

Написание кода бота

Теперь самое интересное — программирование. После того, как связали наше приложение и бота, можно начинать писать логику.

Для того что бы работать с ботами, надо реализовать поддержку различных команд. В нашем случае мы добавили только одну — “Спасибо”. Механика до безумия простая: при её написании формируется сообщение и сразу же выписывается счёт.

public function execute(): ServerResponse { $message = $this->getChannelPost() ? $this->getChannelPost() : $this->getMessage(); $text = $message->getText(true); if ($text && mb_strpos(mb_strtolower($text), 'спасибо') !== false) { //code... } return Request::emptyResponse(); }

Осталось в него только добавить нужный для нас товар и отправить пользователю этот счет. Все это уже есть в документации и кратко поля, которые использовались.

$chatId = $message->getChat()->getId(); Request::sendInvoice([ 'chat_id' => $chatId, 'title' => 'Чаевые', 'description' => 'Благодарность сотрудникам', 'payload' => uniqid(), 'provider_token' => \Yii::$app->params['bot_payment_token'], 'currency' => 'RUB', 'prices' => [ [ 'label' => 'Чаевые', 'amount' => 10000, ], ], 'reply_to_message_id' => $message->getMessageId(), 'max_tip_amount' => 100000, 'suggested_tip_amounts' => [10000, 20000, 30000] ]);

В title пишем название товара. В description — его описание. В currency валюту, которую мы использовали. В качестве price указывается цена. Кстати, она делится на 100. Чтобы указать цену товара в 100 рублей, нужно поставить amount 10000. Не сложно, правда?

Окончательный наш код с логикой выглядел таким образом:

declare(strict_types=1); namespace app\components\commands; use Longman\TelegramBot\Commands\SystemCommand; use Longman\TelegramBot\Entities\InlineKeyboard; use Longman\TelegramBot\Entities\Keyboard; use Longman\TelegramBot\Entities\ServerResponse; use Longman\TelegramBot\Request; class GenericMessageCommand extends SystemCommand { /** * @var string */ protected $name = 'genericmessage'; /** * @var string */ protected $description = ''; public function execute(): ServerResponse { $message = $this->getChannelPost() ? $this->getChannelPost() : $this->getMessage(); $text = $message->getText(true); if ($text && mb_strpos(mb_strtolower($text), 'спасибо') !== false) { $chatId = $message->getChat()->getId(); Request::sendInvoice([ 'chat_id' => $chatId, 'title' => 'Чаевые', 'description' => 'Благодарность сотрудникам', 'payload' => uniqid(), 'provider_token' => \Yii::$app->params['bot_payment_token'], 'currency' => 'RUB', 'prices' => [ [ 'label' => 'Чаевые', 'amount' => 10000, ], ], 'reply_to_message_id' => $message->getMessageId(), 'max_tip_amount' => 100000, 'suggested_tip_amounts' => [10000, 20000, 30000] ]); } return Request::emptyResponse(); } }

Проблемы с Payments 2.0

Payments 2.0 вышел совсем недавно. Главной проблемой стала неспособность платежных систем взаимодействовать с Telegram. Изначально мы выбрали ЮMoney, но он пока умеет работать только с первой версией. Остановились на Stripe, чтобы весь функционал был доступен.

Плюс стоит учитывать, что минимальная сумма пополнения — 100 рублей. И нет возможности настраивать поля в товаре. Например, оставить комментарии.

Настроив бота, добавьте его в ваш чат, выдав функции администратора. Он будет реагировать на ключевую фразу.
Важно: постарайтесь учесть написание такой фразы в разном регистре и даже на латинице. Предусмотрите все варианты, даже самые заковыристые с использованием латинских и кириллических букв. Так вы сделаете бота максимально удобным для пользователей.

Меню бота в десктопной версии Telegram после перехода к оплате Timeweb
Меню бота в десктопной версии Telegram после перехода к оплате Timeweb

Поиграть с ботом можно в нашем чате (реагирует на “Спасибо”). Если вы тоже настраивали бота с использованием Платежей 2.0 — делитесь опытом в комментариях. Об ошибках тоже сообщайте. Будем дополнять пост по мере появления ценных советов и рекомендаций.
Как вам кажется, для покупки каких услуг Платежи 2.0 подходят лучше всего?

3434
21 комментарий

Спасибо! Как раз озадачивался)

6
Ответить

Привет. Как решите заниматься - делитесь подробностями)

1
Ответить

@Timeweb благодарны, будем тестировать! 🎴🦄

2
Ответить

Насколько реально зарегистрировать stripe простому смертному в России? И поддерживает ли 2.0 кто-нибудь кроме страйпа?

1
Ответить

Привет. Можно ориентироваться на статью: https://vc.ru/finance/82502-kak-podklyuchit-stripe-esli-vy-nahodites-ne-v-ssha

Иными словами, нужен посредник. Имеет смысл дождаться появления поддержки от российских платёжных сервисов. Пока что Сбер, ЮMoney, Tranzzo, LiqPay не поддерживают, но очень ждём :) 

3
Ответить

Поскорее бы работал с другими платёжными системами. Хочу похоже реализовать, и тем более что б ЮMoney был :)

1
Ответить

Да, с ЮMoney было бы отлично)

2
Ответить