Настройка покупки криптовалюты через банковскую карту
Покупка крипто через банковскую карту — самый распространённый on-ramp путь для розничных пользователей. Технически это самый сложный вариант: нужен платёжный процессор, антифрод система, 3DS-аутентификация и специальные условия для крипто-мерчантов.
Архитектура карточного платежа
Карточная транзакция проходит через несколько систем:
Payment Gateway (Stripe, Adyen, Checkout.com) — принимает данные карты, инициирует авторизацию. Для крипто нужен специальный MCC (Merchant Category Code) или партнёр, готовый работать с crypto purchases.
Acquiring Bank — банк мерчанта, обрабатывает авторизацию через платёжные сети.
Card Networks (Visa, Mastercard) — маршрутизация и стандарты безопасности.
Issuing Bank — банк держателя карты, принимает/отклоняет транзакцию.
3DS2 аутентификация
3D Secure версии 2 — обязательный стандарт в ЕС (PSD2 SCA) и де-факто стандарт для снижения chargeback-рисков:
// Stripe Elements + 3DS2
import { loadStripe } from '@stripe/stripe-js';
const stripe = await loadStripe(process.env.STRIPE_PUBLIC_KEY);
async function handleCardPayment(cardElement, amount, currency, walletAddress) {
// Создаём PaymentIntent на сервере
const { clientSecret } = await fetch('/api/create-payment-intent', {
method: 'POST',
body: JSON.stringify({ amount, currency, walletAddress })
}).then(r => r.json());
// Подтверждаем платёж с 3DS если требуется
const { paymentIntent, error } = await stripe.confirmCardPayment(clientSecret, {
payment_method: { card: cardElement }
});
if (error) {
return { success: false, error: error.message };
}
if (paymentIntent.status === 'requires_action') {
// 3DS challenge — Stripe автоматически показывает popup
// После завершения stripe вернёт обновлённый paymentIntent
}
if (paymentIntent.status === 'succeeded') {
return { success: true, paymentIntentId: paymentIntent.id };
}
}
Серверная часть: PaymentIntent
import stripe
stripe.api_key = settings.STRIPE_SECRET_KEY
@app.post("/api/create-payment-intent")
async def create_payment_intent(request: PaymentRequest, user: User = Depends(get_current_user)):
# Валидация
if request.amount < 10:
raise HTTPException(400, "Minimum amount is $10")
if request.amount > user.daily_limit_remaining:
raise HTTPException(400, "Daily limit exceeded")
# Создаём PaymentIntent с метаданными
intent = stripe.PaymentIntent.create(
amount=int(request.amount * 100), # в центах
currency=request.fiat_currency.lower(),
metadata={
"user_id": str(user.id),
"crypto_currency": request.crypto_currency,
"wallet_address": request.wallet_address,
"order_id": str(uuid.uuid4()),
},
# Обязательно для SCA compliance в EU
payment_method_options={
"card": {"request_three_d_secure": "automatic"}
}
)
return {"clientSecret": intent.client_secret}
Fraud Prevention
Крипто-транзакции по картам имеют высокий риск мошенничества. Стандартные защитные меры:
Velocity checks — лимиты на количество транзакций:
- Не более 3 транзакций с одной карты за 24 часа
- Не более 5 разных карт с одного IP за неделю
- Суточный лимит на аккаунт (например, $1000)
Device fingerprinting — уникальный идентификатор устройства. Одно устройство, разные аккаунты — подозрительно.
Address verification — AVS (Address Verification System): сравнение биллинг-адреса с данными банка.
Email/phone verification — подтверждение перед первой транзакцией.
Delayed delivery для новых пользователей — первые 1-3 транзакции с задержкой 24-48 часов.
Stripe Radar для автоматического фрод-фильтра
# Кастомные правила в Stripe Radar через metadata
intent = stripe.PaymentIntent.create(
...
metadata={
"account_age_days": str((datetime.now() - user.created_at).days),
"total_purchases": str(user.total_purchases_count),
"kyc_verified": str(user.is_kyc_verified),
}
)
# В Stripe Dashboard добавляем Radar правила:
# BLOCK если account_age_days < 3 И amount > 200
# REVIEW если total_purchases < 2 И amount > 500
Chargeback Management
При chargeback по карточному платежу:
- Автоматически блокируем аккаунт пользователя
- Замораживаем переводы крипто если ещё не доставлены
- Собираем доказательства для диспута: IP-логи, KYC данные, blockchain confirmation
- Подаём Representment через платёжный процессор
Stripe предоставляет инструмент для сбора доказательств. Выигрышные диспуты требуют: скриншот KYC верификации, IP совпадение с геолокацией, blockchain proof доставки крипто, подтверждение wallet ownership подписью.
Средний chargeback rate для крипто-платежей: 0.5–2%. Для Stripe это означает риск потери аккаунта при превышении 1%. Поэтому агрессивный фрод-фильтр важнее конверсии.







