Mobile SDK Core
Это скорее библиотека, чем SDK. Она используется для шифрования данных карты в seToken, который можно безопасно передать и сохранить в любой системе (например, на сервере продавца). Это хорошее решение для продавцов, которые хотят максимальной гибкости или не хотят иметь дело с данными карты на своих серверах.
Web View для 3DS
На приведенной ниже диаграмме показан процесс оплаты Mobile SDK Core с перенаправлением 3DS через Web View.
-
Клиент создает заказ
-
Мобильный сервер регистрирует этот заказ в Платежном сервисе через register.do. Используйте параметр
returnUrlв качестве маркера для закрытия Web View после перенаправления из ACS на Шаге 14. -
Мобильный сервер получает в ответе уникальный номер заказа
mdOrder. -
Клиент заполняет платежные данные в мобильном приложении.
-
Мобильное приложение вызывает SDK для создания seToken. (Android: sdkCore.generateWithCard; iOS: CKCToken.generateWithCard).
Список значений, необходимых для формирования seToken, см. в разделе Параметры, включенные в состав seToken.
Публичный ключ можно получить вызовом методов Платежного сервиса https://api.router.rbsuat.com/v2/se/keys.do или https://api.router.rbsuat.com/v2/se/keys2.do.
/se/keys.doвозвращает ключи для шифрования по алгоритму RSA-2048,/se/keys2.do— ключи для шифрования по алгоритму RSA-4096. Мы рекомендуем использовать RSA-4096.Оба метода могут возвращать несколько ключей. Желательно использовать наиболее свежий ключ с наиболее поздней датой истечения действия. Вы можете кэшировать публичные ключи Платежного сервиса на время, не превышающее срок действия ключа.
Ключи для тестовой и продуктивной среды различаются.
-
Мобильное приложение отправляет seToken на мобильный сервер.
-
Мобильный сервер использует этот seToken для совершения платежа через paymentOrder.do.
- Используйте seToken вместо pan, cvc и даты истечения срока действия.
-
Мобильный сервер получает ответ без редиректа на ACS. Это означает, что оплата завершена и нам нужно перейти к Шагу 14.
-
Мобильный сервер получает ответ с редиректом на ACS.
-
Мобильное приложение открывает Web View с данными редиректа на ACS.
-
Клиент вводит свой одноразовый пароль в форму ACS.
-
ACS перенаправляет клиента на Платежный сервис Роутер.
-
Платежный сервис Роутер осуществляет платеж.
-
Платежный сервис Роутер перенаправляет клиента на
returnUrl, который можно использовать в качестве маркера для закрытия Web View. -
Мобильное приложение закрывает Web View.
-
Платежный сервис Роутер отправляет уведомление обратного вызова на сервер продавца, если оно настроено для продавца.
-
Мобильный сервер проверяет окончательный статус платежа через getOrderStatusExtended.do.
-
Мобильное приложение показывает результат платежа клиенту.
Mobile SDK Source
iOS
Исходный код для iOS на GitHub
[Релизы для iOS на GitHub] (https://github.com/Radarpayments/ios-sdk/releases)
Требования: iOS 10.0 или новее
Android
[Исходный код для Android на GitHub] (https://github.com/Radarpayments/android-sdk)
[Релизы для Android на GitHub] (https://github.com/Radarpayments/android-sdk/releases)
Требования: Android 5.0 или новее
IOS
iOS-интеграция
Интеграция SDKCore.framework
Вы можете интегрировать SDKCore.framework, добавив его вручную.
SDKCore.framework
-
Скачайте последнюю версию фреймворка здесь.
-
Выберите файл
SDKCore.frameworkи добавьте его в папку проекта.

- Откройте страницу Targets -> General -> Frameworks, Libraries, and Embedded Content. Для
SDKCore.frameworkс столбце Embed заменитеDo not EmbedнаEmbed & Sign.

Затем импортируйте фреймворк в файл ViewController.swift .
//ViewController.swift
...
import SDKCore
...Работа с API V1
Внешние зависимости
Для генерации токена необходимо задать открытый ключ.
let publicKey: String =
"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoIITqh9xlGx4tWA+aucb0V0YuFC9aXzJb0epdioSkq3qzNdRSZIxe/dHqcbMN2SyhzvN6MRVl3xyjGAV+lwk8poD4BRW3VwPUkT8xG/P/YLzi5N8lY6ILlfw6WCtRPK5bKGGnERcX5dqL60LhOPRDSYT5NHbbp/J2eFWyLigdU9Sq7jvz9ixOLh6xD7pgNgHtnOJ3Cw0Gqy03r3+m3+CBZwrzcp7ZFs41bit7/t1nIqgx78BCTPugap88Gs+8ZjdfDvuDM+/3EwwK0UVTj0SQOv0E5KcEHENL9QQg3ujmEi+zAavulPqXH5907q21lwQeemzkTJH4o2RCCVeYO+YrQIDAQAB-----END PUBLIC KEY-----"Метод генерации токена
let sdkCore = SdkCore()
let cardParams = CardParams(
pan: "4111111111111111",
cvc: "123",
expiryMMYY: "12/28",
cardholder: "TEST CARDHOLDER",
mdOrder: "mdOrder",
pubKey: publicKey
)
let cardParamsConfig = SDKCoreConfig(
paymentMethodParams: .cardParams(params: cardParams)
)
let tokenResult = sdkCore.generateWithConfig(config: cardParamsConfig)
let bindignParams = BindingParams(
pubKey: publicKey,
bindingId: "das",
cvc: "123",
mdOrder: "mdOrder"
)
let bindingParamsConfig = SDKCoreConfig(
paymentMethodParams: .bindingParams(params: bindignParams)
)
let tokenResult = sdkCore.generateWithConfig(config: bindingParamsConfig)Модели
CardParams
| Название свойства | Тип данных | Значение по умолчанию | Необязательно | Описание |
|---|---|---|---|---|
| mdOrder | String | - | Нет | Номер заказа |
| pan | String | - | Нет | Номер карты |
| cvc | String | - | Нет | Секретный код карты |
| expiryMMYY | String | - | Нет | Срок действия карты |
| cardHolder | String | - | Да | Имя и фамилия держателя карты |
| pubKey | String | - | Нет | Открытый ключ |
BindingParams
| Название свойства | Тип данных | Значение по умолчанию | Необязательно | Описание |
|---|---|---|---|---|
| mdOrder | String | - | Нет | Номер заказа |
| bindingId | String | - | Нет | Номер связки для карты |
| cvc | String | - | Да | Секретный код карты |
| pubKey | String | - | Нет | Открытый ключ |
Ошибки валидации полей
| ParamField | Ошибка | Описание |
|---|---|---|
| UNKNOWN | - | Неизвестная ошибка |
| PAN | required | Указано пустое поле |
| invalid | Некорректное значение | |
| invalid-format | Используются недопустимые символы. Доступны только цифры. | |
| CVC | required | Указано пустое поле |
| invalid | Некорректное значение | |
| EXPIRY | required | Указано пустое поле |
| invalid | Некорректное значение | |
| invalid-format | Формат не соответствует шаблону MM/YY | |
| CARDHOLDER | required | Указано пустое поле |
| invalid | Некорректное значение | |
| invalid-format | Используются недопустимые символы. Доступны только буквы и пробелы. | |
| BINDING_ID | required | Указано пустое поле |
| invalid | Некорректное значение | |
| MD_ORDER | required | Указано пустое поле |
| invalid | Некорректное значение | |
| PUB_KEY | required | Указано пустое поле |
Android
Android-интеграция
Подключение к Gradle проекту путем добавления файлов .aar библиотеки
Необходимо добавить файл библиотеки sdk_core-release.aar в папку libs, а затем указать зависимость добавленной библиотеки.
build.gradle.kts
allprojects {
repositories {
// ...
flatDir {
dirs("libs")
}
}
}
dependencies {
// dependency is mandatory to add
implementation(group = "", name = "sdk_core-release", ext = "aar")
}build.gradle
allprojects {
repositories {
// ...
flatDir {
dirs 'libs'
}
}
}
dependencies {
// dependency is mandatory to add
implementation(group: '', name: 'sdk_core-release', ext: 'aar')
}Конфигурация Android
Логирование
Внутренние процессы логируются с тегом SDK-Core.
Вы также можете логировать свои процессы.
Логирование доступно через объект Logger.
-
Для добавления log- интерфейсов необходимо вызвать
Logger-методaddLogInterface().Пример для логирования в LogCat:
...
Logger.addLogInterface(object : LogInterface {
override fun log(classMethod: Class<Any>, tag: String, message: String, exception: Exception?) {
Log.i(tag, "$classMethod: $message", exception)
}
})
...По умолчанию используется тег SDK-Core. Вы можете установить свой собственный, если хотите.
-
Для логирования собственных событий необходимо вызвать
Logger-методlog().Пример:
...
Logger.log(this.javaClass, "MyTag", "My process...", null)
...Пример Kotlin_core (без графического интерфейса)
Пример формирования криптограммы
import net.payrdr.mobile.payment.sdk.core.SDKCore
import net.payrdr.mobile.payment.sdk.core.TokenResult
import net.payrdr.mobile.payment.sdk.core.model.BindingParams
import net.payrdr.mobile.payment.sdk.core.model.CardParams
import net.payrdr.mobile.payment.sdk.core.validation.BaseValidator
import net.payrdr.mobile.payment.sdk.core.validation.CardCodeValidator
import net.payrdr.mobile.payment.sdk.core.validation.CardExpiryValidator
import net.payrdr.mobile.payment.sdk.core.validation.CardHolderValidator
import net.payrdr.mobile.payment.sdk.core.validation.CardNumberValidator
import net.payrdr.mobile.payment.sdk.core.validation.OrderNumberValidator
class MainActivity : AppCompatActivity() {
// initialization of validators for card information entry fields
private val cardNumberValidator by lazy { CardNumberValidator(this) }
private val cardExpiryValidator by lazy { CardExpiryValidator(this) }
private val cardCodeValidator by lazy { CardCodeValidator(this) }
private val cardHolderValidator by lazy { CardHolderValidator(this) }
private val orderNumberValidator by lazy { OrderNumberValidator(this) }
private val sdkCore by lazy { SDKCore(context = this) }
override fun onCreate(savedInstanceState: Bundle?) {
// installation of validators on the card information entry fields
cardNumberInput.setupValidator(cardNumberValidator)
cardExpiryInput.setupValidator(cardExpiryValidator)
cardCodeInput.setupValidator(cardCodeValidator)
cardHolderInput.setupValidator(cardHolderValidator)
mdOrderInput.setupValidator(orderNumberValidator)
// creation of an object and initialization of fields for a new card
val params = NewPaymentMethodCardParams(
pan = cardNumberInput.text.toString(),
cvc = cardCodeInput.text.toString(),
expiryMMYY = cardExpiryInput.text.toString(),
cardHolder = cardHolderInput.text.toString(),
pubKey = pubKeyInput.text.toString()
)
// method call to get the cryptogram for a new card
sdkCore.generateWithConfig(SDKCoreConfig(params))
// Creation of an object and initialization of fields for the linked card
val params = NewPaymentMethodStoredCardParams(
storedPaymentId = "storedPaymentMethodId",
cvc = "123",
pubKey = pubKeyInput.text.toString()
)
// method call to get the cryptogram for the linked card
sdkCore.generateWithConfig(SDKCoreConfig(params))
}
}Модели
NewPaymentMethodCardParams
| Название свойства | Тип данных | Значение по умолчанию | Необязательно | Описание |
|---|---|---|---|---|
| pan | String | - | Нет | Номер карты |
| cvc | String | - | Нет | Секретный код карты |
| expiryMMYY | String | - | Нет | Срок действия карты |
| cardHolder | String | - | Нет | Имя и фамилия держателя карты |
| pubKey | String | - | Нет | Открытый ключ |
NewPaymentMethodStoredCardParams
| Название свойства | Тип данных | Значение по умолчанию | Необязательно | Описание |
|---|---|---|---|---|
| storedPaymentId | String | - | Нет | Номер связки для карты |
| cvc | String | - | Нет | Секретный код карты |
| pubKey | String | - | Нет | Открытый ключ |
TokenResult
| Название свойства | Тип данных | Значение по умолчанию | Необязательно | Описание |
|---|---|---|---|---|
| token | String | - | Нет | Токен как строка |
| errors | Map<ParamField, String> | - | Нет | Ошибка при генерации токена |
Ошибки валидации полей
| ParamField | Ошибка | Описание |
|---|---|---|
| PAN | required | Указано пустое поле |
| invalid | Некорректное значение | |
| invalid-format | Используются недопустимые символы. Доступны только цифры. | |
| CVC | required | Указано пустое поле |
| invalid | Некорректное значение | |
| EXPIRY | required | Указано пустое поле |
| invalid | Некорректное значение | |
| invalid-format | Формат не соответствует шаблону MM/YY. | |
| CARDHOLDER | required | Указано пустое поле |
| invalid | Некорректное значение | |
| invalid-format | Используются недопустимые символы. Доступны только буквы и пробелы. | |
| PUB_KEY | required | Указано пустое поле |
| STORED_PAYMENT_ID | requrired | Указано пустое поле |
| invalid | Некорректное значение |
Работа с API V1
Внешние зависимости
Для генерации токена необходимо установить открытый ключ.
val publicKey: String =
"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoIITqh9xlGx4tWA+aucb0V0YuFC9aXzJb0epdioSkq3qzNdRSZIxe/dHqcbMN2SyhzvN6MRVl3xyjGAV+lwk8poD4BRW3VwPUkT8xG/P/YLzi5N8lY6ILlfw6WCtRPK5bKGGnERcX5dqL60LhOPRDSYT5NHbbp/J2eFWyLigdU9Sq7jvz9ixOLh6xD7pgNgHtnOJ3Cw0Gqy03r3+m3+CBZwrzcp7ZFs41bit7/t1nIqgx78BCTPugap88Gs+8ZjdfDvuDM+/3EwwK0UVTj0SQOv0E5KcEHENL9QQg3ujmEi+zAavulPqXH5907q21lwQeemzkTJH4o2RCCVeYO+YrQIDAQAB-----END PUBLIC KEY-----"Метод генерации токена
// TokenResult with CardParams
val cardParams: CardParams = CardParams(
mdOrder = "mdOrder",
pan = "4111111111111111",
cvc = "123",
expiryMMYY = "12/28",
cardHolder = "TEST CARDHOLDER",
pubKey = "publicKey"
)
val tokenResult = sdkCore.generationWithConfig(paymentCardParams = cardParams)
// TokenResult with BindingParams
val bindingParams: BindingParams = BindingParams(
mdOrder = "mdOrder",
bindingID = "das",
cvc = "123",
pubKey = "publicKey"
)
val tokenResult = sdkCore.generationWithConfig(paymentCardParams = bindingParams)