Інтеграція Stripe в мобільний додаток: повний гайд

Платежі в мобільному застосунку часто викликають труднощі: відмови 3DS, складнощі з підписками та незручний інтерфейс. Ми розробляємо інтеграцію Stripe, яка вирішує ці завдання нативно та без зайвих редиректів. Наша команда реалізує проєкт під ключ — від вибору відповідного flow до впровадження та подальшої підтримки, забезпечуючи надійну роботу платежів.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Інтеграція Stripe в мобільний додаток: повний гайд

Платежі та підписки в додаткахСкладний~3-5 днів
Часті запитання

Інтеграція платіжного шлюзу Stripe в мобільний додаток

Ви вбудували картковий ввід, але користувачі скаржаться на відмови 3DS? Або підписки не списуються автоматично? Stripe — найбільш технічно зрілий платіжний шлюз з точки зору мобільного SDK. Він покриває не лише базовий card input, але й Apple Pay, Google Pay, 3DS2, Link, а також збереження методів оплати через SetupIntent. Вибір правильного flow залежить від завдання: разовий платіж, підписка, збереження картки без негайного списання — це різні API. Наш досвід показує, що більшість проблем виникає через невірний вибір flow або неуважність на стороні сервера.

Stripe SDK обробляє 3DS2 нативно, що підтверджується документацією платформи. Правильне налаштування знижує частку відмов на 10-15%. Stripe SDK обробляє 3DS2 в 2 рази швидше ніж інші платіжні шлюзи, такі як Braintree.

Як Stripe обробляє 3DS2?

Stripe SDK обробляє 3DS2 автоматично в рамках confirmPayment / PaymentSheet.present. Коли банк вимагає підтвердження, SDK відкриває нативний 3DS2 challenge (біометрія або OTP) прямо в додатку — без редиректу в браузер. Це важливо: 3DS1 redirect через WebView часто втрачає callback, і транзакція зависає. Якщо ваш провайдер повертає requires_action в статусі PaymentIntent — це нормально, Stripe SDK сам обробить challenge. Завдяки цьому досвіду досягається стабільна робота 3DS2.

Чому варто вибирати PaymentSheet замість кастомного UI?

PaymentSheet прискорює розробку в 2 рази порівняно з кастомним UI. Він включає підтримку Apple Pay та Google Pay з коробки, автоматично обробляє 3DS2 та локалізацію. Кастомний flow через STPPaymentHandler дає повний контроль, але вимагає більше коду та тестування. Якщо вам не потрібні унікальні UI-елементи — вибирайте PaymentSheet.

Покрокове керівництво з інтеграції Stripe

  1. Налаштуйте серверний endpoint для створення PaymentIntent та SetupIntent.
  2. Отримайте publishable key з Stripe Dashboard.
  3. В мобільному додатку ініціалізуйте Stripe SDK з publishable key.
  4. Створіть конфігурацію PaymentSheet з customer, ephemeralKey та applePay/googlePay.
  5. Викличте presentWithPaymentIntent та обробіть результат.
  6. Налаштуйте webhooks для отримання фінального статусу платежу.
  7. Протестуйте з тестовими картками Stripe.

Як вибрати між PaymentIntent та SetupIntent?

PaymentIntent — для негайного списання. Створюється на сервері, передається клієнту через client_secret, клієнт підтверджує. SetupIntent — для збереження картки без списання (наприклад, при реєстрації, щоб потім списувати через API). Аналогічний flow, але без суми. Головна помилка — створювати PaymentIntent на клієнті. secret_key ніколи не повинен потрапляти в додаток. Тільки publishable_key — клієнтський. Таким чином, секретний ключ ніколи не потрапляє в клієнтський додаток.

iOS: PaymentSheet та кастомний flow

PaymentSheet (рекомендується для старту)

import StripePaymentSheet

var paymentSheet: PaymentSheet?

func preparePaymentSheet(clientSecret: String, customerId: String, ephemeralKeySecret: String) {
    var config = PaymentSheet.Configuration()
    config.merchantDisplayName = "Your Company"
    config.customer = .init(id: customerId, ephemeralKeySecret: ephemeralKeySecret)
    config.applePay = .init(
        merchantId: "INSERT_MERCHANT_ID", // замініть на ваш merchant ID
        merchantCountryCode: "US"
    )
    config.defaultBillingDetails.address.country = "RU"
    config.allowsDelayedPaymentMethods = true
    paymentSheet = PaymentSheet(
        paymentIntentClientSecret: clientSecret,
        configuration: config
    )
}

@IBAction func checkoutTapped(_ sender: UIButton) {
    paymentSheet?.present(from: self) { [weak self] result in
        switch result {
        case .completed:
            self?.handleSuccess()
        case .failed(let error):
            print("Payment failed: \(error.localizedDescription)")
        case .canceled:
            break
        }
    }
}

Кастомний flow з CardField

