Directual
Menu

Интеграция платежей TON в ваше приложение на Directual

21 июня 2024 г.

Простое руководство о том, как интегрировать платежи TON в ваше приложение на Directual.

Интеграция платежей TON в ваше приложение на Directual

Здравствуйте и добро пожаловать! Сегодня мы покажем вам, как интегрировать платежи TON в ваше приложение на Directual. И кстати, вы можете также посмотреть наш видеоурок.

Что такое TON?

TON — это невероятный новый блокчейн, построенный на инфраструктуре Telegram. Он спроектирован как распределённый суперкомпьютер, или «суперсервер», предназначенный для предоставления различных продуктов и сервисов, способствующих развитию децентрализованного видения нового интернета. Подробнее о TON можно узнать здесь.

Обзор приложения

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

Войдём как администратор и посмотрим на страницу My Bills. Здесь вы найдёте счета, которые нужно оплатить, а также те, что уже оплачены или отменены. У счетов есть три статуса: New, Paid и Canceled. Вот как это выглядит на странице.

‍

__wf_reserved_inherit

Интерфейс приложения My Bills

‍

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

‍

__wf_reserved_inherit

‍

Администратор также может задать сумму в TON и указать, для кого предназначен счёт.

‍

__wf_reserved_inherit

‍

Шаг 1: Разбираемся со структурами данных

Давайте посмотрим на структуры данных нашего приложения. Их можно найти на вкладке Database.

  • Bills: содержит связь с пользователем, связь со статусом, а также суммы в TON и нано TON.

‍

__wf_reserved_inherit

‍

  • Bill statuses: включает статусы New, Paid и Canceled.

‍

__wf_reserved_inherit

‍

  • Global Constant: коэффициент пересчёта: 1 TON = 1 миллиард нано TON.

‍

__wf_reserved_inherit

‍

Шаг 2: Разбираемся с меню и пользовательскими страницами

Теперь посмотрим на меню. Здесь вы найдёте ссылку на страницу My Bills, которая доступна всем. Также есть папка со страницами, доступными только администратору.

‍

__wf_reserved_inherit

__wf_reserved_inherit

Помимо стандартных веб-страниц, у нас есть две пользовательские страницы: All Bills и My Bills. У страницы All Bills есть две вкладки. На первой — компонент табличного представления, связанный с эндпоинтом, доступным только администратору.

‍

__wf_reserved_inherit

‍

На второй вкладке — компонент многошаговой формы, также связанный с эндпоинтом только для администратора. Эта форма используется для создания счетов. Посмотрим на поля. Их всего три: сумма в TON, клиент — выпадающий список, связанный с эндпоинтом, и скрытое поле статуса со значением по умолчанию New. По умолчанию все новые счета получают статус New.

‍

__wf_reserved_inherit

‍

На странице My Bills вы найдёте компонент Cards view вместе с эндпоинтом.

‍

__wf_reserved_inherit

‍

У этого эндпоинта, через который карточки получают данные, есть два фильтра: Bill User ID равен ID пользователя, и Status равен параметру, передаваемому компонентом, что позволяет использовать один эндпоинт для обоих компонентов карточек.

‍

__wf_reserved_inherit

‍

Для самой карточки мы используем обычный HTML. При клике на неё вы попадаете на подстраницу страницы My Bills. Эта страница также установлена как домашняя.

‍

__wf_reserved_inherit

‍

Шаг 3: Подключение TON-платежей и кошелька

Теперь давайте настроим платежи TON. Сначала нам нужен кошелёк. Вы можете использовать любой кошелёк, но я буду использовать Wallet от Telegram.

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

‍

__wf_reserved_inherit

‍

Начнём с веб-части и добавим плагин на страницу. Перейдём на подстраницу, которая является страницей счёта. Этот раздел отображается только если статус счёта New. Если статус Paid, появится другой раздел.

‍

__wf_reserved_inherit

‍

Нам нужно беспокоиться о компоненте оплаты только для новых счетов, поэтому мы поместили его в этот раздел. Он работает с эндпоинтом, который получает единственный объект счёта с этой подстраницы. Мы просто вставляем кошелёк, на который будем получать платежи, и берём данные из эндпоинта. Это также включает сумму в нано TON и номер заказа.

