Типичные ошибки при интеграции платежного API: как их избежать и построить надежную платежную систему

Типичные ошибки при интеграции платежного API: как их избежать и построить надежную платежную систему

Типичные ошибки при интеграции платежного API

Интеграция платежного API — задача, которая на первый взгляд кажется простой, но на практике содержит множество подводных камней. Неправильная обработка одного статуса может привести к потере заказов, конфликтам с клиентами и финансовым потерям. В этой статье мы разберем самые частые ошибки, которые допускают разработчики при интеграции P2P-платежных API, и как их избежать.

Ошибка 1: Неправильный формат суммы

Самая распространенная ошибка — передача суммы в неправильном формате. В P2P-API сумма передается в минимальных единицах валюты. Для рублей это копейки, то есть 1000 означает 10 рублей. Для тенге — тиыны, для белорусских рублей — копейки.

Если передать 1000 вместо 100000 (имея в виду 1000 рублей), клиенту будет выставлен счет на 10 рублей. Если передать 100000 вместо 10000000 (имея в виду 1000 рублей, но с учетом precision), счет будет на 1000 рублей, что правильно.

Решение: всегда использовать минимальные единицы валюты. Проверять precision валюты из GET /api/currencies. Использовать целочисленную арифметику для расчета суммы.

Ошибка 2: Игнорирование лимитов платежных методов

Каждый платежный метод имеет минимальный и максимальный лимиты. Если сумма сделки выходит за пределы этих лимитов, API возвращает ошибку 400 с сообщением об отсутствии подходящих реквизитов.

Решение: перед созданием сделки проверять сумму на соответствие лимитам выбранного метода. При превышении лимита предлагать клиенту разбить платеж на части или выбрать другой метод.

Ошибка 3: Необработка всех подстатусов

Многие мерчанты обрабатывают только основные статусы (success, fail, pending) и игнорируют детальные подстатусы. Это приводит к тому, что сделка может зависнуть в промежуточном состоянии, и ни мерчант, ни клиент не знают, что делать дальше.

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

Ошибка 4: Отсутствие дедупликации callback-уведомлений

Платежная система может отправить одно и то же уведомление несколько раз, если не получила подтверждение получения (HTTP 200). Если мерчант не реализовал дедупликацию, это приведет к двойному подтверждению заказа или двойной отправке товара.

Решение: использовать ID уведомления или ID сделки для дедупликации. Хранить обработанные ID в базе данных и проверять перед обработкой.

Ошибка 5: Синхронная обработка callback

Если сервер мерчанта обрабатывает callback синхронно (внутри HTTP-запроса), а обработка занимает много времени (отправка email, обновление БД, интеграция с CRM), клиент (платежная система) может прервать соединение по тайм-ауту.

Решение: возвращать HTTP 200 сразу, а обработку выполнять асинхронно через очередь задач (RabbitMQ, Redis Queue, Sidekiq).

Ошибка 6: Неправильный выбор типа API

Merchant API проще, но не предоставляет полного контроля. H2H API сложнее, но дает возможности для управления спорами. Выбор неправильного типа API приводит к тому, что мерчант не может выполнить необходимые операции.

Решение: для интернет-магазинов с простыми сценариями — Merchant API. Для платформ с полным циклом управления — H2H API.

Ошибка 7: Отсутствие обработки тайм-аутов

При высокой нагрузке API может не уложиться в заданный тайм-аут. Если мерчант не обрабатывает ошибку 504, клиент не получает реквизиты для оплаты и уходит с сайта.

Решение: использовать заголовок X-Max-Wait-Ms для контроля тайм-аута. При ошибке 504 повторять запрос с увеличивающейся задержкой. Отображать клиенту индикатор загрузки.

Ошибка 8: Непроверка IP-адресов отправителя callback

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

Решение: проверять IP-адреса отправителя. Платежная система отправляет уведомления с определенных IP-адресов. Использовать HMAC-подпись для верификации уведомлений, если она поддерживается.

Ошибка 9: Хранение Access-Token в исходном коде

Хранение токена доступа в коде, который попадает в систему контроля версий (Git), создает риск утечки. Если токен попадет к злоумышленникам, они смогут создавать сделки и управлять балансом.

Решение: хранить Access-Token в переменных окружения (ENV), использовать отдельные токены для разработки и продакшена, регулярно ротировать токены.

Ошибка 10: Отсутствие мониторинга и алертов

Если платежная система недоступна или мерчант перестал получать callback-уведомления, это может остаться незамеченным в течение нескольких часов или дней.

Решение: настроить мониторинг доступности API, настроить алерты при отсутствии callback-уведомлений в течение заданного времени, вести логи всех запросов и ответов API.

Выводы

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