Інтеграція платіжних систем: YooKassa, 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) у Європі та новими вимогами ФНС у Росії.
Платіжна екосистема: чим відрізняються провайдери
YooKassa (раніше Яндекс.Касса) — основний вибір для російського ринку. Підтримує карти, СБП (Система Швидких Платежів), YooMoney, наложений платіж, розстрочку (через BNPL-партнерів). Важливо: YooKassa вимагає фіскалізації — інтеграція з Законом 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 може не дійти — сервер був недоступен, timeout, тимчасова помилка мережі. Провайдер повторює відправку (Stripe — до 3 днів з експоненціальним backoff, YooKassa — своя логіка). Ваш обробник повинен бути ідемпотентним: якщо payment.succeeded прийде двічі з одним payment_id, замовлення повинно оновитися лише один раз. Реалізується через зберігання оброблених event IDs.
3DS2 та redirect flow. При оплаті картою з 3DS2 користувач йде на сторінку банку, проходить верифікацію, повертається по return_url. За цей час сесія могла закінчитися, корзина очиститися, URL з параметрами втратитися. Статус платежу потрібно перевіряти не тільки по redirect-параметрам, але й через прямий запит до API провайдера при повернені користувача.
Часткові повернення та чеки. Якщо клієнт повернув частину товарів — потрібен чек корекції (для ФНС) та частковий refund у YooKassa. Stripe підтримує partial_refund нативно. В обох випадках потрібна логіка синхронізації статусів між платіжною системою, базою даних та складом.
Валютні обмеження. YooKassa працює тільки з рублями. 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) → деплой → моніторинг перших транзакцій.
| Сценарій | Строк |
|---|---|
| Один провайдер (YooKassa або Stripe), базовий flow | 1–2 тижні |
| Кілька методів оплати + Apple/Google Pay | 2–4 тижні |
| Мультивалютність + часткові повернення + фіскалізація | 4–8 тижнів |
| SaaS підписки через Stripe Billing | 3–6 тижнів |
Вартість розраховується індивідуально.







