К основному содержанию
T TON Adoption
Новости TOOLSET · 2026

TON Pay: SDK для приёма платежей в TON 2026

@ton-pay/api — официальный SDK для приёма TON-платежей в web, Mini App и боте. Что внутри, отличия от Crypto Pay и Wallet Pay, как интегрировать.

Автор
TON Adoption Team · редакция
Опубликовано
2 мин. чтения

TON Pay — это SDK для приёма платежей в TON, опубликованный в составе TON Toolset в 2026 году. Конкурирует с Crypto Pay API и Wallet Pay, но с принципиально другой архитектурой — non-custodial.

Архитектура

[Mini App / web]  →  [TON Pay UI]  →  [User wallet]  →  [Merchant address]

                                                       [TON Pay backend]

                                                       [Order fulfillment]

В отличие от Crypto Pay:

  • Custodial (Crypto Pay): User → Crypto Pay wallet → (merchant requests withdrawal).
  • Non-custodial (TON Pay): User → Merchant wallet directly, no intermediary holding funds.

Минимальный backend

import { TonPayServer } from '@ton-pay/api';

const server = new TonPayServer({
  merchantAddress: 'EQDxxx...',  // ваш адрес
  network: 'mainnet',
});

// Создать payment intent
const intent = await server.createIntent({
  amount: '15 TON',
  description: 'Premium subscription',
  orderId: 'order-42',
});
// intent: { id, paymentUrl, expiresAt, paymentMemo }

// Когда пользователь заплатит, webhook вызовет:
server.on('payment:confirmed', async ({ orderId, txHash, amount }) => {
  await db.markPaid(orderId);
  await sendConfirmation(orderId);
});

Frontend (React пример)

import { TonPayCheckout } from '@ton-pay/ui-react';

<TonPayCheckout
  intentId="intent-xyz"
  onSuccess={(tx) => navigate(`/orders/${tx.orderId}/confirmation`)}
  onCancel={() => console.log('User cancelled')}
/>

<TonPayCheckout> отрисовывает:

  • QR-код для desktop-пользователя.
  • Deeplink (ton://transfer/...) для mobile.
  • Список поддерживаемых кошельков с логотипами.
  • Status polling — показывает «ожидание», «подтверждено», «ошибка».

On-ramp интеграция

Самый ценный фичей — onramp flow. Если у пользователя нет TON:

<TonPayCheckout
  intentId="intent-xyz"
  enableOnramp={true}
  onrampProviders={['mercuryo', 'moonpay']}
/>

Это даёт пользователю кнопку «Купить TON картой» прямо в чекауте — он покупает TON у Mercuryo/MoonPay, получает на свой кошелёк, и завершает платёж — всё за 5 минут. Подробнее — фиатные on-ramp для TON.

Jetton-платежи

const usdtIntent = await server.createIntent({
  amount: '50 USDT',
  jetton: 'usdt-jetton',
  orderId: 'order-43',
});

Backend сам определяет цену в TON по курсу (через DEX-aggregator), формирует правильный jetton-transfer, и валидирует получение.

Когда брать TON Pay vs Crypto Pay vs Wallet Pay

КритерийTON PayCrypto PayWallet Pay
CustodyNon-custodialCustodialCustodial
Контрагентский рискМинимальныйCrypto Pay’s solvency@wallet’s solvency
Сложность интеграцииСредняяНизкаяНизкая
Время на выводМгновенно (уже у вас)ДниЧасы
Multi-currencyTON + jettonsМного токеновЧерез @wallet
Open sourceДаНетНет
TargetingЛюбой web/Mini AppTG-боты, Mini AppsTG-боты, Mini Apps

TON Pay лучше для:

  • Web-приложений вне Telegram.
  • Когда важна non-custodial-архитектура (low risk).
  • Когда хочется свой backend (control over data).

Crypto Pay / Wallet Pay лучше для:

  • Простых TG-ботов, где не хочется свой backend.
  • Микро-платежей и тип-чаевых.

Подробнее про альтернативы — в сравнении Crypto Pay vs Wallet и гайде по Crypto Pay API.

Webhooks и события

server.on('payment:pending', ({ orderId, txHash }) => {
  // Транзакция в mempool, ждём подтверждения
});

server.on('payment:confirmed', ({ orderId, txHash, amount }) => {
  // Транзакция подтверждена, можно отдавать товар
});

server.on('payment:failed', ({ orderId, reason }) => {
  // Что-то пошло не так — недостаточно средств, неверный memo, etc
});

server.on('intent:expired', ({ orderId }) => {
  // Intent истёк (например, через 24 часа без оплаты)
});

Что не покрыто

  • Recurring payments / subscriptions — TON Pay (пока) on-chain не поддерживает подписки. Workaround: ваш backend сам генерирует new intent каждый месяц.
  • Refunds — non-custodial, refund = мерчант сам отправляет TON обратно. SDK даёт helper refund(txHash), но это manual.
  • Chargebacks — отсутствуют в крипте в принципе.

Что дальше

Если строите checkout в Mini App или web — TON Pay экономит недели работы. Если у вас простой TG-бот для приёма tip’ов — Crypto Pay проще.

Полный контекст Toolset — обзор от TON Foundation.

Частые вопросы

TON Pay — это SDK от TON Foundation (через партнёра RSquad) для приёма TON-платежей в web-приложениях, Mini App и Telegram-ботах. Закрывает один из самых частых сценариев — мерчант принимает TON в обмен на товар/услугу — стандартизированным набором инструментов вместо самописных backend-интеграций.
Crypto Pay (@CryptoBot) и Wallet Pay (@wallet) — это **custodial кассы**: пользователь платит на их счёт, они держат средства, мерчант выводит. TON Pay — **non-custodial**: пользователь платит напрямую на адрес мерчанта, no third party between. Это снижает контрагентский риск, но требует от мерчанта своего backend для валидации.
Backend (`@ton-pay/api`) для серверной части: создание payment intents, валидация on-chain платежей, webhooks. Frontend (`@ton-pay/ui-react`) — готовые checkout-компоненты с QR-кодом, deeplink в кошелёк, статусом транзакции. Плюс on-ramp flow — пользователь может купить TON прямо в чекауте через partner-провайдеры.
Да. TON Pay поддерживает jetton-платежи (USDT-jetton, USDC, stTON и любые другие jettons). Сценарий: мерчант указывает товар в USDT, пользователь платит USDT-jetton через свой кошелёк. SDK handle'ит и нативный TON, и jetton'ы.
Сам SDK бесплатный (open source). Платите только газ за on-chain транзакцию (около 0.005-0.01 TON). Если используете hosted-вариант (Payment API) — может быть платный план у провайдера (RSquad). On-ramp flow (купить TON картой) — комиссия on-ramp партнёра (1-3%).
Все платежи валидируются on-chain — мерчант не отдаёт товар, пока backend не подтвердил, что транзакция на нужный адрес в нужном размере с правильным memo (payment_id). Memo — это уникальный ID платежа, который SDK генерирует на этапе создания intent. Без него транзакция считается невалидной.

Похожие материалы