Розробка системи управління крипто-карткою
Зазначимо: коли користувач хоче платити криптовалютою у звичайному магазині, виникає складний ланцюжок: конвертація, авторизація, settlement — і все за 1–2 секунди. Ми побудували не одну таку систему і знаємо кожен підводний камінь: від вибору card issuing провайдера до real-time webhook-обробника. У цьому матеріалі — архітектура, яка працює в продакшені.
Крипто-картка — це міст між on-chain активами та традиційною платіжною інфраструктурою. Користувач тримає USDC, платить у звичайному магазині — система конвертує та списує у фоновому режимі. Побудувати це складніше, ніж здається: тут перетинаються card issuing, real-time конвертація, compliance та блокчейн-інфраструктура. Ми реалізували такі системи для neobank-стартапів та crypto-native платформ, зіткнувшись із нюансами batch settlement, форс-мажорами oracle та юридичними вимогами в юрисдикціях ЄС та США. Нижче — деталі, які заощадили місяці розробки. Якщо вам потрібна подібна система — зв'яжіться з нами для консультації.
Card Issuing: з ким працювати
Самостійно отримати BIN спонсора та емітувати картки — довго та дорого: партнерство з Visa/Mastercard вимагає значного депозиту та займає 12–18 місяців. Реалістичний шлях — працювати через card issuing платформи:
- Marqeta — лідер ринку, програмовані картки через Just-in-Time (JIT) Funding. Ключова фіча: при кожній авторизації Marqeta робить webhook на ваш сервер, ви вирішуєте — схвалити чи відхилити та миттєво фондуєте транзакцію. Ідеально для крипто-карток.
- Lithic (колишній Privacy) — аналог Marqeta, часто кращий для стартапів через простіший onboarding.
- Moorwand / Railsr (Європа) — для європейських карток з IBAN.
- Monavate / Paymentology — альтернативи з більш гнучкими умовами для crypto-native компаній.
Усі ці провайдери дають REST API для випуску карток, керування лімітами, отримання транзакцій.
Механізм JIT Funding
Just-in-Time Funding — це коли баланс на картці завжди нульовий, а гроші з'являються лише в момент авторизації. Для крипто-картки це означає: користувач авторизує покупку → card processor викликає ваш webhook → ви конвертуєте крипту в фіат → підтверджуєте транзакцію — все за 1–2 секунди.
Документація Marqeta: "Just-in-Time Funding дозволяє емітентам контролювати кожну авторизацію в реальному часі."
Ось покрокова послідовність обробки:
- Card processor (Marqeta, Lithic) надсилає HTTP-запит на ваш webhook з деталями авторизації.
- Сервіс визначає користувача за card_token та перевіряє доступний баланс в USDC через локальний кеш або швидкий запит до блокчейну.
- Якщо коштів достатньо (з урахуванням буфера на slippage), система резервує суму (soft lock) і повертає рішення APPROVE.
- Після settlement (через хвилини або години) запускається реальна конвертація USDC в фіат через off-ramp провайдера.
- Баланс користувача оновлюється, надсилається push-повідомлення.
Webhook має відповідати за 1–2 секунди. Якщо тайм-аут — транзакція автоматично відхиляється. Це жорстка вимога, яка визначає всю архітектуру: жодних синхронних блокчейн-операцій у цьому шляху.
interface AuthorizationWebhook {
type: "authorization";
token: string;
card_token: string;
amount: number; // в центах
currency: string; // ISO 4217
merchant: {
descriptor: string;
mcc: string;
country: string;
};
created: string;
}
async function handleAuthorization(
webhook: AuthorizationWebhook
): Promise<AuthorizationResponse> {
// 1. Знайти користувача та його крипто-баланс
const user = await getUserByCardToken(webhook.card_token);
const requiredUsd = webhook.amount / 100;
// 2. Перевірити доступний баланс в USDC
const usdcBalance = await getUsdcBalance(user.walletAddress);
if (usdcBalance < requiredUsd * 1.01) { // +1% буфер на slippage
return { decision: "DECLINE", reason: "INSUFFICIENT_FUNDS" };
}
// 3. Зарезервувати кошти (soft lock)
const reservation = await reserveFunds(user.id, requiredUsd, webhook.token);
// 4. Підтвердити авторизацію
return {
decision: "APPROVE",
amount: webhook.amount,
reservation_id: reservation.id,
};
}
Settlement та реальне списання
Після авторизації йде settlement — фактичне переміщення коштів. Це може відбуватися через хвилини або години після авторизації. Тут виконується реальна конвертація крипти.
async function settleTransaction(settlementData: SettlementEvent): Promise<void> {
const reservation = await getReservation(settlementData.authorization_token);
// Для USDC — просто перевести на фіатний рахунок через USDC → USD off-ramp
// (Circle, Stripe Crypto, Bridge.xyz)
const offRampResult = await circleOffRamp({
amount: reservation.usdAmount,
destinationBankAccount: OPERATIONAL_ACCOUNT,
});
// Оновити баланс користувача
await deductUserBalance(reservation.userId, reservation.usdcAmount);
// Надіслати push-повідомлення
await sendTransactionNotification(reservation.userId, {
amount: reservation.usdAmount,
merchant: settlementData.merchant.descriptor,
txId: offRampResult.id,
});
}
Конвертація: USDC vs volatility assets
USDC/USDT — найпростіший випадок. Конвертація тривіальна, оскільки курс прив'язаний. Більшість крипто-карток першого покоління працюють лише зі стейблкоїнами.
ETH/BTC та інші — потрібен real-time price feed та управління ціновим ризиком. Варіанти:
- Конвертувати в USDC при поповненні картки — користувач явно міняє ETH → USDC, далі все як вище. Найпростіший підхід.
- Конвертувати в момент транзакції — вищий ризик slippage (зазвичай 0.5–1%) та цінового gap між авторизацією та settlement. Потребує hedging стратегії.
- Віртуальний баланс + періодичний settlement — агрегуєте транзакції, конвертуєте батчами. Знижує transaction costs, але ускладнює accounting.
Чому важливий правильний вибір card issuing провайдера?
Успіх крипто-картки прямо залежить від здатності провайдера обробляти мільйони JIT Funding запитів з мінімальною затримкою. Marqeta краще для JIT Funding завдяки більш детальним webhook-конфігураціям, але Lithic швидше в інтеграції для стартапів. Для європейського ринку — Moorwand або Railsr з підтримкою SEPA Instant. Помилка на цьому етапі призводить до відмов транзакцій та втрати довіри користувачів.
Як забезпечити compliance при випуску крипто-карток?
Крипто-картка з реальним використанням — це фінансовий продукт, який регулюється як мінімум як електронні гроші. Обов'язкові компоненти:
- KYC/AML — провайдери: Sumsub, Persona, Onfido. Інтеграція через REST API + webhook на події верифікації. Мінімальний tier: документ + selfie. Для високих лімітів — Enhanced Due Diligence (EDD). Детальніше про KYC та AML.
- Transaction monitoring — аналіз on-chain історії адрес користувачів. Chainalysis API або Elliptic для перевірки: чи не надходять кошти з санкційних адрес, міксерів, darknet markets.
- Ліміти за замовчуванням — поки KYC не пройдено: встановлюються відповідно до регуляторних вимог (наприклад, за PSD2 exemption). Після верифікації — стандартні ліміти. Це вимога card schemes, а не ваша вигадка.
Технічний стек
| Компонент | Варіанти | Рекомендація |
|---|---|---|
| Card issuing | Marqeta, Lithic | Marqeta для JIT Funding |
| Backend | Node.js/TypeScript, Go | Go для latency-sensitive webhook handler |
| База даних | PostgreSQL | + Redis для reservation locks |
| Блокчейн | Viem, ethers.js | Viem для EVM |
| Off-ramp | Circle, Bridge.xyz | Circle USDC → USD |
| KYC | Sumsub, Persona | Sumsub — найкраще охоплення країн |
| Нотифікації | Firebase, Appcenter | Firebase для push |
Webhook handler для авторизації має працювати окремим високодоступним сервісом з SLA 99.9%+, мінімальною кількістю залежностей та локальним кешем для швидких перевірок балансу.
Терміни розробки
| Етап | MVP | Повний продукт |
|---|---|---|
| Архітектура та вибір стеку | 2 тижні | 1 місяць |
| Інтеграція card issuing | 2–3 тижні | 1–2 місяці |
| Backend (webhook + core) | 2 місяці | 5–7 місяців |
| Off-ramp та конвертація | 3 тижні | 2–3 місяці |
| KYC/AML модуль | 1 місяць | 2–3 місяці |
| Тестування та аудит | 2 тижні | 1–2 місяці |
| Юридичні договори | паралельно | 3–6 місяців |
Що входить в розробку
- Архітектура та вибір стеку під вашу бізнес-модель (B2C або B2B).
- Інтеграція з card issuing провайдером, налаштування JIT Funding.
- Backend на Go або Node.js з обробкою webhook-ів (latency < 1 сек).
- Підключення off-ramp (Circle, Bridge.xyz) для конвертації USDC → фіат.
- KYC/AML модуль з підтримкою Sumsub або Persona.
- Transaction monitoring, ліміти, блокування.
- Документація API та інструкції з експлуатації.
- Технічна підтримка на етапі запуску та перші 2 місяці після релізу.
Ми гарантуємо відповідність вимогам card schemes та регуляторів. Наш досвід — 5+ років у розробці крипто-сервісів: від гаманців до повноцінних neobank рішень.
Типові помилки при інтеграції JIT Funding:
- Синхронні блокчейн виклики у webhook-і — гарантований тайм-аут.
- Відсутність локального кешу балансів — 100мс+ затримка на кожен запит.
- Неправильний розрахунок комісій — settlement може згоріти через перевищення ліміту.
- Ігнорування мультивалютних settlement-ів — при конвертації може виникнути від'ємний баланс.
Зв'яжіться з нами, щоб отримати індивідуальну оцінку вашого проєкту. Замовте розробку системи управління крипто-карткою — ми підготуємо пропозицію за 2 дні.







