Как мы начали получать платежи со всего мира в Telegram Bot

Привет vc.ru, я — Размик, co-founder DeepFaker App. Примерно 4 месяца назад наша команда запустила высокопроизводительного телеграм бота для генерации дипфейк видео в телеграме и монетизировала его. В этой статье я бы хотел рассказать про путь, по которому мы прошли, чтобы начать принимать платежи со всего мира! 🌎

Постановка задачи

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

Поэтому перед командой поставили следующую задачу:

  • Прием платежей с любых карт Visa/Mastercard. Не важно, где они были выпущены, в США, Германии или Мьянме
  • Поддержка Apple Pay и Google Pay
  • Платежная форма должна быть, как минимум, на английском языке
  • Система приема платежей и активации подписки должна быть полностью автоматизирована
  • Адекватная комиссия

Исследование

Разумеется, мы начали исследовать доступные решения. И вот, что нашли:

Telegram Payments 2.0

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

Special Note: Due to Apple's limitations, bot developers are currently not allowed to accept payments for digital goods and virtual services from iOS users.

Telegram Bot API

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

Хорошо, подумали мы, нативных решений сделать не получится, значит надо сделать интеграцию с платежным сервисом.

Stripe

У всех на слуху, но с Российским бизнесом увы не работает, к тому же берет большие комиссии.

2Checkout

Тоже популярный для приема платежей сервис, однако комиссия 3.5% + 35 центов нас так же не устроили, ведь дело касается недорогих услуг.

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

Tinkoff

Пока мы разбирались с 2Checkout, в этой хорошей статье, в комментариях мы обнаружили, что оказывается можно интегрироваться напрямую с эквайрингом Тинькофф Банка и принимать платежи со всего мира! 🎉

Итак, мы дали старт этому процессу. Сразу скажу, это было не самое простое занятие и суммарно у нас заняло около 3 недель с момента отправки заявки в Тинькофф до деплоя этой функциональности в продакшен.
Думаю, если бы мы повторили этот путь еще раз с учетом всех знаний, то можно было бы сделать все за неделю.

Итак, поехали.
Что нам нужно, чтобы оформить заявку на подключение интернет эквайринга?
Детальную инструкцию можно найти здесь.

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

1. Невозможность писать сообщения об ошибках или сделать локализацию на неправильно заполненных формах. Выглядит нелепо не правда ли?

Как мы начали получать платежи со всего мира в Telegram Bot

2. Мало выбора в библиотеке шаблонов, которые вдобавок невозможно серьезно кастомизировать. Это пожалуй серьезная проблема, но надеюсь со временем библиотека будет увеличиваться, а гибкость расти 😉

Далее, отправляем заявку на подключение эквайринга.
Важно! Если, вы хотите иметь API, чтобы автоматизировать подключение подписки, после того, как пользователь произвел оплату, вам необходимо создавать магазин "Интернет-магазин":

Как мы начали получать платежи со всего мира в Telegram Bot

Кроме того, только магазин "Интернет-магазин" имеет тестовый терминал. Так что если хотите все делать по фэншую, настроить тестовый стенд, то тестовый терминал просто необходим.

Итак, после того как мы отправили заявку еще в течение 2 недель мы переписывались с поддержкой, причем сразу с тремя разными поддержками.

Первая поддержка - это онлайн чат в личном кабинете, в котором, примерно, через 2 дня после нашей заявки, к нам поступил такой запрос на доработку:

Как мы начали получать платежи со всего мира в Telegram Bot

Отмечу, что на каждую проверку нашей заявки (после исправлений) у Тинькофф Банка уходило 2-3 рабочих дня. Поэтому лучше изначально все оформлять так, чтобы проблем и вопросов не возникло и вы не теряли время в ожидании.

Вторая поддержка - это команда разработки API для бизнеса, с которой мы общались по почте и, которая, как оказалось, нам не нужна, но об этом позже.

Третья поддержка - это команда разработки API интернет эквайринга, с которой мы тоже общались по почте.

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

Итак, пока Тинькофф проверял наш магазин, они активировали тестовый терминал, чтобы можно было начать интеграцию.

