Mutt
Professional
- Messages
- 1,369
- Reaction score
- 912
- Points
- 113
Интеграция 3D-Secure (3DS) через API — это процесс, позволяющий интернет-магазинам и платёжным шлюзам внедрять двухфакторную аутентификацию для повышения безопасности онлайн-транзакций, особенно в контексте требований PSD2 (Payment Services Directive 2) в Европе. 3D-Secure (например, Verified by Visa, MasterCard SecureCode, Amex SafeKey) добавляет дополнительный уровень проверки, требуя от держателя карты подтверждения личности через одноразовый пароль (OTP), биометрию или другие методы. В контексте кардинга это делает использование Non-VBV, Auto-VBV и Non-MCSC бинов крайне сложным, так как без доступа к данным владельца карты (телефон, email, биометрия) транзакция не проходит. Ниже я подробно опишу технические аспекты интеграции 3DS через API, включая архитектуру, процесс, примеры кода и влияние на кардинг, в образовательных целях.
Если вы хотите углубиться в другие аспекты, например, сравнение API Stripe и Adyen для 3DS или создание кастомных правил в Stripe Radar, дайте знать!
1. Что такое 3D-Secure и его роль в API-интеграции
3D-Secure (3DS) — это протокол безопасности, разработанный платёжными системами (Visa, MasterCard, American Express), который добавляет слой аутентификации для онлайн-транзакций. Версия 3DS 2.0 (введена в 2019 году) улучшает пользовательский опыт и поддерживает требования PSD2, включая Strong Customer Authentication (SCA).- Основные элементы 3DS:
- Аутентификация: Подтверждение личности держателя карты (например, OTP через SMS, push-уведомление, биометрия).
- Risk-Based Authentication (RBA): Банк-эмитент анализирует параметры транзакции (IP, устройство, сумма) и решает, требуется ли полная проверка (Challenge) или достаточно автоматического одобрения (Frictionless).
- Интеграция через API: Платёжные шлюзы (например, Stripe, Adyen) предоставляют API для управления 3DS, позволяя магазинам инициировать аутентификацию и обрабатывать результаты.
- Роль в контексте кардинга:
- 3DS требует подтверждения личности, что делает невозможным использование Non-VBV и Non-MCSC бинов без доступа к OTP или биометрии владельца.
- Auto-VBV бины могут пройти Frictionless flow, но только для низкорисковых транзакций, а антифрод-системы часто выявляют подозрительные попытки.
- PSD2 и SCA: В Европе PSD2 требует SCA для большинства онлайн-транзакций, что делает 3DS обязательным, за исключением низкорисковых операций, малых сумм (до €30) или повторяющихся платежей.
2. Технические аспекты интеграции 3DS через API
Интеграция 3DS через API включает взаимодействие между магазином, платёжным шлюзом, банком-эмитентом и платёжной системой. Основные этапы и компоненты:a) Архитектура интеграции
- Клиентская сторона (Frontend):
- Магазин использует JavaScript SDK (например, stripe.js для Stripe) для сбора данных карты и устройства.
- SDK отправляет данные на сервер магазина или напрямую в платёжный шлюз через защищённое соединение (HTTPS/TLS).
- Серверная сторона (Backend):
- Сервер магазина взаимодействует с API платёжного шлюза (например, Stripe, Adyen) через REST API, отправляя данные о транзакции (сумма, валюта, данные карты).
- Шлюз инициирует 3DS, если требуется, и возвращает результат (Frictionless или Challenge).
- Платёжный шлюз:
- Обрабатывает запросы, взаимодействует с банком-эмитентом через платёжные системы (VisaNet, MasterCard).
- Управляет 3DS-протоколом, передавая параметры транзакции и получая ответ (например, одобрение или запрос OTP).
- Банк-эмитент:
- Анализирует параметры транзакции (до 100+ сигналов: IP, устройство, сумма, история) и решает, нужен ли Challenge.
- Предоставляет страницу аутентификации (например, для ввода OTP) или одобряет транзакцию автоматически.
b) Основные API-методы
Платёжные шлюзы предоставляют API для управления 3DS. Например, для Stripe:- Payment Intents API: Управляет жизненным циклом транзакции, включая 3DS.
- Создание Payment Intent: POST /v1/payment_intents
- Подтверждение 3DS: POST /v1/payment_intents/:id/confirm
- Setup Intents API: Используется для сохранения карты для будущих платежей с 3DS-аутентификацией.
- Webhooks: Уведомляют о статусе 3DS (например, payment_intent.authentication_required).
c) Процесс интеграции 3DS
- Сбор данных карты:
- Пользователь вводит данные карты (номер, срок действия, CVV) на сайте магазина через форму, интегрированную с SDK (например, Stripe Elements).
- SDK собирает дополнительные данные устройства (браузер, ОС, разрешение экрана) для Device Fingerprinting.
- Создание Payment Intent:
- Сервер магазина отправляет запрос в API шлюза для создания Payment Intent, указывая сумму, валюту и данные карты (или токен).
- Пример (Stripe API, Node.js):
JavaScript:const stripe = require('stripe')('sk_test_xxx'); const paymentIntent = await stripe.paymentIntents.create({ amount: 1000, // Сумма в центах (€10) currency: 'eur', payment_method: 'pm_card_visa', // Токен карты confirmation_method: 'automatic', return_url: 'https://your-site.com/return' });
- Инициация 3DS:
- Шлюз определяет, требуется ли 3DS (на основе региона, суммы, банка-эмитента и PSD2).
- Если требуется, возвращается статус requires_action с URL для аутентификации.
- Пример ответа:
JSON:{ "id": "pi_123456789", "status": "requires_action", "next_action": { "type": "redirect_to_url", "redirect_to_url": { "url": "https://hooks.stripe.com/3ds2/challenge" } } }
- Перенаправление пользователя:
- Frontend перенаправляет пользователя на страницу банка для ввода OTP, push-уведомления или биометрической проверки.
- Для Stripe это делается через stripe.handleCardAction:
JavaScript:const stripe = Stripe('pk_test_xxx'); stripe.handleCardAction(paymentIntent.client_secret).then(result => { if (result.error) { console.error('3DS failed:', result.error); } else { console.log('3DS completed:', result.paymentIntent); } });
- Подтверждение транзакции:
- После успешной аутентификации шлюз подтверждает Payment Intent, и банк-эмитент авторизует транзакцию.
- Сервер магазина получает уведомление через webhook (например, payment_intent.succeeded).
- Пример webhook:
JSON:{ "type": "payment_intent.succeeded", "data": { "object": { "id": "pi_123456789", "status": "succeeded", "amount": 1000, "currency": "eur" } } }
- Обработка исключений:
- Если аутентификация не пройдена (например, неверный OTP), шлюз возвращает ошибку (requires_action или canceled).
- Если транзакция низкорисковая (Frictionless), 3DS может не запрашиваться.
d) Risk-Based Authentication (RBA)
- 3DS 2.0 использует RBA, анализируя параметры транзакции (IP, устройство, сумма, история) для определения необходимости полной аутентификации:
- Frictionless flow: Низкий риск, транзакция одобряется без OTP (например, повторная покупка в знакомом магазине).
- Challenge flow: Высокий риск, требуется OTP, push-уведомление или биометрия.
- API шлюза передаёт параметры транзакции банку-эмитенту через 3DS-протокол (например, EMV 3-D Secure), который возвращает решение.
e) Токенизация
- После успешной 3DS-аутентификации шлюз генерирует токен для карты, который используется для будущих транзакций (например, подписки).
- Пример: Stripe возвращает payment_method (pm_123), который магазин сохраняет вместо данных карты.
3. Пример интеграции 3DS с API (на основе Stripe)
Ниже приведён пример интеграции 3DS через Stripe API, включая клиентскую и серверную части.a) Клиентская сторона (Frontend, JavaScript)
HTML:
<!DOCTYPE html>
<html>
<head>
<script src="https://js.stripe.com/v3/"></script>
</head>
<body>
<form id="payment-form">
<div id="card-element"></div>
<button type="submit">Pay</button>
</form>
<script>
const stripe = Stripe('pk_test_xxx');
const elements = stripe.elements();
const cardElement = elements.create('card');
cardElement.mount('#card-element');
const form = document.getElementById('payment-form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const { paymentIntent, error } = await stripe.createPaymentMethod({
type: 'card',
card: cardElement,
});
if (error) {
console.error(error);
return;
}
// Отправка payment_method на сервер
const response = await fetch('/create-payment-intent', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ payment_method: paymentIntent.payment_method })
});
const paymentIntentData = await response.json();
if (paymentIntentData.status === 'requires_action') {
const result = await stripe.handleCardAction(paymentIntentData.client_secret);
if (result.error) {
console.error('3DS failed:', result.error);
} else {
console.log('3DS succeeded:', result.paymentIntent);
// Отправка подтверждённого Payment Intent на сервер
await fetch('/confirm-payment-intent', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ payment_intent_id: result.paymentIntent.id })
});
}
} else {
console.log('Payment succeeded:', paymentIntentData);
}
});
</script>
</body>
</html>
b) Серверная сторона (Backend, Node.js)
JavaScript:
const express = require('express');
const stripe = require('stripe')('sk_test_xxx');
const app = express();
app.use(express.json());
app.post('/create-payment-intent', async (req, res) => {
try {
const paymentIntent = await stripe.paymentIntents.create({
amount: 1000, // €10
currency: 'eur',
payment_method: req.body.payment_method,
confirmation_method: 'automatic',
return_url: 'https://your-site.com/return'
});
res.json({
client_secret: paymentIntent.client_secret,
status: paymentIntent.status
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post('/confirm-payment-intent', async (req, res) => {
try {
const paymentIntent = await stripe.paymentIntents.confirm(req.body.payment_intent_id);
res.json({ status: paymentIntent.status });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000, () => console.log('Server running on port 3000'));
c) Webhook для обработки событий
JavaScript:
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(req.body, sig, 'whsec_xxx');
} catch (err) {
return res.status(400).send(`Webhook Error: ${err.message}`);
}
if (event.type === 'payment_intent.succeeded') {
console.log('Payment succeeded:', event.data.object);
// Завершить заказ в магазине
} else if (event.type === 'payment_intent.payment_failed') {
console.log('Payment failed:', event.data.object);
// Уведомить пользователя
}
res.json({ received: true });
});
4. Влияние на кардинг и Non-VBV/Auto-VBV/Non-MCSC бины
Интеграция 3DS через API делает кардинг с использованием Non-VBV, Auto-VBV и Non-MCSC бинов крайне сложным:a) Non-VBV бины
- Проблема для кардеров: В Европе PSD2 требует SCA, и API шлюза (например, Stripe) автоматически инициирует 3DS для большинства транзакций. Non-VBV бины требуют OTP или биометрию, недоступные кардерам.
- Пример: Кардер использует Non-VBV бин (например, 479126, ESL F.C.U.) для покупки в европейском магазине. API Stripe создаёт Payment Intent, инициирует 3DS, перенаправляя на страницу банка для ввода OTP. Без доступа к телефону владельца транзакция отклоняется.
- Исключения: Для низкорисковых транзакций (до €30) 3DS может не запрашиваться (Frictionless flow), но антифрод-системы (например, Stripe Radar) анализируют IP, устройство и поведение, блокируя подозрительные попытки.
b) Auto-VBV бины
- Проблема для кардеров: Auto-VBV бины могут пройти Frictionless flow, если транзакция низкорисковая, но API передаёт параметры (IP, устройство) банку-эмитенту, который может запросить Challenge для подозрительных операций.
- Пример: Кардер использует Auto-VBV бин (например, 440393, Bank of America) с IP из России. API Stripe инициирует 3DS, и банк требует OTP из-за несоответствия геолокации, что делает транзакцию невозможной.
c) Non-MCSC бины
- Проблема для кардеров: Аналогично Non-VBV, Non-MCSC бины сталкиваются с 3DS-проверками через API, требующими SCA. Без OTP или биометрии транзакция не проходит.
- Пример: Non-MCSC бин (например, 523236, Santander Consumer Bank) отклоняется, если API шлюза инициирует 3DS, а кардер не может предоставить код.
d) Card Testing
- Кардеры часто тестируют карты через мелкие транзакции ($1–$5). API шлюза интегрируется с антифрод-системами (например, Stripe Radar), которые выявляют:
- Многократные попытки с одной карты/IP.
- Подозрительные паттерны (например, одноразовые email, VPN).
- Пример: Кардер тестирует Non-VBV бин через 5 транзакций по $1. API Stripe передаёт данные в Radar, который блокирует карту после 2–3 попыток.
e) Обход 3DS
- Кардеры пытаются обойти 3DS, используя:
- Чистые IP: Прокси/VPN, соответствующие региону карты.
- Поддельные данные: Точные данные держателя из утечек.
- Социальная инженерия: Сброс 3DS-пароля через банк.
- Контрмеры API:
- API шлюза передаёт параметры для RBA, включая IP, устройство и поведение, что позволяет банку выявлять аномалии.
- Антифрод-системы (например, Device Fingerprinting) обнаруживают VPN/Tor или подозрительные устройства.
- Попытки сброса пароля часто приводят к блокировке карты банком.
5. Технические особенности и преимущества
- Скорость: 3DS через API обрабатывается за <100 мс (анализ RBA), минимизируя задержки.
- Гибкость: Dynamic 3DS позволяет пропускать аутентификацию для низкорисковых транзакций, улучшая UX.
- Безопасность: Данные карты токенизируются, а передача осуществляется через HTTPS/TLS.
- Соответствие PSD2: API шлюзов (Stripe, Adyen) поддерживает SCA, что делает их обязательными для Европы.
- Интеграция с антифрод-системами: API передаёт данные в системы, такие как Stripe Radar, для дополнительного анализа.
6. Ограничения и вызовы
- Ложные срабатывания: Слишком строгие настройки 3DS могут блокировать легитимные транзакции, особенно для международных клиентов.
- Сложность интеграции: Требуется настройка frontend и backend, включая обработку вебхуков и ошибок.
- Зависимость от банка-эмитента: Некоторые банки (особенно вне ЕЭЗ) плохо поддерживают 3DS 2.0, что может привести к отказам.
- Пользовательский опыт: Challenge flow (OTP, биометрия) может отпугнуть клиентов, если применяется слишком часто.
7. Заключение
Интеграция 3D-Secure через API (например, Stripe Payment Intents) обеспечивает безопасную обработку транзакций, соответствуя требованиям PSD2 и предотвращая кардинг. API позволяет магазинам инициировать 3DS, обрабатывать Frictionless и Challenge flows, и интегрироваться с антифрод-системами, такими как Stripe Radar. Для кардеров это создаёт серьёзные препятствия: Non-VBV и Non-MCSC бины требуют OTP или биометрию, Auto-VBV бины блокируются при высоком риске, а попытки обхода (VPN, поддельные данные) выявляются через анализ IP, устройств и поведения. Технические особенности, такие как токенизация, RBA и вебхуки, делают 3DS через API мощным инструментом защиты, особенно в Европе, где PSD2 делает SCA обязательной.Если вы хотите углубиться в другие аспекты, например, сравнение API Stripe и Adyen для 3DS или создание кастомных правил в Stripe Radar, дайте знать!