‍

Небольшое уточнение: все счета мы создаём в TON. Для заполнения поля нано TON мы используем сценарий.

‍

Этот сценарий запускается для всех новых объектов и при изменении суммы в поле TON. Сумма в нано TON — это просто сумма в TON, умноженная на глобальную константу.

‍

__wf_reserved_inherit

__wf_reserved_inherit

‍

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

‍

__wf_reserved_inherit

‍

Просто скопируйте URL этого вебхука в компонент. Теперь сохраните и протестируйте.

‍

__wf_reserved_inherit

‍

В нашем приложении просто нажмите на любой новый счёт, чтобы увидеть кнопку Connect wallet.

‍

Небольшое уточнение: эта кнопка недоступна для оплаченных или отменённых счетов.

‍

__wf_reserved_inherit

‍

Давайте подключим кошелёк. Мы будем использовать Telegram Wallet.

‍

__wf_reserved_inherit

‍

Кошелёк сообщает, что приложение My Bills хочет подключиться и что все транзакции всё равно будут подтверждаться нами.

‍‍

Небольшое уточнение: вы можете настроить иконку или название в настройках веб-приложения на вкладках Icons и General Settings.

‍

__wf_reserved_inherit

__wf_reserved_inherit

‍

Мы подключили кошелёк, отлично! Мы также можем отключить его или подтвердить транзакцию.

‍

__wf_reserved_inherit

‍

Теперь выбранный кошелёк снова готов к работе, поэтому нажимаем Confirm. Сумма будет списана с кошелька. Готово! Транзакция прошла успешно.

‍

__wf_reserved_inherit

‍

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

‍

__wf_reserved_inherit

‍

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

‍

__wf_reserved_inherit

‍

Шаг 4: Получение и обработка транзакций

Теперь давайте автоматизируем получение транзакций. Для этого просто создайте новую структуру данных — назовём её TON Transactions — и добавьте нужные поля. Нам понадобятся ID пользователя, сумма, связь со счётом и флаг обработки транзакции, который должен быть булевого типа.

‍

__wf_reserved_inherit

‍

Также нам нужна структура, которая будет служить триггером, состоящая всего из одного объекта. Этот объект будет запускать сценарий по расписанию.

‍

__wf_reserved_inherit

‍

Хорошо, давайте соберём несколько сценариев. Просто поместим их в папку под названием TON. Первый сценарий называется Get TON Transactions. Этот сценарий будет использовать единственный объект-триггер, который будет запускаться по ежедневному расписанию. Такие типы сценариев извлекают все объекты структуры, а затем обрабатывают их. В нашем случае это всего лишь один объект с ID равным одному.

__wf_reserved_inherit

__wf_reserved_inherit

‍

Добавим шаг Get TON Transactions. Этот шаг возвращает нам ответ в формате JSON, который нам нужно сохранить. Для этого просто добавьте ещё одно поле JSON в триггер и вернитесь к сценарию.

‍

__wf_reserved_inherit

__wf_reserved_inherit

‍

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

‍

__wf_reserved_inherit

‍

Вы можете проверить панель отладки, чтобы увидеть, что сервис TON API вернул нам JSON со всеми транзакциями.

‍

__wf_reserved_inherit

‍

Чтобы разобрать их, нам нужен массив связей на будущие транзакции. Нужно просто добавить поле массива связей в структуру TON Transactions. Вернёмся к сценарию и добавим шаг JSON для разбора ответа.

‍

__wf_reserved_inherit

‍

Если вы добавите комментарии, сценарии будет проще понимать. Далее настроим шаг JSON и определимся со структурой ответа. Вот как структурирован JSON, который мы будем разбирать. Теперь настроим правила разбора.

‍

__wf_reserved_inherit

__wf_reserved_inherit

‍

Данные хранятся в поле API response. Мы разбили массив JSON Transactions на объекты, которые сохранили в массиве Transactions.

‍

В документации указано, на какие поля стоит обращать внимание: в основном value и comment.

‍

