{"id":14290,"url":"\/distributions\/14290\/click?bit=1&hash=bece6ae8cf715298895ba844b6416416882fe02c5d18dab2837319deacd2c478","title":"\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u0445\u043e\u0442\u044f\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0442\u044c \u0441 \u043c\u0430\u043b\u044b\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u043e\u043c","buttonText":"","imageUuid":""}

Как мы начали получать платежи со всего мира в 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. Невозможность писать сообщения об ошибках или сделать локализацию на неправильно заполненных формах. Выглядит нелепо не правда ли?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0
22 комментария
Написать комментарий...
Тинькофф

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

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

Ответить
Развернуть ветку
Razmik Konstandian
Автор

Рады помочь 😊

Ответить
Развернуть ветку
Антон ITшник по жизни

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

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

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

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

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

Ответить
Развернуть ветку
Константин Нагибович

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

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

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

Ответить
Развернуть ветку
Razmik Konstandian
Автор

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

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

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

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

Ответить
Развернуть ветку
Razmik Konstandian
Автор

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

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

А, вручную дергаете апи на тесте, понял, спасибо.

Ответить
Развернуть ветку
Razmik Konstandian
Автор

Да, все верно.
У нас так же есть нагрузочное тестирование, там бот тестируется юзер ботом :) 

Ответить
Развернуть ветку
Василий Крылов

Можете поподробнее про нагрузочное рассказать?

Ответить
Развернуть ветку
Razmik Konstandian
Автор

Если верхоуровнево, то завели аккаунты на несколько номеров. Далее использовали библиотеку https://github.com/pyrogram/pyrogram, и в несколько параллельных потоках запускали отработку основных транзакций. На другой стороне был настроен мониторинг, который показывает разные бизнес (размер очереди задач, среднее время генерации, среднее время ответа) и системные метрики (CPU, memory, RAM, IOPS)

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

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

Развернуть ветку
Cysi

Круто, как раз хотел потестировать такой подход, у вас код случайно не остался от проекта?)

Ответить
Развернуть ветку
Razmik Konstandian
Автор

Привет! Спасибо за отзыв, и рады помочь :)
По поводу кода, к сожалению, он под NDA, как часть проекта, на данный момент на разработке большая нагрузка, поэтому, к сожалению, нет времени заниматься выносом его в опенсорс проект :)

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

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

Я хочу сделать оплату в тг Боте что бы после этого получал ссылку на канал но нужно чтобы оплата могла быть любой и с выводом без паспорта кто знает такой сервис скажите

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

киви

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

Спасибо за статью!
Подскажите, подключали ли вы онлайн кассу и отправляли ли чеки для продажи подписок на ваше ПО?

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

А почему вы отключили прим платежей в боте?

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

Всем доброго времени суток, занимаемся внедрение Тинькофф кассу в тг бота, но столкнулись с проблемой ТОКЕНА, он вроде есть , но не работает, а выдаёт ошибку:{'Success': False, 'ErrorCode': '204', 'Message': 'Неверные параметры.', 'Details': 'Неверный токен. Проверьте пару TerminalKey/SecretKey.'}Было такое?

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

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

Хотим все проверить и постараться помочь. Пришлите, пожалуйста, ваши ФИО и дату рождения нам в личные сообщения.

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

У меня вроде как получилось сделать токен для CheckOrder , и там я уже из json смог получить статус заказа ( создал токен OrderId+passwordd+Ter_key и хеш256) через GetState не получилось

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

Всё, GetState получилось) Порядок было сделать таким
Token = Passwordd +PaymentId + Ter_key

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