Авторизация платежа и фактическое списание средств — это два строго разделенных этапа в работе платежной системы. Авторизация подтверждает наличие средств у клиента, но деньги остаются на его счете до момента списания. Списание происходит после успешной доставки товара или услуги. Разделение этих процессов критично для безопасности: если авторизация прошла успешно, а товар не был доставлен, средства должны быть возвращены (рефанд). Смешивание этих этапов ведет к потере денег клиентов и блокировке терминалов.

Разделение авторизации и списания: архитектура процесса

Процесс онлайн-оплаты состоит из двух независимых транзакций. Первая — авторизация (Authorization). Она проверяет валидность карты, срок действия, наличие средств и блокирует сумму на счете держателя. Вторая — списание (Capture), которое переводит деньги со счета клиента на расчетный счет продавца. Между этими этапами может пройти от нескольких минут до нескольких дней.

Почему это важно разделять: если вы сразу списываете деньги при авторизации, у вас нет времени на возврат средств в случае отказа клиента или возврата товара. Это нарушает правила большинства платежных систем (Visa/Mastercard) и ведет к штрафам. Архитектура должна предусматривать хранение статуса транзакции и возможность отмены блокировки.

Как это работает технически: при нажатии кнопки «Оплатить» система отправляет запрос на авторизацию. Получив ответ «Успешно», вы сохраняете ID транзакции. Товар доставляется клиенту. Когда товар передан, вы инициируете списание по сохраненному ID. Если доставка не состоялась, вы делаете рефанд (возврат) до истечения срока действия авторизации (обычно 7–14 дней).

Выбор модели взаимодействия с банком (эквайринг)

Для реализации разделения процессов необходимо выбрать правильный тип эквайринга. Существует три основные модели:

1. Полное списание (Capture). Банк сразу переводит деньги после подтверждения оплаты. Подходит для товаров с мгновенной доставкой, но не позволяет делать возвраты без сложных процедур рефанда.

2. Авторизация + Списание (Authorization + Capture). Вы получаете подтверждение наличия средств, а списание инициируете позже. Это стандартная модель для e-commerce и услуг. Требует хранения данных транзакций в вашей базе данных.

3. Подтвержденный авторизованный статус (Pre-Authorized). Банк держит деньги на счету клиента до момента отправки товара. После доставки вы даете команду на списание. Если товар не доставлен, банк автоматически снимает блокировку через рефанд.

Рекомендация: для большинства интернет-магазинов и сервисов выбирайте модель «Авторизация + Списание». Она дает время на обработку возвратов и соответствует правилам безопасности.

Настройка токенизации для безопасности

При разделении процессов вы не должны хранить данные карт (PAN, CVV) в своей базе данных. Это запрещено стандартами PCI DSS и ведет к огромным штрафам при утечке.

Решение — токенизация. Платежный шлюз заменяет чувствительные данные карты на короткий токен (например, «tok_12345»). Этот токен уникален для одной карты и одного магазина. Вы передаете токен платежной системе для списания, не раскрывая номер карты.

Как настроить: интегрируйте API токенизации в форму оплаты. При успешной авторизации сохраните только токен и ID транзакции. Для повторного списания используйте тот же токен. Это гарантирует, что даже если база данных будет взломана, злоумышленники не смогут использовать украденные токены для покупки товаров у других продавцов.

Логика обработки отказов и повторных попыток

При авторизации или списании могут возникать ошибки: карта заблокирована, превышен лимит, ошибка сети. Важно не терять деньги клиента при этом.

Алгоритм действий при ошибке:

— Если ошибка временная (например, таймаут), повторите запрос через 1–2 секунды. Не делайте это бесконечно — это может заблокировать аккаунт в платежной системе.

— Если ошибка связана с банком клиента или мошенничеством, предложите клиенту использовать другую карту или способ оплаты.

— Если авторизация прошла успешно, а списание отклонено (например, из-за изменения лимита), немедленно инициируйте рефанд. Не оставляйте деньги «висеть» в статусе Pending дольше 24 часов без проверки.

Пример: клиент оплатил товар на 5000 рублей. Через час банк сообщил об ошибке списания. Вы автоматически вернули деньги (рефанд) и уведомили клиента о необходимости повторной оплаты.

Юридические требования к разделению данных

Разделение процессов регулируется законодательством о защите персональных данных (например, 152-ФЗ в РФ) и международными стандартами PCI DSS.

Основные требования:

— Не передавайте данные карты третьим лицам без согласия клиента.

