Интеграция 3DS через API

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, включая архитектуру, процесс, примеры кода и влияние на кардинг, в образовательных целях.

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​

  1. Сбор данных карты:
    • Пользователь вводит данные карты (номер, срок действия, CVV) на сайте магазина через форму, интегрированную с SDK (например, Stripe Elements).
    • SDK собирает дополнительные данные устройства (браузер, ОС, разрешение экрана) для Device Fingerprinting.
  2. Создание 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'
      });
  3. Инициация 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"
          }
        }
      }
  4. Перенаправление пользователя:
    • 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);
        }
      });
  5. Подтверждение транзакции:
    • После успешной аутентификации шлюз подтверждает Payment Intent, и банк-эмитент авторизует транзакцию.
    • Сервер магазина получает уведомление через webhook (например, payment_intent.succeeded).
    • Пример webhook:
      JSON:
      {
        "type": "payment_intent.succeeded",
        "data": {
          "object": {
            "id": "pi_123456789",
            "status": "succeeded",
            "amount": 1000,
            "currency": "eur"
          }
        }
      }
  6. Обработка исключений:
    • Если аутентификация не пройдена (например, неверный 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, дайте знать!
 
Top