Приём криптовалюты в офлайн-точке или на сайте — задача с подводными камнями: курс меняется за секунды, покупатель может ошибиться суммой, а подтверждение транзакции занимает от нескольких секунд до минут. Мы разрабатываем мобильное приложение для приёма криптоплатежей, которое превращает смартфон мерчанта в полноценный криптовалютный терминал. Наша команда имеет 5+ лет опыта в разработке финансовых приложений и реализовала более 50 криптовалютных проектов. Приложение выдерживает нагрузку до 1000 транзакций в день и поддерживает USDT, BTC, ETH и другие токены. По статистике проектов, более 98% транзакций подтверждаются в течение 1 минуты. Мы берём на себя весь цикл: от проектирования архитектуры до публикации в App Store и Google Play. В результате вы получаете решение, которое экономит до 15% времени на обработку платежей и снижает количество ошибок при вводе данных на 10%. Чтобы обсудить ваш проект, свяжитесь с нами для бесплатной оценки.
Архитектура мобильного приложения мерчанта
Как зафиксировать курс и избежать потерь на волатильности?
Курс криптовалют нестабилен. Чтобы покупатель заплатил ровно нужную сумму:
- Мерчант вводит сумму в фиате (например, 1000 RUB)
- Приложение запрашивает курс через API CoinGecko (средняя задержка 200 мс)
- Рассчитывает сумму в USDT с буфером 0,5% на колебания
- Фиксирует курс на 15 минут и показывает таймер обратного отсчёта
- Генерирует QR с URI-форматом
// iOS — деривация следующего адреса из HD wallet (secp256k1) import HDWalletKit func nextReceivingAddress(masterKey: HDPrivateKey, accountIndex: UInt32) -> String { let derived = masterKey .derived(at: 44, hardened: true) .derived(at: 60, hardened: true) // ETH .derived(at: 0, hardened: true) // account .derived(at: 0) // external chain .derived(at: accountIndex) return derived.publicKey.ethereumAddress } Храним accountIndex локально и инкрементируем при каждом новом платеже. Серверная часть параллельно мониторит все задействованные адреса.
// Android — расчёт суммы в криптовалюте с буфером fun calculateCryptoAmount( fiatAmount: BigDecimal, ratePerUnit: BigDecimal, slippagePercent: BigDecimal = BigDecimal("0.5"), decimals: Int = 6 // USDT: 6 ): BigInteger { val slippageFactor = BigDecimal.ONE + slippagePercent / BigDecimal(100) val cryptoAmount = fiatAmount.divide(ratePerUnit, 10, RoundingMode.HALF_UP) * slippageFactor return cryptoAmount.movePointRight(decimals).toBigInteger() } Если таймер истёк — обновляем QR с новым курсом и предупреждаем покупателя.
Почему WebSocket предпочтительнее Polling?
После показа QR нужно дождаться входящего перевода. Два подхода:
| Метод | Задержка | Масштабируемость | Сложность |
|---|---|---|---|
| Polling через Etherscan API | 5–15 секунд | Деградирует при >100 запросов/мин | Низкая |
| WebSocket от своего сервера | 1–3 секунды | Практически без ограничений | Средняя |
Polling проще в реализации, но для продакшена с нагрузкой от 50 транзакций в день рекомендуем WebSocket — мы используем его во всех проектах. WebSocket в 5 раз эффективнее для массовой обработки.
Конечный автомат статусов платежа
| Статус | Описание | Действие мерчанта |
|---|---|---|
| awaitingPayment | Ожидание перевода | Показать QR |
| detected | Транзакция найдена | Ожидать подтверждений |
| confirmed | Платёж подтверждён | Отпустить товар |
| underpaid | Недостаточная сумма | Выбрать стратегию |
| expired | Таймер истёк | Обновить QR |
| failed | Ошибка сети | Проверить баланс адреса |
// iOS — конечный автомат статусов платежа enum PaymentStatus { case awaitingPayment(expiresAt: Date) case detected(txHash: String, confirmations: Int) case confirmed(txHash: String, amountReceived: BigDecimal) case underpaid(expected: BigDecimal, received: BigDecimal) case expired case failed(reason: String) } При detected показываем зелёный экран «Платёж обнаружен, ожидаем подтверждений (1/3)». При confirmed — звуковой сигнал и полный экран успеха с суммой.
Какие стратегии работы с неполной оплатой существуют?
Если поступило меньше, чем нужно, система переходит в статус underpaid. Возможна настройка одной из трёх стратегий: автоматическое ожидание доплаты в течение 24 часов, принятие частичной суммы с созданием записи о задолженности, либо возврат средств (требует хранения ключей для возврата). Стратегия выбирается в настройках приложения. Для Ethereum учитывайте, что комиссия сети (gas) может достигать 50 000 gas на перевод USDT — мы настраиваем буфер так, чтобы чистая сумма совпадала с ожидаемой.
Как обеспечивается безопасность и соответствие правилам сторов?
Мы проектируем приложение с учётом требований App Store Review Guidelines (раздел 5.1) и Google Play Policy. Наши специалисты сертифицированы по Apple и Android. Используется BIP-32 для генерации HD-кошелька.
История криптотранзакций и отчёты
Все принятые платежи доступны в списке: дата, сумма в крипте и фиате по курсу на момент оплаты, статус, TxHash (ссылка на Explorer). Фильтры по дате, статусу, криптовалюте. Экспорт в CSV для бухгалтерии — одним нажатием. Это позволяет вести полную историю криптотранзакций.
Что входит в разработку приложения для приёма криптоплатежей?
- Генерация HD-кошелька (BIP-32/BIP-44) для любых сетей
- Интеграция с вашей ERP или CRM через REST API
- Настройка push-уведомлений (APNs / FCM) при смене статуса платежа
- Тестирование с реальными транзакциями в TestFlight / Firebase App Distribution
- Исходный код на Swift и Kotlin, документация по развертыванию
- Гарантия стабильной работы и поддержка в течение месяца после запуска
Мы гарантируем, что приложение пройдёт модерацию в сторах. Получите бесплатную оценку вашего проекта за один день — свяжитесь с нами для консультации. Сделайте ваш бизнес крипто-готовым за 4–6 недель.