Технический блок

Если вы не технарь, то, вероятно, этот блок будет вам не очень интересен, за исключением видеодемонстрации.

Первое, что важно понять, это то, что для интеграции нужен API интернет эквайринга. Это мы поняли не сразу и в поддержке нас немного запутали, из-за чего мы потратили пару дней не на ту интеграцию 🤦

Надеемся, когда-нибудь они соберут все в одном месте 😉

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

Далее нам требовалось автоматизировать процесс выставление счета и активации подписки, но прежде чем рассказывать про архитектуру, предлагаю посмотреть как это работает в продакшене:

Итак, под капотом, после того, как пользователь нажимает на нужный тариф, бэкэнд генерирует ссылку на оплату, используя клиента, который мы написали. Для этого клиент вызывает метод Init.

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

Далее асинхронный воркер регулярно проверяет статусы созданных платежей, используя метод GetState. Если у платежа статус CONFIRMED, тогда мы меняем статус соответствующего платежа в базе данных и обновляем тарифный план пользователя.

Каждая ссылка на оплату при этом живет несколько минут, далее воркер перестает проверять ее статус и делать запросы в Тинькофф. В будущем мы планируем переписать воркер, чтобы он работал по Push архитектуре и апдейты приходили к нам напрямую из банка. Вот собственно и вся математика 🙌

Сразу отмечу, что одна из проблем в использовании ненативного подхода - это то, что ссылка в кнопке может просрочиться, нажав на нее пользователь перейдет на уже неактуальную платежную форму. Автоматизировать обновление ссылки, не создавая большого количества архитектурных проблем, нам не удалось, поэтому мы решили просто добавить в сообщение, что если ссылка стала неактивной, то необходимо вернуться назад и выбрать тариф заново, тогда бот сгенерирует новую ссылку на оплату.

Еще одна проблема заключалась в невозможности выставлять счет в долларах. Увы Тинькофф позволяет работать только в рублях. Кстати, если вы знаете почему, напишите, пожалуйста, в комментариях. Как решение, мы написали рядом с ценой в рублях примерную стоимость в долларах.

Данные из продакшена

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

На данный момент мы получали платежи из более чем 10 разных стран Европы, Азии, Южной Америки и Северной Америки. Все же были единичные кейсы, когда банки эмитенты не пропускали платежи. В чем, однако, была причина установить не удалось. Если у вас есть предположение, в чем могла быть проблема, будем рады вашим комментариям :)

88
22 комментария

Здравствуйте!

Спасибо, что поделились своим клиентским опытом. Отдельная благодарность за фидбэк - только так мы становимся лучше. Все проанализируем.

1

Рады помочь 😊

Интересная статья, спасибо

В тинькофф же есть специальная настраиваемая ссылка, куда от банка могут приходить POST запросы на каждое изменение статуса платежа. Единственное нужен доменный адрес

И там можно ловить изменение всех статусов, всех платежей

Асинхронный воркер это в целом решение, но выглядит немного костыльно :)))

Тоже недавно в чат-бота прикручивал тинькофф оплату

1

Я именно так и сделал. Получаю данные о платежах непосредственно от банка без воркеров.

Почему бы не запоминать ID Сообщения в бд вместе с платежной инфой и после того как ваш воркер прекращает дергать GetState (то есть вы точно знаете этот момент ), вы можете редактировать сообщения и ссылку от туда убирать

Думали над таким решением, но оно создает ряд проблем:
1. Таким образом мы тратим rate limit телеграма, который хотелось бы использовать максимально эффективно, особенно проблемно будет, когда количество пользователей увеличится
2. Возникают разные краевые случаи, если сообщение было удалено пользователем, то мы не сможем его обновить, это просто один из кейсов, который придется учитывать в коде, думаю потенциальных корнер кейсов будет больше
3. В целом энтропия проекта растет, придется написать еще один воркер, который будет заниматься апдейтом сообщений в телеграме

Исходя из всего этого, мы решили просто добавить сообщение в кнопку :) 

1

А как вы дебажите бота? Поднимали свой тестовый сервак телеги?