Интеграция платёжных систем: ЮKassa, Stripe, PayPal, Apple Pay, Google Pay
Магазин упал в конверсии на 12% после редизайна. Страница оформления заказа — новая, красивая. Но в Sentry посыпались ошибки: Payment method not available for this currency, 3DS2 challenge flow failed, webhook signature verification failed. Платёжная интеграция — это не «подключить SDK и забыть». Это постоянно живая часть системы с обновляющимися требованиями банков, изменениями SCA (Strong Customer Authentication) в Европе и новыми требованиями ФНС в России.
Платёжная экосистема: чем отличаются провайдеры
ЮKassa (ранее Яндекс.Касса) — основной выбор для российского рынка. Поддерживает карты, SBP (Система Быстрых Платежей), ЮMoney, наложенный платёж, рассрочку (через BNPL-партнёров). Важно: ЮKassa требует фискализации — интеграция с 54-ФЗ обязательна, чеки отправляются в ОФД. Webhooks приходят на указанный endpoint, подпись проверяется через HMAC-SHA256 с секретным ключом.
Stripe — выбор для международных проектов и SaaS. Payment Intents API, поддержка 3DS2, SCA compliance для европейских карт. Stripe Elements или Payment Element для кастомного UI без передачи данных карты на ваш сервер (PCI DSS облегчённый режим). Webhooks через Stripe CLI для локальной разработки — стандарт.
PayPal — до сих пор актуален для B2C с международной аудиторией, особенно США и Западная Европа. PayPal Checkout v2 (Orders API) — современный вариант, старый Express Checkout устарел. Особенность: PayPal IPN (Instant Payment Notification) — legacy, новый путь через Webhooks REST API.
Apple Pay / Google Pay — не отдельные процессоры, а способы инициирования платежа. Apple Pay работает через Payment Request API или через специфичный JS SDK, требует верификации домена (файл apple-developer-merchantid-domain-association в /.well-known/). Google Pay — через Google Pay API, обычно поверх Stripe или другого процессора.
Где прячутся реальные сложности
Подключить тестовый режим — час работы. Правильно обработать все сценарии — несколько недель.
Webhook надёжность. Webhook может не дойти — сервер был недоступен, таймаут, временная ошибка сети. Провайдер повторяет отправку (Stripe — до 3 дней с экспоненциальным backoff, ЮKassa — своя логика). Ваш обработчик должен быть идемпотентным: если payment.succeeded придёт дважды с одним payment_id, заказ должен обновиться только один раз. Реализуется через хранение обработанных event IDs.
3DS2 и redirect flow. При оплате картой с 3DS2 пользователь уходит на страницу банка, проходит верификацию, возвращается по return_url. За это время сессия могла истечь, корзина очиститься, URL с параметрами потеряться. Статус платежа нужно проверять не только по redirect-параметрам, но и через прямой запрос к API провайдера при возврате пользователя.
Частичные возвраты и чеки. Если клиент вернул часть товаров — нужен чек коррекции (для ФНС) и частичный refund в ЮKassa. Stripe поддерживает partial_refund нативно. В обоих случаях нужна логика синхронизации статусов между платёжной системой, базой данных и складом.
Валютные ограничения. ЮKassa работает только с рублями. Stripe работает с 135+ валютами, но для конверсии currency в разных странах нужен currency в Payment Intent. Если клиент из РФ платит в евро через Stripe — он увидит конвертацию от своего банка, а не от вас.
Как строим интеграцию
Архитектура. Никогда не храним данные карт на своём сервере — только токены от провайдера. Payment flow: создание Order в нашей БД → создание Payment Intent на стороне провайдера → редирект/виджет → webhook подтверждает → обновляем Order статус. База истины — статус в платёжной системе, не в нашей БД.
Для Laravel-проектов используем официальные SDK: stripe/stripe-php, yookassa/yookassa-sdk-php. Webhook обработчик — отдельный контроллер с VerifyCsrfToken исключением для webhook URL, проверкой подписи в первой строке, Queue job для бизнес-логики (чтобы не держать соединение).
Для Next.js / React — Stripe Elements интегрируются через @stripe/stripe-js и @stripe/react-stripe-js. PaymentElement обрабатывает все методы оплаты автоматически, включая Apple/Google Pay, без кастомного кода для каждого.
Тестирование. Stripe CLI (stripe listen --forward-to localhost:8000/webhook) для локальных webhooks. Тест-карты для всех сценариев: успешная оплата, отклонение, 3DS required, insufficient funds. Cypress/Playwright тест для полного checkout flow — обязательно в CI.
Процесс и сроки
Аудит требований → выбор провайдеров → дизайн payment flow → backend интеграция → frontend checkout → тестирование всех сценариев (success, failure, 3DS, refunds, webhooks) → деплой → мониторинг первых транзакций.
| Сценарий | Срок |
|---|---|
| Один провайдер (ЮKassa или Stripe), базовый flow | 1–2 недели |
| Несколько методов оплаты + Apple/Google Pay | 2–4 недели |
| Мультивалютность + частичные возвраты + фискализация | 4–8 недель |
| SaaS подписки через Stripe Billing | 3–6 недель |
Стоимость рассчитывается индивидуально.