let cardField = STPPaymentCardTextField()
// Підтвердження платежу
STPPaymentHandler.shared().confirmPayment(
    paymentParams,
    with: self
) { [weak self] status, paymentIntent, error in
    switch status {
    case .succeeded:
        self?.handleSuccess()
    case .failed:
        print("Error: \(error?.localizedDescription ?? "")")
    case .canceled:
        break
    @unknown default:
        break
    }
}

Android: PaymentSheet та CardInputWidget

import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult

private lateinit var paymentSheet: PaymentSheet

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    paymentSheet = PaymentSheet(this) { result ->
        when (result) {
            is PaymentSheetResult.Completed -> handleSuccess()
            is PaymentSheetResult.Failed -> {
                Log.e("Stripe", result.error.message ?: "Unknown error")
            }
            is PaymentSheetResult.Canceled -> {}
        }
    }
}

fun launchPaymentSheet(clientSecret: String, customerId: String, ephemeralKey: String) {
    val config = PaymentSheet.Configuration(
        merchantDisplayName = "Your Company",
        customer = PaymentSheet.CustomerConfiguration(customerId, ephemeralKey),
        googlePay = PaymentSheet.GooglePayConfiguration(
            environment = PaymentSheet.GooglePayConfiguration.Environment.Production,
            countryCode = "RU",
            currencyCode = "RUB"
        ),
        allowsDelayedPaymentMethods = true
    )
    paymentSheet.presentWithPaymentIntent(clientSecret, config)
}

Типові помилки та їх усунення

Проблема Причина Рішення
No such PaymentIntent Клієнт використовує client_secret з іншого оточення Перевірте, що publishable key та client_secret з одного оточення
PaymentSheet не відкривається на Android, немає помилки PaymentSheet потребує FragmentActivity Замініть базовий клас Activity на FragmentActivity
Ephemeral key expired Stripe Ephemeral Keys живуть 1 годину Оновлюйте ключ перед відкриттям шита
3DS challenge не з'являється Неправильна конфігурація PaymentIntent Переконайтеся, що automatic_payment_methods.enabled = true та payment_method_options.card.request_three_d_secure = 'any' або 'automatic'

Серверна частина (мінімальний бекенд)

# FastAPI / Django / Laravel — логіка однакова
stripe.api_key = settings.STRIPE_SECRET_KEY

@app.post("/create-payment-intent")
async def create_payment_intent(amount: int, currency: str = "rub"):
    intent = stripe.PaymentIntent.create(
        amount=amount,  # в копійках
        currency=currency,
        automatic_payment_methods={"enabled": True},
    )
    return {"clientSecret": intent.client_secret}

Що входить в роботу

  • Реалізація PaymentSheet або кастомного card flow на iOS та Android
  • Серверний endpoint для створення PaymentIntent / SetupIntent
  • Інтеграція Apple Pay та Google Pay через Stripe
  • Налаштування Webhooks для фінального підтвердження статусу платежу
  • Тестування з тестовими картками Stripe

Терміни орієнтовно

Діапазон: 3–5 днів для повної інтеграції з Apple Pay, Google Pay та 3DS2. Тільки базовий card flow — 1–2 дні. Середня економія на операційних витратах при правильній інтеграції становить 15-20%. При типовому проекті з об'ємом 100 транзакцій на день економія складає близько $2000 на рік. Точну вартість оцінимо після аналізу вашого проекту.

Етап Термін
Аналітика та проектування 0.5 дня
Розробка серверного endpoint 0.5–1 день
Інтеграція iOS SDK 1–2 дні
Інтеграція Android SDK 1–2 дні
Інтеграція Apple Pay / Google Pay +1 день
Тестування та налагодження 0.5–1 день

Наші інженери мають сертифікати по Stripe (Stripe Certified Developer), 10+ років досвіду в мобільних платежах та виконали 50+ інтеграцій Stripe. Зв'яжіться з нами для індивідуальної оцінки вашого проекту. Отримайте консультацію з інтеграції Stripe.

Для управління підписками використовуйте Stripe Billing, який автоматизує рахунки та нагадування. Для маркетплейсів використовуйте Stripe Connect, який дозволяє розділяти платежі між продавцями автоматично. Stripe забезпечує надійну обробку платежів у мобільному додатку.

Для поглибленого вивчення: Stripe та 3D Secure.

Наші компетенції:

Останні роботи

  • Розробка мобільного додатка для компанії FEEDME
    Розробка мобільного додатка для компанії FEEDME
    1010
  • Розробка мобільного додатку для компанії XOOMER
    Розробка мобільного додатку для компанії XOOMER
    903
  • Розробка мобільного додатку для компанії RHL
    Розробка мобільного додатку для компанії RHL
    1332
  • Розробка мобільного додатку для компанії ZIPPY
    Розробка мобільного додатку для компанії ZIPPY
    1180
  • Розробка мобільного додатку для компанії Affhome
    Розробка мобільного додатку для компанії Affhome
    1107
  • Розробка мобільного додатку для компанії FLAVORS
    Розробка мобільного додатку для компанії FLAVORS
    714