Интеграция платежной системы 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 дня. Стоимость рассчитывается индивидуально.







