Интеграция платежного шлюза ЮKassa в мобильное приложение
ЮKassa (бывший Яндекс.Касса) — один из самых популярных платёжных шлюзов для российского рынка. Мобильный SDK поддерживает оплату картой, через SberPay, SBP, Apple Pay, Google Pay и кошелёк ЮMoney. Интеграция строится через токенизацию платёжных данных на клиенте с последующим списанием через серверный API.
Архитектура: токенизация вместо реквизитов
ЮKassa не передаёт карточные данные напрямую на ваш сервер. Клиентский SDK создаёт платёжный токен — зашифрованный объект, который действует однократно и только для вашего магазина. Сервер использует этот токен для создания платежа через ЮKassa API.
iOS: YooKassaPayments SDK
// Podfile
pod 'YooKassaPayments'
// или SPM
.package(url: "https://github.com/yoomoney/yookassa-payments-swift", from: "7.x.x")
Запуск платёжного экрана:
import YooKassaPayments
let inputData = TokenizationModuleInputData(
clientApplicationKey: "live_your_client_key", // из личного кабинета ЮKassa
title: "Your Company",
subtitle: "Заказ №1234",
amount: Amount(value: 1500, currency: .rub),
paymentTypes: [.bankCard, .sberbank, .sbp, .applePay, .yooMoney],
savePaymentMethod: .on, // или .off, .userSelects
isLoggingEnabled: false
)
let viewController = TokenizationAssembly.makeModule(
inputData: inputData,
moduleOutput: self
)
present(viewController, animated: true)
Обработка результата:
extension PaymentViewController: TokenizationModuleOutput {
func tokenizationModule(
_ module: TokenizationModuleInput,
didTokenize token: Tokens,
paymentMethodType: PaymentMethodType
) {
dismiss(animated: true)
// token.paymentToken — отправляем на сервер
sendTokenToBackend(token.paymentToken, paymentMethodType: paymentMethodType.rawValue)
}
func didFinish(on module: TokenizationModuleInput, with error: YooKassaPaymentsError?) {
dismiss(animated: true)
if let error = error {
print("YooKassa error: \(error)")
}
}
}
Android: YooKassa Payments SDK
// build.gradle
implementation("ru.yoomoney.sdk.kassa.payments:yookassa-android-sdk:7.x.x")
private val tokenizeLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val token = Checkout.createTokenizationResult(result.data!!)
sendTokenToBackend(
token.paymentToken,
token.paymentMethodType.name
)
}
}
fun startPayment() {
val paymentParameters = PaymentParameters(
amount = Amount(BigDecimal.valueOf(1500), Currency.getInstance("RUB")),
title = "Your Company",
subtitle = "Заказ №1234",
clientApplicationKey = "live_your_client_key",
shopId = "your_shop_id",
savePaymentMethod = SavePaymentMethod.ON,
paymentMethodTypes = setOf(
PaymentMethodType.BANK_CARD,
PaymentMethodType.SBERBANK,
PaymentMethodType.SBP,
PaymentMethodType.GOOGLE_PAY,
PaymentMethodType.YOO_MONEY
)
)
val intent = Checkout.createTokenizeIntent(this, paymentParameters)
tokenizeLauncher.launch(intent)
}
Серверное подтверждение платежа
Токен с клиента передаётся на сервер, сервер создаёт платёж:
POST https://api.yookassa.ru/v3/payments
Authorization: Basic base64(shopId:secretKey)
Content-Type: application/json
Idempotence-Key: unique-uuid
{
"amount": { "value": "1500.00", "currency": "RUB" },
"capture": true,
"payment_method_data": {
"type": "bank_card"
},
"confirmation": {
"type": "mobile_application",
"return_url": "yourapp://payment/result"
},
"payment_token": "token_from_client",
"description": "Заказ №1234"
}
Если ответ содержит status: pending и confirmation.type: redirect — 3DS требует подтверждения. SDK это обрабатывает автоматически, но при прямой API-интеграции нужно открывать confirmation_url в SFSafariViewController / Custom Tabs.
Типичные грабли
clientApplicationKey vs secretKey. В SDK передаётся только clientApplicationKey (начинается на live_ или test_). secretKey только на сервере. Если перепутать — API вернёт 401, но сообщение не всегда очевидное.
SavePaymentMethod и оферта. При SavePaymentMethod.ON ЮKassa требует, чтобы пользователь принял оферту на рекуррентные платежи. SDK показывает чекбокс автоматически, но если это пропустить в кастомном UI — транзакцию отклонят.
Что входит в работу
- Подключение YooKassa SDK (iOS / Android / Flutter)
- Настройка paymentTypes под задачи проекта
- Серверный endpoint для создания и подтверждения платежа
- Настройка Webhook для финального статуса
- Тестирование в тестовом магазине ЮKassa
Сроки
2–3 дня. Стоимость рассчитывается индивидуально.







