Интеграция Stripe в мобильное приложение: полный гайд

Интеграция платежного шлюза Stripe в мобильное приложение Вы встроили карточный ввод, но пользователи жалуются на отказы 3DS? Или подписки не списываются автоматически? **Stripe** — наиболее технически зрелый платёжный шлюз с точки зрения мобильного SDK. Он покрывает не только базовый card input,

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Интеграция Stripe в мобильное приложение: полный гайд
Сложный
~3-5 дней

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

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Интеграция платежного шлюза Stripe в мобильное приложение

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

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

Как 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: "merchant.com.yourcompany.app", 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%. Точную стоимость оценим после анализа вашего проекта.

Этап Срок
Аналитика и проектирование 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) и многолетний опыт в мобильных платежах. Свяжитесь с нами для индивидуальной оценки вашего проекта. Получите консультацию по интеграции Stripe.

Для углублённого изучения: Stripe и 3D Secure.