Інтеграція платіжного шлюзу 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 працює через браузерний потік: додаток відкриває 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": "Замовлення №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: PayPal Checkout 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 дні. Вартість розраховується індивідуально.







