API‑интеграция: сервер‑сервер, подписи, webhooks и идемпотентность
Зачем бизнесу S2S‑подход
API интеграция оплаты на модели сервер‑сервер (Server‑to‑Server, S2S) дает полный контроль над платежными потоками: вы формируете платежи на бэкенде, подписываете запросы, принимаете webhooks и самостоятельно управляете UX. Это подходит, когда нужна кастомная логика, сложные статусы, собственная антифрод‑сигнализация, а также при работе с маркетплейсами и выплатами.
Если вы только выбираете провайдера, начните со сравнения условий и возможностей: Выбор платежного провайдера. А если нужна быстрая интеграция без кода, посмотрите готовые коннекторы для CMS в разделе ниже.
![Схема потоков S2S оплаты — placeholder]
Сервер‑сервер модель: базовый поток
Базовый S2S‑поток оплаты состоит из нескольких шагов:
- Ваш сервер создает у провайдера сущность «платеж» (или «интенция») через API.
- Клиент проходит аутентификацию в банке (3‑D Secure/Challenge), редиректится на провайдера и обратно или остаётся в вашей веб‑вью.
- Провайдер отправляет webhook с результатом (async статус платежа).
- Вы подтверждаете/фиксируете заказ и отдаёте пользователю итоговый экран.
Синхронный ответ API обычно не финальный — итог фиксируется webhook’ом. Поэтому важны идемпотентность платежей, корректная обработка повторной доставки и порядок событий.
Синхронно vs асинхронно
| Характеристика |
Синхронный ответ API |
Webhook (асинхронно) |
| Когда приходит |
Сразу после запроса |
Через секунды/минуты |
| Что означает |
Предварительный статус (created/pending) |
Финальный статус (succeeded/failed/refunded) |
| Надёжность |
Может потеряться при сетевой ошибке |
Поддерживает ретраи от провайдера |
| Рекомендация |
Не полагаться как на «истину» |
Хранить как источник истины |
Подробнее о вариациях UX и конверсии — в материале Checkout UX и конверсия.
Сущности: платеж и заказ
Разделяйте бизнес‑сущность «заказ» и платежную «платеж». Это упрощает повторные попытки, частичные возвраты и мультисплит.
| Сущность |
Назначение |
Ключевые поля |
Примечания |
| Заказ |
Что покупает клиент |
order_id, позиции, суммы, налоги |
Может жить без платежа |
| Платеж |
Как оплачивает клиент |
payment_id, метод, статус |
Может быть несколько на один заказ |
В API держите связь через order_id и внешние идентификаторы мерчанта (merchant_order_id). Это облегчает аудит и восстановление после сбоев.
Подпись запросов и подпись webhooks
Критично проверять подлинность всех сообщений: и исходящих к провайдеру, и входящих webhooks. Чаще используются HMAC‑SHA256 или RSA.
Рекомендации:
- Храните секреты для подписи в хранилищах секретов (KMS, Vault), с ротацией ключей.
- Подписывайте не только тело, но и канонизированный набор заголовков и таймстамп, чтобы защититься от повторов.
- Для каждой версии ключа храните key_id (kid), чтобы принимать ротацию без даунтайма.
Пример проверки HMAC подписи webhook (псевдокод):
function verifyWebhook(signatureHeader, timestampHeader, body, secret) {
if (abs(now() - timestampHeader) > 300) return false; // 5 минут
const base = timestampHeader + "." + canonicalize(body)
const expected = HMAC_SHA256(base, secret)
return timingSafeEqual(expected, signatureHeader)
}
Больше про общую безопасность: PCI DSS, 3DS и антифрод.
Идемпотентность платежей и ключи
Идемпотентность платежей защищает от двойного списания из‑за повторной отправки запроса (повтор клика, сетевой таймаут, ретраи). Используйте заголовок Idempotency‑Key или уникальный request_id на уровне create/payment.
Правила:
- Генерируйте уникальный ключ на каждое намерение оплаты (UUIDv4), привязывайте к order_id.
- Кэшируйте результат в провайдере и у себя, чтобы повторный запрос возвращал тот же payment_id и статус.
- Для небезопасных повторов (например, при изменении суммы) возвращайте конфликт.
Мини‑пример запроса:
POST /payments
Headers: Idempotency-Key: 3f01c2d0-...
Body: {"order_id":"12345","amount":1000,"currency":"RUB"}
Webhooks: доставка, порядок, безопасность
Принимайте webhooks как «источник истины» по статусу. Ключевые моменты:
- Доставка минимум «по крайней мере один раз». Готовьте идемпотентные хэндлеры.
- Порядок не гарантирован. Сравнивайте версионность (event_id/sequence) или храните дерево статусов.
- Подпись webhooks обязательна. См. раздел про «подпись webhooks» выше.
- Возвращайте 2xx только после успешной фиксации статуса в вашей БД.
- Если вы не можете обработать, верните 5xx — провайдер повторит.
Рекомендуемая структура события:
- event_type (payment.succeeded, payment.failed, refund.succeeded)
- payment_id, order_id
- amount, currency, method
- status_changed_at (UTC)
- signature, kid
Очереди сообщений, ретраи и таймауты
Надёжность обеспечивается архитектурой:
- Очереди сообщений (RabbitMQ/Kafka/SQS) между веб‑воркерами и бизнес‑логикой. Это защищает от всплесков webhooks.
- Ретраи и таймауты: используйте экспоненциальный backoff, дед‑леттер очередь для событий, которые не удаётся обработать.
- Таймауты HTTP: клиент → провайдер 10–30с; провайдер → ваш приемник webhooks 5–10с.
- Лимит попыток: например, 5 быстрых, затем 10 отложенных (1м, 5м, 15м…).
С помощью очередей вы отделяете приём webhooks (легковесный эндпоинт) от «тяжёлой» доменной логики (актуализация заказов, фискализация, e‑mail).
Хранение токенов и безопасность
Если вы храните токены карт или платежные токены для подписок, соблюдайте минимум:
- Никогда не храните PAN/CVV. Работайте с токенами провайдера.
- Ограничьте доступ к токенам по принципу наименьших прав. Шифруйте в at‑rest и в транзите.
- Делайте регулярную ротацию ключей и аудит доступа.
Для подписок и рекуррентных сценариев см. раздел Рекуррентные платежи и подписки. Если планируете мобильную оплату, посмотрите Мобильные SDK iOS/Android и Банковские карты, Apple Pay/Google Pay.
Фискализация, возвраты и статусы
В России онлайн‑касса обязательна. При S2S интеграции вы либо делегируете фискализацию провайдеру, либо отправляете данные в ОФД самостоятельно. Подробнее: Онлайн‑касса, 54‑ФЗ и фискализация.
Возвраты и чарджбеки:
Async статус платежа должен синхронизироваться с вашими состояниями заказа: paid, canceled, refunded, partial_refunded.
Тестирование и запуск в прод
Работайте через песочницу: создайте автотесты для ключевых потоков, мокируйте сетевые сбои и задержки webhooks. Полный гайд: Тестирование, sandbox, webhooks и запуск.
Чек‑лист перед запуском:
- Проверка идемпотентности всех write‑методов
- Ротация и валидация ключей подписи
- Интеграционные тесты с 3‑D Secure/Challenge
- Маскировка PII и логирование без платежных данных
- Нагрузочное тестирование webhooks
Также оцените комиссии и экономику: Тарифы и комиссии: эквайринг. При трансграничной работе — Мультивалюта, налоги, валютконтроль.
Интеграции с CMS/SDK и сценарии
Если нужен быстрый старт, существуют готовые модули:
Для сложной логистики или сплит‑платежей посмотрите Маркетплейсы, SaaS и white‑label. Если вы только начинаете — вот краткое руководство: Как подключить платежную систему.
Мониторинг и чек‑лист best practices интеграции
Метрики и алерты:
- Доля успешной обработки webhooks (2xx) > 99.9%
- Задержка доставки «платеж → финальный статус» (p95)
- Количество ретраев, размер дед‑леттер очереди
- Несоответствия статусов «у нас» vs «у провайдера»
- Частота таймаутов и сетевых ошибок
Best practices интеграции:
- Используйте идемпотентность для всех операций изменения состояния.
- Делайте подпись webhooks и верификацию на стороне сервера.
- Храните «сущности платеж заказ» раздельно и связывайте через внешние ключи.
- Вводите «окно согласования» (grace period) для отложенных статусов.
- Используйте очереди сообщений и изолируйте критичные участки.
- Реализуйте экспоненциальный backoff для ретраев и лимитируйте таймауты.
- Логи структурируйте: request_id, payment_id, order_id, event_id.
- Документируйте контракты API и версии; вносите изменения через v2/v3.
Короткий пример потока S2S
- create payment (идемпотентно)
- получить client_action (redirect/3DS)
- ожидать async статус платежа через webhook
- зафиксировать заказ, запустить фискализацию
- отправить чек/уведомление клиенту
- при ошибке — инициировать повторную попытку или альтернативный метод (например, СБП)
Вывод и следующий шаг
API интеграция оплаты по модели сервер‑сервер дает гибкость и контроль, но требует дисциплины: подпись запросов и подпись webhooks, идемпотентность платежей, очереди сообщений, ретраи и таймауты, безопасное хранение токенов и проработанный async статус платежа. Следуйте best practices интеграции, подключайте мониторинг и тестируйте сценарии сбоев.
Готовы перейти к проектированию? Свяжитесь с нами, и мы поможем выбрать провайдера, спроектировать S2S‑архитектуру и быстро запустить оплату — от UX до фискализации.