Інтеграція платіжної системи Samsung Pay в мобільному додатку
Samsung Pay має власний SDK, окремий від Google Pay, і працює лише на пристроях Samsung з підтримкою Samsung Wallet (раніше Samsung Pay). Основна особливість — підтримка як NFC, так і MST (Magnetic Secure Transmission), що дозволяє платити навіть на терміналах без безконтактного читача. Інтеграція вимагає реєстрації в Samsung Pay Developers Portal та отримання Service ID.
Реєстрація та отримання Service ID
Перед написанням коду:
- Реєструємося на pay.samsung.com/developers
- Створюємо Service Profile — вказуємо тип сервісу (In-App Payment), країну та назву
- Отримуємо Service ID для sandbox та production середовищ
- Завантажуємо CSR для генерування сертифіката (аналогічно Apple Pay)
Samsung Pay API підтримує дві моделі токенізації: через Payment Gateway (ваш еквайєр підтримує Samsung Pay) або через пряму інтеграцію з Samsung Pay Server.
Підключення SDK
// build.gradle (app)
dependencies {
implementation files('libs/SamsungPaySDK-2.x.x.jar')
// або через Maven, якщо доступно
}
Дозволи в AndroidManifest:
<uses-permission android:name="com.samsung.android.spay.permission.ACCESS_SERVICE" />
Перевірка доступності Samsung Pay
import com.samsung.android.sdk.samsungpay.v2.SamsungPay
import com.samsung.android.sdk.samsungpay.v2.SpaySdk
import com.samsung.android.sdk.samsungpay.v2.StatusListener
val bundle = Bundle().apply {
putString(SamsungPay.PARTNER_SERVICE_TYPE, SpaySdk.ServiceType.INAPP_PAYMENT.toString())
}
val samsungPay = SamsungPay(context, bundle)
samsungPay.getSamsungPayStatus(object : StatusListener {
override fun onSuccess(status: Int, bundle: Bundle) {
when (status) {
SpaySdk.SPAY_READY -> showSamsungPayButton()
SpaySdk.SPAY_NOT_READY -> {
// Samsung Pay встановлен, але не налаштований (немає карт)
samsungPay.goToUpdatePage() // пропонуємо додати карту
}
SpaySdk.SPAY_NOT_SUPPORTED -> hideSamsungPayButton()
SpaySdk.SPAY_NOT_ALLOWED_TEMPORALLY -> {
// Тимчасово заблокований (MDM, захист пристрою)
hideSamsungPayButton()
}
}
}
override fun onFail(errorCode: Int, bundle: Bundle) {
hideSamsungPayButton()
}
})
Створення та запуск платіжного запиту
import com.samsung.android.sdk.samsungpay.v2.payment.CustomSheetPaymentInfo
import com.samsung.android.sdk.samsungpay.v2.payment.PaymentManager
import com.samsung.android.sdk.samsungpay.v2.payment.sheet.*
val paymentInfo = CustomSheetPaymentInfo.Builder()
.setMerchantId("YOUR_MERCHANT_ID")
.setMerchantName("Your Company")
.setOrderNumber("ORDER-1234")
.setAddressInPaymentSheet(CustomSheetPaymentInfo.AddressInPaymentSheet.DO_NOT_SHOW)
.setAllowedCardBrands(listOf(
SpaySdk.Brand.VISA,
SpaySdk.Brand.MASTERCARD,
SpaySdk.Brand.MIR
))
.setCardHolderNameEnabled(false)
.setRecurringEnabled(false)
.build()
val customSheet = CustomSheet()
val amountControl = AmountBoxControl("amountId", "RUB")
amountControl.addItem("subtotal", "Товари", 1250.0, "")
amountControl.addItem("shipping", "Доставка", 250.0, "")
amountControl.setAmountTotal(1500.0, AmountConstants.FORMAT_TOTAL_PRICE_ONLY)
customSheet.addControl(amountControl)
val paymentManager = PaymentManager(context, partnerInfo)
paymentManager.startInAppPayWithCustomSheet(
paymentInfo,
customSheet,
object : PaymentManager.CustomSheetTransactionInfoListener {
override fun onCardInfoUpdated(cardInfo: CardInfo, customSheet: CustomSheet) {
// Викликається при зміні карти — оновлюємо загальну суму, якщо необхідно
paymentManager.updateSheet(customSheet)
}
override fun onSuccess(response: CustomSheetPaymentInfo, paymentCredential: String, extraPaymentData: Bundle) {
// paymentCredential — зашифрований токен для передачі на бекенд
sendCredentialToBackend(paymentCredential)
}
override fun onFailure(errorCode: Int, bundle: Bundle) {
handleError(errorCode)
}
}
)
Типові проблеми інтеграції
SPAY_NOT_SUPPORTED на пристрої Samsung. Трапляється, якщо: Samsung Pay не встановлений (на деяких ринках — Samsung Wallet), версія Android < 5.0, або пристрій зі старої лінійки без підтримки MST/NFC-платежів.
Помилка ERROR_NOT_SUPPORTED_ENVIRONMENT. Sandbox Service ID використовується з production-середовищем або навпаки. Samsung забезпечує суворий розділ — sandbox-додаток не працює з production Service ID.
onCardInfoUpdated викликається, але updateSheet не викликається. Samsung Pay чекає виклику updateSheet після кожного onCardInfoUpdated — інакше інтерфейс зависає. Це не баг, це обов'язковий паттерн.
Тестування
Samsung Pay вимагає фізичного пристрою Samsung. Емулятор не підтримується. Для sandbox-тестування додаємо тестову карту через розділ Samsung Pay Developer у налаштуваннях Samsung Pay.
Обсяг робіт
- Реєстрація Service Profile в Samsung Pay Developers Portal
- Інтеграція Samsung Pay SDK в Android-проект
- Реалізація перевірки статусу та показу кнопки
- Налаштування CustomSheet з позиціями замовлення
- Обробка paymentCredential та передача постачальнику
- Тестування на фізичному пристрої Samsung
Терміни
2–3 дні. Вартість розраховується індивідуально.







