• Android SDK 21+
• Target SDK 34
• Gradle и Gradle Wrapper (версия 8+ или выше)
• DS Granat 2.1.+
При использовании личного устройства для корректной работы потребуется настроить VPN и добавить сертификаты МТС, настройка описана здесь «Настройка VPN и добавление сертификатов МТС»).
В корневом build.gradle проекта добавить репозиторий MTS Pay SDK и Дизайн Системы (если отсутствует)
allprojects {
repositories {
// MTS Pay SDK
maven {
url "https://artifactory.mts.ru/artifactory/mts-pay-sdk-mtspay-maven-local/"
}
// Дизайн система
maven {
url "https://artifactory.mts.ru/artifactory/android-designsystem-maven-local/"
}
// Для библиотек сканирования карт
maven {
url "https://artifactory.mts.ru/artifactory/android-common-libs-mtspay-maven-local/"
}
}
}
Добавьте зависимость в файл build.gradle модуля, который будет работать с SDK
implementation "ru.mts.paysdk:mts-pay-ui:2.12.0"
Если вы не распространяете приложения для платформ x86-64, исключите из сборку соответствующую зависимость
implementation ("ru.mts.paysdk:mts-pay-ui:2.12.0") {
exclude group: "ru.mts.cameracardreader", module: "camera-card-reader-x86-64"
}
Так же появилась возможность полностью исключить камеру из сборки. В таком случае функционал камеры не будет доступен и не отразится в интерфейсе
implementation ("ru.mts.paysdk:mts-pay-ui:2.12.0"" {
exclude group: "ru.mts.cameracardreader", module: "camera-card-reader"
exclude group: "ru.mts.cameracardreader", module: "camera-card-reader-x86-64"
}
Необходимо сконфигурировать и передать идентификатор платежной сессии и ssoTokenId клиента (в случае авторизованного платежа для оплаты по привязанным платежным инструментам)
Привязанные карты и МТС Логин
Если необходимо дать клиенту возможность платежа с привязанных к профилю банковских карт (в том числе карт аккаунта МТС Банка, если он привязан к профилю), тогда для интеграции необходимо наличие валидного id_token МТС Логин, который генерируется в процессе аутентификации пользователя в интегрируемом приложении. Обязательным условием получения id_token является наличие значения openid в параметре scope URL авторизации МТС Логин (scope=openid). Ссылка на документацию сервиса МТС логин. Этот id_token необходимо будет передавать при инициализации SDK в параметр с наименованием ssoTokenId.
Для сценария оплаты по созданной сессии в объект MTSPayInitOptions необходимо обязательно передать в параметр sessionOptions — объект MTSPaySessionOptions
val options = MTSPayInitOptions(
ssoTokenId = "***webssotokenid***", // необязательный параметр, в случае если он указан дополнительно отобразим сохраненные платежные инструменты пользователя
nightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, // необязательный параметр для ночного режима, если он не указан - будут использоваться автоматические настройки из системы
isSupportAvailable = true, // Если указана поддержка, будет отображаться кнопка "Обратиться в поддержку". При ее нажатии вернется Action SHOULD_OPEN_SUPPORT sessionOptions = MTSPaySessionOptions( // объект для сценария олаты по сессии
sessionId = "sessionId" //Обязательный параметр. Id созданной сессии на вашей стороне.
)
)
Для сценария пополнения счета в объект MTSPayInitOptions необходимо обязательно передать в параметр refillOptions — объект MTSPayRefillOptions. В параметр service, объекта MTSPayRefillOptions, можно передать объекта MTSPayRefillServiceOptions, в таком случае возможны следующие варианты инициализации SDK:
val options = MTSPayInitOptions(
ssoTokenId = "***webssotokenid***", // необязательный параметр, в случае если он указан дополнительно отобразим сохраненные платежные инструменты пользователя
nightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, // необязательный параметр для ночного режима, если он не указан - будут использоваться автоматические настройки из системы
isSupportAvailable = true, // Если указана поддержка, будет отображаться кнопка "Обратиться в поддержку". При ее нажатии вернется Action SHOULD_OPEN_SUPPORT
refillOptions = MTSPayRefillOptions( // Обязательный параметр для сценария пополнения счета
serviceToken = "serviceToken", // Обязательный параметр. Токен вашего сервиса
amount = BigDecimal(10.20), // Необязательный параметр. Предустановленная сумма оплаты
service = MTSPayRefillServiceOptions( // Необязательный объект для предустановленных параметров
serviceAlias = "Название предвыбранного сервиса оплаты", // Необязательный параметр.
phone = "9123456789", // Необязательный параметр. Номер телефона 10 цифр без кода страны
bill = "123456789" // Необязательный параметр. 9-ти или 11..13-ти значный номер лицевого счета
)
)
)
Для сценария пополнения карт Льюис в объект MTSPayLewisInitOptions необходимо обязательно передать следующие параметры:
• serviceToken — идентификатор сервисного токена приложения пополнения карты (обязательный параметр)
• phone — номер телефона (только цифры, 11 символов) (обязательный параметр). Пример: «79030000050»
• cardId — идентификатор карты, которую будут пополнять (обязательный параметр). Пример: «100000000069»
• maskedPan — маскированный номер карты (обязательный параметр). Пример: «220208******5253»
val options = MTSPayInitOptions(
lewisOptions = MTSPayLewisInitOptions(
serviceToken = "serviceToken", // Обязательный параметр. Токен вашего сервиса
phone = "phone", // Обязательный параметр. Номер телефона 11 цифр с кодом страны
cardId = "cardId", // Обязательный параметр. Идентификатор карты, которую будут пополнять
maskedPan = "maskedPan", // Обязательный параметр. Маскированный номер карты
refillOptions = MTSPayRefillOptions( // Обязательный параметр для сценария пополнения счета
serviceToken = "serviceToken", // Обязательный параметр. Токен вашего сервиса
amount = BigDecimal(10.20), // Необязательный параметр. Предустановленная сумма оплаты
service = MTSPayRefillServiceOptions( // Необязательный объект для предустановленных параметров
serviceAlias = "Название предвыбранного сервиса оплаты", // Необязательный параметр.
phone = "9123456789", // Необязательный параметр. Номер телефона 10 цифр без кода страны
bill = "123456789" // Необязательный параметр. 9-ти или 11..13-ти значный номер лицевого счета
)
)
)
)
Используйте объект MTSPaySelectedPaymentTool:
• @param selectedPaymentToolType используйте параметры из PaymentToolComplexType
• @param selectedPaymentToolId обязателен если используете PaymentToolComplexType.E_WALLET_BINDING
data class MTSPaySelectedPaymentTool(
val selectedPaymentToolType: PaymentToolComplexType,
val selectedPaymentToolId: String? = null
) : Serializable
Передайте объект в MTSPayInitOptions или MTSPayMiniWidgetInitOptions(если инициализируете минивиджет)
По завершению работы SDK с кодом MTSPaySdkUI.MTS_PAY_RESULT_MESSAGE вовзращается объект MTSPayResultMessage
class MTSPayResultMessage(
val resultType: MTSPayResultType, // enum PAY_SUCCESS - успешная оплата, PAY_ERROR - ошибка при оплате, PAY_USER_CANCEL - отменено пользователем
val paymentId: String? = null, // Id платежа если платеж был успешным PAY_SUCCESS
val sessionId: String? = null, // Id сессии
val action: MTSPayActionType = MTSPayActionType.NOTHING, // Необходимые действия по окончанию работы SDK: SHOULD_OPEN_AUTO_PAYMENT_SETTINGS - не обходимо открыть страницу с настройками автоплатежей, SHOULD_OPEN_SUPPORT - необходимо открыть страницу поддержки пользователя
val error: ErrorDomainModel? = null // объект ошибки если платеж завершился с ошибкой PAY_ERROR
) : Serializable
Пример CallBack’a resultLauncher
private var resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
MTSPaySdkUI.release()
when (result.resultCode) {
MTSPaySdkUI.MTS_PAY_RESULT_CODE -> {
result.data?.getSerializableExtra(MTSPaySdkUI.MTS_PAY_RESULT_MESSAGE)
?.let { message ->
message as MTSPayResultMessage
when (message.resultType) {
MTSPayResultType.PAY_SUCCESS -> {
// Успешный результат
}
MTSPayResultType.PAY_ERROR -> {
// Ошибка при оплате. ошибка в message.error
}
MTSPayResultType.PAY_USER_CANCEL -> {
//пользователь вышел из модуля не завершив оплату
}
}
checkAction(message.action)
}
}
}
}
private fun checkAction(mtsPayActionType: MTSPayActionType) {
when (mtsPayActionType) {
MTSPayActionType.SHOULD_OPEN_AUTO_PAYMENT_SETTINGS -> {}
MTSPayActionType.SHOULD_OPEN_SUPPORT -> {}
MTSPayActionType.NOTHING -> {}
}
}
Боевой сервер
val environment = MTSPaySdkEnvironment.Production(
showLog = true // Необязательный параметр. По умолчанию false. Показывает логи запросов
)
Сервер для тестирования функционала
val environment = MTSPaySdkEnvironment.Stage(
showLog = true // Необязательный параметр. По умолчанию true. Показывает логи запросов
)
Для старта оплаты, необходимо передать выше указанные параметры
MTSPaySdkUI.startMTSPaySdkActivity(
requireContext(), // Обязательный параметр
options, // Обязательный параметр. Параметры оплаты
resultLauncher, // Обязательный параметр. CallBack`a для получения результата работы SDK
environment // НЕ обязательный параметр. По умолчанию инициализруется MTSPaySdkEnvironment.Production()
)
Для асинхронного получения token в SDK — имплементируйте интерфейс AsyncAuthProvider из MTS Pay SDK. Вашу реализацию передайте в SDK
interface AsyncAuthProvider {
fun getToken(): Observable<String>
}
........
class AsyncAuthProviderImpl() : AsyncAuthProvider {
override fun getToken(): Observable<String> {
return //ваша реализация получение token
}
}
........
MTSPaySdkUI.setAsyncAuthProvider(AsyncAuthProviderImpl())
}
Отправка аналитических метрик реализуется на стороне хост-приложения. Хост-приложение обогащает получаемые от модуля события всей необходимой информацией, такой как идентификаторы пользователя и прочее.
Для получения метрик необходимо передать объект, реализующий интерфейс MTSPayEventListener.
Пример реализации и обогащение данными cо стороны интегратора
interface MTSPayEventListener {
fun onNewEvent(event: MTSPayEvent)
}
............
class EventListener() : MTSPayEventListener {
override fun onNewEvent(event: MTSPayEvent) {
event.toBundle().apply {
"ваш" to "евент" // обогащение вашими данными
}
}
}
.............
MTSPaySdkUI.setAnalyticsEventListener(EventListener())
}