— Храните только токены, а не полные номера карт.

— Разделите базы данных: информация о заказах и платежные транзакции должны храниться в разных системах с разным уровнем доступа.

— Получайте согласие клиента на обработку данных при оформлении заказа. Укажите, что данные передаются платежному шлюзу для обработки оплаты.

Техническая реализация через API платежных систем

Интеграция с платежным шлюзом (например, CloudPayments, ЮKassa, Stripe) осуществляется через REST API. Каждый запрос имеет свой метод:

— POST /authorize — инициирует авторизацию.

— POST /capture — инициирует списание по ID авторизации.

— POST /refund — возвращает деньги (рефанд).

Ваш код должен сохранять ответы API в базе данных. Используйте вебхуки (webhooks) от платежной системы для получения уведомлений о статусе транзакций. Это позволит автоматически обновлять статус заказа в вашей системе без участия пользователя.

Пример кода (псевдокод):

// Авторизация

let authResponse = paymentGateway.authorize(token, amount);

if (authResponse.success) {

saveTransaction(authResponse.id, 'authorized');

}

// Списание через 24 часа после доставки товара

let captureResponse = paymentGateway.capture(authResponse.id, amount);

if (!captureResponse.success) {

// Обработка ошибки или рефанд

}

Мониторинг статусов транзакций

Платежные системы могут возвращать разные статусы: «Успешно», «Отклонено», «В обработке», «Ожидает списания». Важно настроить мониторинг этих статусов.

Используйте аналитику для отслеживания:

— Коэффициента успеха авторизаций (обычно 95–98%).

— Коэффициента успешных списаний после авторизации.

— Частоты отказов из-за мошенничества или технических сбоев.

Если вы видите резкий рост отказов, проверьте логи платежного шлюза и настройки безопасности. Не игнорируйте статусы «Pending» — они могут указывать на проблемы с банком клиента.

Ошибки при смешивании процессов

Самая частая ошибка — попытка списать деньги сразу после авторизации без проверки статуса доставки товара. Это приводит к тому, что клиент платит дважды: один раз за товар, который не получил, и второй раз при повторной оплате.

Другие ошибки:

— Игнорирование сроков действия авторизации. Если рефанд не сделан вовремя, банк может автоматически списать деньги, и вы потеряете их.

— Хранение данных карт в собственной базе данных без токенизации. Это нарушает PCI DSS и ведет к блокировке аккаунта.

— Отсутствие обработки вебхуков. Если платежная система сообщает об успешном списании, а ваша система этого не видит, вы можете дважды отправить товар клиенту или дважды выставить счет.

Вопросы и ответы

Можно ли использовать одну транзакцию для авторизации и списания?

Нет. В платежных системах это два разных процесса. Авторизация подтверждает наличие средств, а списание переводит их на ваш счет. Смешивание этих процессов нарушает правила безопасности.

Что делать, если клиент отказывается от товара после авторизации?

Немедленно инициируйте рефанд (возврат средств). Это можно сделать через API платежной системы. Деньги вернутся на счет клиента в течение 2–7 рабочих дней.

Нужно ли хранить ID транзакций в базе данных?

Да, обязательно. ID транзакции нужен для повторного списания или возврата средств. Храните только токен и статус, а не данные карты.

По теме

// Пример авторизации и списания через API
async function processPayment(token, amount) {
  // Шаг 1: Авторизация
  const authResponse = await paymentGateway.authorize({
    token,
    amount,
    currency: 'RUB'
  });

  if (!authResponse.success) {
    throw new Error('Авторизация не прошла');
  }

  // Сохраняем ID транзакции и токен
  await db.saveTransaction({
    id: authResponse.id,
    token,
    status: 'authorized',
    amount
  });

  // Шаг 2: Списание (через 24 часа после доставки товара)
  const captureResponse = await paymentGateway.capture({
    transactionId: authResponse.id,
    amount
  });

  if (!captureResponse.success) {
    // Обработка ошибки или рефанд
    await db.saveTransaction({
      id: authResponse.id,
      status: 'failed'
    });
    return;
  }

  // Успешное списание
  await db.updateTransactionStatus(authResponse.id, 'captured');
}

// Пример рефанда
async function refundPayment(transactionId) {
  const refundResponse = await paymentGateway.refund({
    transactionId,
    amount: 'full'
  });

  if (refundResponse.success) {
    await db.updateTransactionStatus(transactionId, 'refunded');
  }
}