Безопасность платежей на сайте: что внедрить, чтобы защитить оплату

Безопасность платежей на сайте начинается с правильного разделения ролей: покупатель вводит реквизиты в защищённой форме провайдера, сайт получает подтверждённый статус на сервере, а товар или доступ выдаётся только после этой проверки. Не подтверждайте заказ по странице «Оплата успешна» и не принимайте реквизиты карты в чате, CRM или самописной форме.

Кому пригодится эта схема: интернет-магазинам с предоплатой и возвратами, сервисам с подписками и рекуррентными списаниями, а также продавцам цифровых товаров и онлайн-услуг. Для всех трёх моделей критичны серверная сверка статуса, защита от повторных уведомлений и понятный порядок возврата или спора.

Рабочая цепочка: клиент выбирает оплату → открывает форму провайдера → проходит нужный сценарий аутентификации → провайдер отправляет уведомление на сервер → сервер проверяет его и статус операции → заказ получает статус «оплачен» → при необходимости формируется кассовый чек. Каждый шаг должен иметь владельца: разработчика, менеджера заказов, бухгалтера или сотрудника, который разбирает спорные платежи.

Где возникают риски: три сценария оплаты

Интернет-магазин с доставкой или самовывозом

Выдавайте заказ в сборку после подтверждения оплаты на сервере. Возврат проводите через платёжный сервис, затем сверяйте его со статусом заказа и кассовым документом. Схему оплаты и чеков для интернет-торговли разберите в статье «Онлайн-касса для интернет-магазина: выбор, подключение и запуск».

Сервис с подпиской

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

Цифровые товары и онлайн-услуги

Открывайте доступ к файлу, ключу или личному кабинету только после подтверждённого статуса платежа. Для рискованных заказов настройте ручную проверку по правилам антифрода; не просите покупателя присылать номер карты или код безопасности в переписке.

Базовый контур защиты: что настроить один раз

Передайте карточную форму провайдеру. Выбирайте платёжную страницу провайдера или его защищённый виджет. Тогда ваш сайт не принимает номер карты, срок действия и CVV/CVC, а в CMS, CRM и логах остаются только данные заказа и идентификатор операции.

Проверьте 3-D Secure в реальных сценариях интеграции. Не ставьте задачу «включить 3-D Secure всегда»: решение об аутентификации принимает платёжная инфраструктура и банк-эмитент в конкретной операции. Протестируйте, как сайт обрабатывает успешный frictionless-сценарий, challenge с подтверждением, отказ и тайм-аут. Во всех неуспешных сценариях заказ должен остаться неоплаченным.

Настройте антифрод как процесс. Начните с лимита попыток оплаты с одного IP-адреса, устройства или карты, уведомлений о всплеске отказов, контроля необычно крупных сумм и ручной проверки части рискованных заказов. Сразу назначьте сотрудника и срок проверки: например, он подтверждает или отменяет подозрительный заказ до передачи в доставку.

Запросите подтверждение PCI DSS и разграничьте ответственность. Попросите у провайдера действующий документ о соответствии PCI DSS: Attestation of Compliance либо письмо, где указана область соответствия. В договоре или регламенте зафиксируйте, где размещена платёжная форма, кто обрабатывает карточные данные и токены, кто уведомляет об инцидентах, как передаются webhook и кто готовит материалы по чарджбэку. PCI DSS провайдера не заменяет защиту аккаунтов сотрудников, обновления сайта и контроль доступа к API-ключам.

Как выбрать платёжную ссылку, виджет или API

Платёжная ссылка подходит для ручных счетов, заявок из мессенджеров и быстрого старта без доработки сайта. Виджет выбирайте для стандартной формы оплаты в корзине: покупатель остаётся в интерфейсе магазина, а карточные данные обрабатывает провайдер. API требуется для подписок, личного кабинета, сложных статусов, разделения оплат и тесной связки с CRM, складом и кассой.

Критерий Что запросить или проверить Решение для бизнеса
Форма оплаты Где вводятся реквизиты и какие данные попадут в ваш контур Ссылка — для ручных оплат; виджет — для стандартной корзины; API — для сложной логики
3-D Secure Поддержку и статусы frictionless, challenge, отказа, тайм-аута в тестовой среде Не переводить заказ в «оплачен» при любом незавершённом сценарии
PCI DSS Attestation of Compliance или письмо с областью соответствия; границы ответственности Не хранить реквизиты карты и CVV/CVC в своих системах
Webhook и API HTTPS, подпись или секрет, документацию по повторам и запросу статуса Выбирать API, если нужны подписки, CRM-статусы или нестандартная логика
Антифрод и споры Лимиты, фильтры, отчёты, порядок возвратов и сроки ответа по спору Назначить владельца процесса и хранить доказательства исполнения заказа
Касса и ОФД Передачу состава заказа, контакта покупателя, возвратов и защиту от дублей Проверить на тестах: один расчёт — один чек, возврат — отдельный корректный сценарий

Webhook: технический минимум, без которого заказ не исполняют

Страница успеха в браузере не подтверждает оплату. Источник истины — серверное уведомление провайдера и, при необходимости, запрос статуса операции через его API.

  1. Принимайте webhook только по HTTPS. Не передавайте секреты, API-ключи и содержимое уведомлений в открытые логи или клиентский JavaScript.
  2. Проверьте подпись или секрет. Используйте способ из документации провайдера: подпись заголовка, HMAC, секретный ключ или иной предусмотренный механизм. Уведомление без валидной проверки не меняет статус заказа.
  3. Сопоставьте данные операции. Сверьте payment ID, номер заказа, сумму, валюту и итоговый статус с записью о платеже, созданной в вашей системе.
  4. Сделайте обработку идемпотентной. Один payment ID должен исполниться один раз. Повторный webhook не должен повторно выдать доступ, создать вторую отгрузку или сформировать ещё один чек.
  5. Обработайте расхождение безопасно. Если сумма, валюта, заказ или подпись не совпали, не исполняйте заказ. Запросите статус через API, сохраните событие в журнале и передайте случай в поддержку провайдера.

