Интеграция платежного шлюза PayPal в мобильное приложение
PayPal предоставляет несколько мобильных SDK — актуальный для новых интеграций это PayPal Mobile Checkout SDK (iOS и Android). Старый Braintree SDK также поддерживается и используется для карточных платежей без редиректа в PayPal. Выбор между ними зависит от задачи: если нужен только PayPal Wallet — используем PayPal Checkout SDK, если нужны карты + PayPal + Venmo — Braintree.
PayPal Checkout SDK: базовая интеграция
PayPal Checkout работает через браузерный flow: приложение открывает PayPal WebView (или браузер), пользователь логинится в PayPal и подтверждает платёж, PayPal редиректит обратно с orderId.
Серверная часть: создание ордера
POST https://api-m.paypal.com/v2/checkout/orders
Authorization: Bearer access_token
{
"intent": "CAPTURE",
"purchase_units": [{
"amount": {
"currency_code": "USD",
"value": "15.00"
},
"description": "Order #1234"
}]
}
Ответ содержит id ордера — передаётся в мобильный SDK.
Android: PayPal Checkout SDK
// build.gradle
implementation("com.paypal.checkout:android-sdk:1.x.x")
// Application.onCreate()
PayPalCheckout.setConfig(
CheckoutConfig(
application = this,
clientId = "your_client_id",
environment = Environment.LIVE,
returnUrl = "yourapp://x-callback-url/paypal-sdk/paypal-checkout",
currencyCode = CurrencyCode.USD,
userAction = UserAction.PAY_NOW
)
)
// Запуск оплаты
PayPalCheckout.start(
createOrder = CreateOrder { createOrderActions ->
createOrderActions.set(orderId) // ID от сервера
},
onApprove = OnApprove { approval ->
// approval.data.orderId — подтверждаем на сервере
capturePaymentOnServer(approval.data.orderId)
},
onCancel = OnCancel {
// пользователь закрыл
},
onError = OnError { errorInfo ->
Log.e("PayPal", errorInfo.reason)
}
)
iOS: PayPalCheckout SDK
// SPM: PayPalCheckout
import PayPalCheckout
PayPalCheckout.set(config: CheckoutConfig(
clientID: "your_client_id",
createOrder: nil,
onApprove: nil,
onCancel: nil,
onError: nil,
environment: .live
))
Checkout.start(
createOrder: { action in
action.set(orderId: "order_id_from_server")
},
onApprove: { approval in
// Захватываем платёж на сервере
self.capturePayment(orderId: approval.data.ecToken)
},
onCancel: { },
onError: { error in
print("PayPal error: \(error.reason)")
}
)
Захват платежа на сервере
После onApprove ордер нужно захватить:
POST https://api-m.paypal.com/v2/checkout/orders/{order_id}/capture
Authorization: Bearer access_token
Ответ со статусом COMPLETED означает успешное списание. Не считайте платёж завершённым только по onApprove на клиенте — без capture деньги не списаны.
Braintree: карты + PayPal без редиректа
Если нужен нативный card input без редиректа в PayPal.com:
// Android Braintree SDK
implementation("com.braintreepayments.api:braintree-android:4.x.x")
implementation("com.braintreepayments.api:paypal:4.x.x")
implementation("com.braintreepayments.api:card:4.x.x")
val braintreeClient = BraintreeClient(context, "client_token_from_server")
val payPalClient = PayPalClient(activity, braintreeClient)
// PayPal Checkout через Braintree
val request = PayPalCheckoutRequest(amount = "15.00", currencyCode = "USD")
payPalClient.tokenizePayPalAccount(activity, request)
Braintree возвращает nonce — одноразовый токен, который сервер использует для списания через Braintree API.
Ограничения для российского рынка
PayPal ограничил работу с российскими юрлицами и картами в 2022. Интеграция актуальна для международных приложений с зарубежной регистрацией или для приёма платежей от иностранных пользователей.
Что входит в работу
- Интеграция PayPal Checkout SDK или Braintree (iOS / Android)
- Серверные endpoints для создания и захвата ордера
- Обработка deeplink-возврата и ошибок
- Sandbox-тестирование с тестовыми PayPal-аккаунтами
Сроки
2–3 дня. Стоимость рассчитывается индивидуально.







