Как настроить прием платежей 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

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

0
21 комментарий
Написать комментарий...
sovushik

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

Ответить
Развернуть ветку
Timeweb Cloud
Автор

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

Ответить
Развернуть ветку
Алексей Долгих - CVO Scout VC

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

Ответить
Развернуть ветку
Алексей Полуянов

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

Ответить
Развернуть ветку
Timeweb Cloud
Автор

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

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

Ответить
Развернуть ветку
Self iBlitz

А у Вас реально работает этот сервис?? или разводилово???
ё

Ответить
Развернуть ветку
Timeweb Cloud
Автор

Привет. Можно зайти в канал и посмотреть. Было бы разводилово - не стали бы публиковать. На VC думающая аудитория.

Ответить
Развернуть ветку
Reimu Fumo

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

Ответить
Развернуть ветку
Timeweb Cloud
Автор

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

Ответить
Развернуть ветку
Андрей Макарушин

Так Юкасса там есть

Ответить
Развернуть ветку
Святослав Гусев

Прошел год, нигде не видел реализации данных методов оплат.

Ответить
Развернуть ветку
Цимерманн

Кстати, да.

Ответить
Развернуть ветку
xsend24 Ru

Почему гугл пэй не работает? Будет ли доработка? 

Ответить
Развернуть ветку
Sergey

А что вы там 5 часов то делали? Прокрастиниповали?

Ответить
Развернуть ветку
Igor

Платежи 2.0 будут поддерживаться © ЮMoney и QIWI

Ответить
Развернуть ветку
Igor Tarasov

А зачем нужны платежи в Телеге? Чем не устраивает просто на сайте принимать платежи?

Ответить
Развернуть ветку
Egor Voinov

Тоже не понял чем удобнее вводить карту в телеге вместо браузера (где она уже запомнена). А больше никакой разницы нет.

Ответить
Развернуть ветку
Timeweb Cloud
Автор

Друзья, если вы хотите протестировать бота с поддержкой Платежей 2.0, напишите в ЛС https://t.me/tw_tips_Bot и там будет кнопка для теста.

P.S. Заменили активацию "Спасибо" на такой вариант, чтобы в нашем чате было меньше спама однотипными сообщениями.

Ответить
Развернуть ветку
Анжелика Новикова Шерстюк

Спасибо за статью! Можно задать 1$ как сумму? 

Ответить
Развернуть ветку

Комментарий удален модератором

Развернуть ветку
Taras Bogatyrev

Спасибо, интересно! Покупатель оплатил и указал адрес доставки. И тут появляются логичные вопросы:

Куда прилетает информация об оплате и адресе доставки? Если инфо об оплате — в платёжный сервис, а доставка в сервис доставки, как заметчить данные?

Ответить
Развернуть ветку
SwaGy

Ребят, помогите пожалуйста, такая ситуация:
Есть свой магазин на python, но в нём платёжка только Qiwi, как добавить оплату картой и другие, может кто-то знает?

Мой телеграм: @Unv_Love
Заранее спасибо 😇🤗

Ответить
Развернуть ветку
18 комментариев
Раскрывать всегда