Разработка платёжного виджета для криптовалют
Мы часто получаем запросы: «хотим принимать крипту на сайте, как PayPal, но для USDT». На практике это означает решить несколько нетривиальных задач одновременно: генерировать уникальные адреса под каждый платёж, детектировать входящие транзакции, обрабатывать разные сети и токены, корректно работать с подтверждениями и reorg'ами. Готовые решения вроде Coinbase Commerce или NOWPayments берут 0.5–1% комиссии и имеют ограниченную кастомизацию. Собственный виджет оправдан при обороте от $10 000 в месяц — экономия на комиссиях может достигать $100–$500 ежемесячно. Наш опыт: 10+ лет в блокчейн-разработке и более 50 внедрённых платёжных решений. Мы гарантируем полный контроль над транзакциями и отсутствие скрытых комиссий.
Почему не стоит использовать готовые платёжные шлюзы?
| Критерий | Готовые шлюзы (Coinbase Commerce, NOWPayments) | Собственный виджет |
|---|---|---|
| Комиссия | 0.5–1% + возможные скрытые сборы | Только затраты на газ и инфраструктуру |
| Кастомизация | Только выбор цвета и логотипа | Полный контроль: UI/UX, валюты, коллбэки |
| Интеграция | Закрытый API, ограниченные вебхуки | Кастомные webhook-события, прямая запись в БД |
| Безопасность | Ключи на стороне провайдера | Ваши ключи, ваша инфраструктура |
| Поддерживаемые сети | Ограниченный список | Любые EVM-сети, Bitcoin, Tron, Solana |
Архитектура: что внутри виджета
Виджет — это только UI-часть. Реальная работа происходит на бэкенде:
Frontend Widget │ создать заказ / показать адрес и QR ▼ Backend API │ генерация адреса → запись в БД → polling/webhook ▼ Blockchain Monitoring Service │ отслеживает транзакции на адресах ▼ Payment Processor │ подтверждение → коллбэк в приложение Как интегрировать виджет за 3 шага
- Разместите JavaScript-скрипт виджета на странице и инициализируйте его с API-ключом.
- Вызовите метод
createPayment({orderId, amount, currency})— виджет сгенерирует адрес и QR-код. - Обработайте callback
onPaymentConfirmed(paymentData)в вашем приложении для обновления статуса заказа.
Генерация адресов: HD Wallet
Для каждого платежа нужен уникальный адрес — иначе невозможно сопоставить входящий платёж с конкретным заказом. Стандартный подход — BIP-44 HD Wallet (см. BIP-44):
«BIP-44 определяет иерархические детерминированные кошельки» — Wikipedia
import { ethers } from 'ethers'; const masterWallet = ethers.HDNodeWallet.fromMnemonic( ethers.Mnemonic.fromPhrase(process.env.PAYMENT_MNEMONIC!) ); function derivePaymentAddress(orderId: number): string { const child = masterWallet.derivePath(`m/44'/60'/0'/0/${orderId}`); return child.address; } Мнемоника хранится в HSM или Vault, приватные ключи никогда не материализуются на сервере. Для мультивалютности используются разные coin types по BIP-44 (60 для Ethereum/EVM, 0 для Bitcoin, 195 для Tron).
Для EVM-сетей с одинаковыми адресами (Ethereum, BNB Chain, Polygon, Arbitrum) один адрес работает во всех сетях — но мониторить нужно каждую сеть отдельно.
Мониторинг транзакций
Два подхода: polling RPC и webhook-подписки. Polling — проще, но создаёт нагрузку:
async function pollAddress(address: string, network: string) { const provider = getProvider(network); const usdtContract = new ethers.Contract(USDT_ADDRESS, ERC20_ABI, provider); const filter = usdtContract.filters.Transfer(null, address); const latestBlock = await provider.getBlockNumber(); const events = await usdtContract.queryFilter(filter, latestBlock - 10, latestBlock); for (const event of events) { await processIncomingPayment({ txHash: event.transactionHash, amount: event.args.value, token: 'USDT', network, }); } } Webhooks — через Alchemy, QuickNode или Moralis. Подписываетесь на события адреса, получаете push при каждой транзакции:
const webhook = await alchemy.notify.createWebhook( 'https://your-api.com/webhook/payment', WebhookType.ADDRESS_ACTIVITY, { addresses: [paymentAddress] } ); Как обеспечить безопасность приватных ключей?
Ключевой риск — компрометация мастер-мнемоники. Мы применяем многослойную защиту:
- Мнемоника хранится в HashiCorp Vault с шифрованием на лету и доступом по политикам.
- Никогда не используется .env-файл в production.
- Приватные ключи для каждого адреса генерируются по BIP-44 и не материализуются в приложении.
- Все операции с кошельком логируются, настроен алертинг при подозрительной активности.
Дополнительные меры защиты
Для особо чувствительных проектов используем hardware security module (HSM) — например, AWS CloudHSM или YubiHSM. Также настраивается мультиподпись для вывода средств: транзакции на сумму свыше $10 000 требуют подтверждения второго ключа.Подтверждения и защита от double-spend
Разные активы требуют разного числа подтверждений:
| Актив/сеть | Рекомендуемые подтверждения | Время |
|---|---|---|
| ETH / ERC-20 (Ethereum) | 12–20 блоков | ~3–4 мин |
| BNB Chain | 15–20 блоков | ~1 мин |
| Polygon | 100–150 блоков | ~4–6 мин |
| TRON TRC-20 | 20 блоков | ~1 мин |
| Bitcoin | 3–6 блоков | ~30–60 мин |
Polygon требует больше подтверждений из-за более высокой вероятности reorg. Не засчитывайте платёж как финальный до достижения нужного порога.
Для stablecoins: дополнительно проверяйте, что контракт токена — официальный. Пользователь может прислать поддельный токен с именем "USDT". Whitelist адресов контрактов обязателен.
UI/UX компоненты виджета
Минимальный набор для конверсии:
┌─────────────────────────────────────┐ │ Оплатить: 47.50 USDT │ │ │ │ Сеть: [Ethereum ▼] [BNB Chain ▼] │ │ │ │ [QR-код] 0x7f3a...b2c4 │ │ [Копировать] │ │ │ │ ⏱ Ожидание оплаты: 14:32 │ │ ● Ожидаем транзакцию... │ └─────────────────────────────────────┘ Критично: таймер сессии (обычно 15–30 минут), после которого адрес освобождается и курс пересчитывается. Статус обновляется через WebSocket или SSE — polling каждые 5 секунд раздражает и создаёт нагрузку.
Конвертация фиатной суммы в крипто: используйте Chainlink Price Feeds или CoinGecko API с кешированием. Добавляйте 1–2% буфер к курсу с учётом волатильности за время ожидания.
Обработка underpayment и overpayment
Реальные пользователи часто платят неточную сумму:
- Underpayment (прислали меньше): или блокируете заказ до доплаты, или принимаете с пометкой "частичная оплата" — зависит от бизнес-логики.
- Overpayment (прислали больше): зачисляете как кредит пользователя, либо возвращаете разницу автоматически.
- Комиссия сети: для нативных монет (ETH, BNB) пользователь должен иметь её на кошельке отдельно — этот UX-момент важно объяснить.
Что входит в работу
- Документация API для интеграции виджета с вашим сайтом.
- Тестовый стенд в одной из сетей (Goerli/Sepolia) для приёмки.
- Исходный код с инструкцией по развёртыванию (Docker, CI/CD).
- Интеграция с вашей CRM или ERP через webhook-коллбэки.
- Обучение команды работе с админ-панелью и мониторингом.
- Гарантийная поддержка 3 месяца (входит в стоимость).
Оценка проекта
Закажите разработку платёжного виджета под ваш бизнес — мы оценим проект за 1-2 дня и предложим оптимальную архитектуру. Получите консультацию: обсудим требования, сроки и бюджет. Полный контроль над криптоплатежами без посредников.