Мы берём значение из этого JSON и добавляем его в поле Amount nano TONS будущих объектов транзакций. Также мы берём комментарий из объекта Decoded Body.

‍

Нам просто нужно добавить текстовое поле в поле comment. Теперь сохраните. Далее нам нужно обработать транзакции, которые хранятся в поле Array link. Мы сделаем это в другом сценарии, поэтому добавим шаг Link scenario и настроим сам сценарий обработки транзакций. Этот сценарий работает со структурой TON Transactions без каких-либо триггеров, потому что мы будем вызывать его шагом Link scenario.

‍

__wf_reserved_inherit

‍

Сначала мы проверяем, была ли транзакция уже обработана. Небольшое уточнение: мы добавили поле Is Processed. Если это поле true, мы просто выходим из сценария. Это означает, что транзакция уже обработана. Если ещё нет — обработаем её.

‍

__wf_reserved_inherit

‍

Для наглядности запустим этот сценарий и посмотрим, что произойдёт. Шаг Link scenario может работать с массивом связанных объектов и отправлять их в другой сценарий.

‍

__wf_reserved_inherit

‍

Запустим его и посмотрим, как он работает. Просто отправим объект-триггер через панель отладки, и посмотрим. Логи показывают, что всё работает как надо, и мы видим все транзакции в структуре данных.

‍

__wf_reserved_inherit

‍

Вот последняя — та, которую мы только что сделали. В списке есть и более старые транзакции. Можно отфильтровать некоторые старые записи, если поле comment пустое. Либо транзакция обрабатывается, либо комментарий пуст.

‍

__wf_reserved_inherit

‍

Далее мы получим ID счёта из этого комментария. Как это сделать, можно узнать в документации. Это немного сложный момент, но по сути это просто регулярное выражение. Его можно скопировать прямо из официальной документации. Это самый простой способ получить номер заказа. Мы используем поле Comment и включаем режим Coding, что позволяет нам обрабатывать данные с помощью JavaScript.

‍

__wf_reserved_inherit

‍

Получив ID счёта, мы можем открыть его как связанный объект, изменить статус на Paid и установить флаг Is Processed в True.

‍

__wf_reserved_inherit

‍

Теперь сохраните и опубликуйте сценарий. Давайте посмотрим на шаг получения транзакций. Протестируем сценарий с помощью панели отладки. Отправим объект и посмотрим. Статус счёта меняется на Paid. Сработало!

‍

__wf_reserved_inherit

‍

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

‍

__wf_reserved_inherit

__wf_reserved_inherit

‍

Далее нам нужно заполнить эту контекстную переменную.

Небольшое уточнение: у нас есть ID в поле Link, и оно равно одному.

‍

__wf_reserved_inherit

‍

После получения уведомления может пройти несколько минут, прежде чем транзакция появится в блокчейне. Установим задержку в три минуты. После этого мы отправим объект-триггер — связанный объект из контекстной переменной — в наш сценарий Get TON Transactions.

‍

__wf_reserved_inherit

__wf_reserved_inherit

‍

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

‍

__wf_reserved_inherit

‍

Таким образом, цепочка из двух запусков сценария Get TON Transactions гарантирует, что пользователь увидит свою транзакцию практически в реальном времени.

‍

Послесловие

Если вы выполните эти шаги, вам удастся успешно интегрировать платежи TON в ваше приложение на Directual. Присоединяйтесь к нашему no-code сообществу, делитесь своими идеями и задавайте вопросы. До встречи в следующий раз!

FAQ

Что такое TON и зачем использовать её для своего приложения?

TON (The Open Network) — это быстрорастущий блокчейн, который в основном использует инфраструктуру Telegram, что делает его простым для покупки, вывода средств и интеграции в приложения. Использование TON позволяет вам задействовать огромную экосистему Telegram и предоставить пользователям простой способ оплаты.

Что нужно для начала работы с платежами TON в Directual?

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

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

Просто откройте панель управления Directual, перейдите на вкладку Marketplace и начните просматривать. Если вы видите плагин, который хотите использовать, выберите его и нажмите Install. Это также можно сделать из раздела Plugins внутри вашего приложения.
Евгений Доронин
Копирайтер в Directual
← Назад к списку