Mobile SDK Core

Это скорее библиотека, чем SDK. Она используется для шифрования данных карты в seToken, который можно безопасно передать и сохранить в любой системе (например, на сервере продавца). Это хорошее решение для продавцов, которые хотят максимальной гибкости или не хотят иметь дело с данными карты на своих серверах.

Web View для 3DS

На приведенной ниже диаграмме показан процесс оплаты Mobile SDK Core с перенаправлением 3DS через Web View.

  1. Клиент создает заказ

  2. Мобильный сервер регистрирует этот заказ в Платежном сервисе через register.do. Используйте параметр returnUrl в качестве маркера для закрытия Web View после перенаправления из ACS на Шаге 14.

  3. Мобильный сервер получает в ответе уникальный номер заказа mdOrder.

  4. Клиент заполняет платежные данные в мобильном приложении.

  5. Мобильное приложение вызывает 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.

    Оба метода могут возвращать несколько ключей. Желательно использовать наиболее свежий ключ с наиболее поздней датой истечения действия. Вы можете кэшировать публичные ключи Платежного сервиса на время, не превышающее срок действия ключа.

    Ключи для тестовой и продуктивной среды различаются.

  6. Мобильное приложение отправляет seToken на мобильный сервер.

  7. Мобильный сервер использует этот seToken для совершения платежа через paymentOrder.do.

    • Используйте seToken вместо pan, cvc и даты истечения срока действия.
  8. Мобильный сервер получает ответ без редиректа на ACS. Это означает, что оплата завершена и нам нужно перейти к Шагу 14.

  9. Мобильный сервер получает ответ с редиректом на ACS.

  10. Мобильное приложение открывает Web View с данными редиректа на ACS.

  11. Клиент вводит свой одноразовый пароль в форму ACS.

  12. ACS перенаправляет клиента на Платежный сервис Роутер.

  13. Платежный сервис Роутер осуществляет платеж.

  14. Платежный сервис Роутер перенаправляет клиента на returnUrl, который можно использовать в качестве маркера для закрытия Web View.

  15. Мобильное приложение закрывает Web View.

  16. Платежный сервис Роутер отправляет уведомление обратного вызова на сервер продавца, если оно настроено для продавца.

  17. Мобильный сервер проверяет окончательный статус платежа через getOrderStatusExtended.do.

  18. Мобильное приложение показывает результат платежа клиенту.

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

Рисунок 1. Добавление файла SDKCore.framework

Рисунок 2. Изменение свойств SDKCore.framework

Затем импортируйте фреймворк в файл 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

Название свойстваТип данныхЗначение по умолчаниюНеобязательноОписание
mdOrderString-НетНомер заказа
panString-НетНомер карты
cvcString-НетСекретный код карты
expiryMMYYString-НетСрок действия карты
cardHolderString-ДаИмя и фамилия держателя карты
pubKeyString-НетОткрытый ключ

BindingParams

Название свойстваТип данныхЗначение по умолчаниюНеобязательноОписание
mdOrderString-НетНомер заказа
bindingIdString-НетНомер связки для карты
cvcString-ДаСекретный код карты
pubKeyString-НетОткрытый ключ

Ошибки валидации полей

ParamFieldОшибкаОписание
UNKNOWN-Неизвестная ошибка
PANrequiredУказано пустое поле
invalidНекорректное значение
invalid-formatИспользуются недопустимые символы. Доступны только цифры.
CVCrequiredУказано пустое поле
invalidНекорректное значение
EXPIRYrequiredУказано пустое поле
invalidНекорректное значение
invalid-formatФормат не соответствует шаблону MM/YY
CARDHOLDERrequiredУказано пустое поле
invalidНекорректное значение
invalid-formatИспользуются недопустимые символы. Доступны только буквы и пробелы.
BINDING_IDrequiredУказано пустое поле
invalidНекорректное значение
MD_ORDERrequiredУказано пустое поле
invalidНекорректное значение
PUB_KEYrequiredУказано пустое поле

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.

...
    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(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

Название свойстваТип данныхЗначение по умолчаниюНеобязательноОписание
panString-НетНомер карты
cvcString-НетСекретный код карты
expiryMMYYString-НетСрок действия карты
cardHolderString-НетИмя и фамилия держателя карты
pubKeyString-НетОткрытый ключ

NewPaymentMethodStoredCardParams

Название свойстваТип данныхЗначение по умолчаниюНеобязательноОписание
storedPaymentIdString-НетНомер связки для карты
cvcString-НетСекретный код карты
pubKeyString-НетОткрытый ключ

TokenResult

Название свойстваТип данныхЗначение по умолчаниюНеобязательноОписание
tokenString-НетТокен как строка
errorsMap<ParamField, String>-НетОшибка при генерации токена

Ошибки валидации полей

ParamFieldОшибкаОписание
PANrequiredУказано пустое поле
invalidНекорректное значение
invalid-formatИспользуются недопустимые символы. Доступны только цифры.
CVCrequiredУказано пустое поле
invalidНекорректное значение
EXPIRYrequiredУказано пустое поле
invalidНекорректное значение
invalid-formatФормат не соответствует шаблону MM/YY.
CARDHOLDERrequiredУказано пустое поле
invalidНекорректное значение
invalid-formatИспользуются недопустимые символы. Доступны только буквы и пробелы.
PUB_KEYrequiredУказано пустое поле
STORED_PAYMENT_IDrequriredУказано пустое поле
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)
Категории:
eCommerceSDK
Beta
Категории
Результаты поиска