Пошаговый запуск безопасной оплаты

  1. Нарисуйте карту потока. Укажите сайт, форму оплаты, провайдера, CRM, кассу, ОФД и отправку чека. Для каждого узла перечислите передаваемые данные и ответственного.
  2. Выберите тип интеграции. Используйте ссылку для быстрого старта, виджет для стандартной оплаты на сайте или API для подписок и сложных процессов.
  3. Настройте серверные статусы. Создайте правила для успешной оплаты, отказа, отмены, возврата и повторного webhook. Статус «оплачен» присваивайте после проверенного уведомления или подтверждения через API.
  4. Подключите защитные правила. Ограничьте подозрительные серии попыток, настройте уведомления и маршрут ручной проверки.
  5. Свяжите оплату с кассой. Передавайте в кассу состав заказа, сумму, контакт покупателя и необходимые параметры расчёта. О схеме подключения читайте в материале «Интеграция облачной кассы с 1С: схема подключения, запуск и контроль чеков». Официальные разъяснения по применению ККТ публикует сайт ФНС России.
  6. Проведите тесты. Проверьте frictionless и challenge при наличии таких тестовых сценариев у провайдера, отказ, тайм-аут, отмену, полный и частичный возврат, дубль webhook и недоступность кассы.
  7. Сверяйте операции после старта. Ежедневно сопоставляйте платежи, статусы заказов, возвраты и чеки. Причины отказов и спорные операции разбирайте в день их появления.

Ошибки, которые приводят к потерям

Ошибка: заказ выдаётся после редиректа. Исправление: выдавайте товар или доступ только после серверной проверки webhook и статуса платежа.

Ошибка: webhook принимается без проверки подписи. Исправление: валидируйте подпись или секрет, сопоставляйте параметры с заказом и при расхождении запрашивайте статус через API.

Ошибка: повторное уведомление создаёт дубль. Исправление: привяжите payment ID к операции и сделайте обработчик идемпотентным.

Ошибка: тестируется только успешная оплата. Исправление: добавьте в приёмку отказ, тайм-аут, возврат, повторный webhook и сбой связи с кассой.

Ошибка: никто не отвечает за антифрод и чарджбэки. Исправление: назначьте владельца процесса, настройте уведомления и храните заказ, логи, согласия и подтверждение доставки в одной карточке случая.

Чеклист перед запуском приёма оплат

  • Реквизиты карты вводятся на странице или в виджете провайдера, а не в самописной форме сайта.
  • Проверены сценарии 3-D Secure: successful/frictionless, challenge, отказ и тайм-аут — в объёме, который доступен в тестовой среде провайдера.
  • Webhook принимается по HTTPS; подпись или секрет проверяются на сервере.
  • Перед исполнением заказа сопоставляются payment ID, заказ, сумма, валюта и статус операции.
  • Повторное уведомление не создаёт вторую отгрузку, доступ или чек.
  • При спорном уведомлении заказ не исполняется до проверки статуса через API.
  • Получено подтверждение PCI DSS провайдера и зафиксированы зоны ответственности сторон.
  • Настроены антифрод-правила, уведомления и ответственный за рискованные заказы и споры.
  • Протестированы отмена, полный и частичный возврат, а также связка оплаты с кассой и ОФД.

Проверка схемы оплаты, кассы и возвратов

Команда «Интернет Касса» помогает интернет-магазинам, сервисам подписки и продавцам онлайн-услуг подготовить запуск приёма оплат. На разборе проверим карту потока, платёжную форму, webhook и статусы, защиту от дублей, возвраты, связку с кассой и передачу чеков. По итогам вы получите список критичных ошибок, порядок доработок и схему ответственных по этапам.

Запросить разбор платёжного потока.

Частые вопросы

Нужно ли интернет-магазину включать 3-D Secure?

Да, выберите провайдера с поддержкой 3-D Secure и протестируйте обработку его результатов. Аутентификация не запрашивается при каждой операции: сайт должен корректно обработать frictionless-сценарий, challenge, отказ и тайм-аут, не выдавая заказ без подтверждённой оплаты.

Достаточно ли PCI DSS для безопасности платежей?

Нет, соответствие PCI DSS не защищает ваш сайт и бизнес-процессы автоматически. Используйте форму провайдера, проверяйте webhook на сервере, ограничьте доступы и настройте антифрод с обработкой возвратов и споров.

Можно ли принимать оплату без хранения данных карты на своём сайте?

Да, передайте ввод карты на платёжную страницу или в защищённый виджет провайдера. В своей системе храните идентификатор платежа, номер заказа, сумму, валюту, статус и технические логи без карточных реквизитов и CVV/CVC.

Что проверять у платёжного провайдера перед подключением?

Проверьте форму оплаты, 3-D Secure, webhook, антифрод, возвраты, споры, отчёты и тестовую среду. Запросите действующее подтверждение PCI DSS — например, Attestation of Compliance или письмо с областью соответствия — и закрепите в договоре, кто отвечает за карточные данные, токены, инциденты, уведомления и документы по чарджбэку.

Что делать, если webhook сообщает об оплате с другой суммой или валютой?

Не исполняйте заказ и запросите статус платежа через API провайдера. Сверьте payment ID, номер заказа, сумму и валюту с созданной операцией; расхождение передайте в поддержку провайдера и зафиксируйте в журнале инцидентов.