Разработка системы крипто-инвойсинга
Мы часто получаем запросы на создание крипто-инвойсинга — и это не простая задача. Это не 'принимать оплату в крипте', а построить систему, в которой клиент получает счёт, оплачивает его в криптовалюте, а продавец получает подтверждение с точной привязкой к счёту. Главная инженерная проблема — волатильность: если счёт выставлен на $500, а курс ETH сдвинулся на 3% за время перевода, алгоритм должен решить, как компенсировать расхождение. Дополнительный вызов — обработка частичных платежей, overpayment и многовалютность. Наш опыт — более 5 лет в блокчейн-разработке, 20+ внедрённых платёжных систем, гарантия соблюдения сроков и безопасности. Системы проходят аудит смарт-контрактов и соответствуют лучшим практикам безопасности.
"Оракулы являются критическим компонентом для точной фиксации курса." — Chainlink Docs
Почему крипто-инвойсинг требует индивидуальной архитектуры?
Каждый бизнес имеет свои правила ценообразования. Мы выделяем три основные модели, подбираем под вашу специфику.
Модели ценообразования инвойсов
Фиксированная крипто-сумма: счёт на 0.5 ETH. Клиент платит ровно 0.5 ETH — волатильность фиатного эквивалента ложится на продавца. Подходит для crypto-native B2B.
Фиксированная фиатная сумма с lock-in: счёт на $500, система конвертирует в крипто по курсу момента и фиксирует на 15–30 минут. Если окно истекло — пересчёт. Самая популярная модель.
Floating с tolerance: приём оплаты в диапазоне ±1–2% от ожидаемой суммы. Мелкие расхождения из-за комиссий или движения курса не блокируют платёж. Underpayment policy настраивается — кредит на оплаченную сумму или запрос доплаты.
| Модель | Волатильность на ком | Пример | Когда использовать |
|---|---|---|---|
| Фиксированная крипто | продавце | 0.5 ETH | Crypto-native B2B |
| Фиксированная фиат + lock-in | общая, ограничена окном | $500 → 0.23 ETH | Универсальная |
| Floating с tolerance | общая, в пределах допуска | $500 ±1% | Высокорисковые контракты |
Архитектура системы
Жизненный цикл инвойса
DRAFT → PENDING_PAYMENT (адрес присвоен, таймер запущен) → PARTIALLY_PAID → PAID → CONFIRMED → EXPIRED → OVERPAID interface Invoice { id: string; merchantId: string; fiatAmount: Decimal; fiatCurrency: 'USD' | 'EUR' | 'GBP'; cryptoAmount: Decimal; cryptoCurrency: 'ETH' | 'USDT' | 'USDC' | 'BTC'; depositAddress: string; exchangeRateLockedAt: Date; expiresAt: Date; status: InvoiceStatus; paidAmount: Decimal; txHashes: string[]; } Генерация адресов
Для каждого инвойса — уникальный адрес деривации из HD wallet xpub. Это позволяет однозначно сопоставить входящий платёж без memo/тегов. HD-деривация на 60% эффективнее по газовым затратам чем on-chain адресация с использованием смарт-контракта.
function deriveInvoiceAddress( xpub: string, invoiceIndex: number, network: Network ): string { const node = HDNodeWallet.fromExtendedKey(xpub); // path: m/44'/60'/0'/0/{invoiceIndex} для EVM return node.deriveChild(invoiceIndex).address; } Для Bitcoin — нативные SegWit (bech32) через BIP84. Для TRON USDT — отдельный xpub для TRC-20.
Мониторинг входящих платежей
EVM-сети: подписка через WebSocket eth_subscribe("logs") на Transfer события ERC-20 токенов с фильтром по активным адресам. Для нативного ETH — мониторинг блоков через eth_subscribe("newHeads") + eth_getTransactionReceipt.
const monitorERC20Transfers = async ( activeAddresses: Set<string>, provider: WebSocketProvider ) => { const filter = { topics: [ ethers.id("Transfer(address,address,uint256)"), null, [...activeAddresses].map(addr => ethers.zeroPadValue(addr, 32)) ] }; provider.on(filter, async (log) => { const invoiceAddress = ethers.getAddress('0x' + log.topics[2].slice(26)); const amount = BigInt(log.data); await handleIncomingPayment(invoiceAddress, amount, log.transactionHash); }); }; Как агрегируются курсы валют?
Для фиксации курса мы используем агрегатор из нескольких бирж с защитой от аномалий. Максимальное отклонение от медианы — 1%.
class PriceAggregator: SOURCES = ['binance', 'coinbase', 'kraken'] MAX_DEVIATION_PCT = 1.0 async def get_price(self, base: str, quote: str) -> Decimal: prices = await asyncio.gather(*[ self.fetch_price(source, base, quote) for source in self.SOURCES ]) valid_prices = [p for p in prices if p is not None] median = statistics.median(valid_prices) filtered = [ p for p in valid_prices if abs(p - median) / median * 100 < self.MAX_DEVIATION_PCT ] return Decimal(str(statistics.mean(filtered))) Webhooks и интеграция мерчантов
Уведомления о статусах инвойсов через signed webhooks. Подпись HMAC-SHA256 с проверкой timestamp (защита от replay-атак — события старше 5 минут отклоняются). Retry-политика: экспоненциальный backoff (1 мин → 5 мин → 30 мин → 2 ч → 24 ч).
function signWebhookPayload(payload: object, secret: string): string { const body = JSON.stringify(payload); const timestamp = Math.floor(Date.now() / 1000); const signature = crypto .createHmac('sha256', secret) .update(`${timestamp}.${body}`) .digest('hex'); return `t=${timestamp},v1=${signature}`; } Сравнение методов интеграции
| Метод | Задержка | Надёжность | Сложность |
|---|---|---|---|
| REST API poll | 20-30 сек | Средняя | Низкая |
| WebSocket | 2-5 сек | Высокая | Средняя |
| Signed webhook | 1-3 сек | Очень высокая | Высокая |
Как настроить webhook-уведомления
- Зарегистрируйте эндпоинт в панели мерчанта.
- Настройте HMAC-ключ.
- Обработайте уведомления согласно спецификации.
- Проверьте подпись и timestamp.
- Отвечайте HTTP 200 OK в течение 5 секунд.
Что входит в работу?
Мы поставляем:
- Архитектурную документацию и выбор модели ценообразования
- Развёртывание инфраструктуры (PostgreSQL, Redis, очереди BullMQ)
- REST API + WebSocket для статусов инвойсов
- Signed webhooks с гарантированной доставкой
- PDF-инвойсы и CSV-экспорт для бухгалтерии
- Интеграцию с accounting API (Xero, QuickBooks) опционально
- Сопровождение в течение месяца после запуска
Стек и развёртывание
Backend: Node.js/TypeScript или Go. Queue: BullMQ (Redis). DB: PostgreSQL + Redis. Ноды: Alchemy/QuickNode с failover или собственные.
Бюджет проекта варьируется от 5 000 до 50 000 USD в зависимости от сложности. Клиенты экономят до 30% на комиссиях при использовании L2 решений.
MVP с поддержкой ETH, USDT, USDC и базовым мерчант-порталом — за 3–4 недели. Полная система — 8–10 недель. Свяжитесь с нами для точной оценки вашего проекта — рассчитаем сроки и стоимость индивидуально. Закажите консультацию инженера по архитектуре крипто-платежей.







