Интеграция Yandex Pay Android SDK

Yandex Pay Android SDK — это библиотека, которая позволяет устанавливать кнопку оплаты Yandex Pay в ваше приложение и начинать принимать платежи от пользователей.

Требования к подключению

Поддерживаемая версия: Android 6.0 Marshmallow и выше.

Шаг 1. Получите YANDEX_CLIENT_ID

  1. Получите значение хеша SHA256 с помощью утилиты keytool:

    keytool -list -v -alias <your-key-name> -keystore <path-to-production-keystore>.
    

    После ввода команды значение хеша отобразится в блоке Certificate fingerprints: SHA256.

  2. Перейдите по ссылке https://oauth.yandex.ru/.

  3. Нажмите кнопку Создать приложение.

  4. Укажите название сервиса.

  5. Выберите платформу Android и укажите Android package name (уникальное имя приложения applicationId) и значение хеша в поле SHA256 Fingerprints.

  6. В блоке Какие данные вам нужны? выберите Yandex PayОплата через Yandex Pay.

  7. Нажмите кнопку Создать приложение.

Шаг 2. Подключите SDK

  1. Укажите зависимость в ваших сборочных скриптах:

    dependencies {
      implementation 'com.yandex.pay:core:0.2.1'
    }
    
  2. Укажите полученный YANDEX_CLIENT_ID в сборочном скрипте build.gradle в качестве значения в manifestPlaceholders:

    android {
      defaultConfig {
        manifestPlaceholders = [
          // Подставьте ваш yandex_client_id
          YANDEX_CLIENT_ID: "12345678901234567890",
        ]
      }
    }
    

Шаг 3. Инициализируйте библиотеку

До первого использования YandexPayLib, в том числе до первого отображения кнопки Yandex Pay, выполните следующий код:

if (YandexPayLib.isSupported) {
    YandexPayLib.initialize(
        context = this,
        config = YandexPayLibConfig(
            merchantDetails = Merchant(
                id = MerchantID.from("bbb9c171-2fab-45e6-b1f8-6212980aa9bb"),
                name = "MERCHANT_NAME",
                url = "https://merchant.com/",
            ),
            environment = YandexPayEnvironment.PROD,
            locale = YandexPayLocale.SYSTEM,
            logging = true
        )
    )
}

При инициализации SDK передайте YandexPayLibConfig:

  • merchantDetails — данные продавца Merchant:

    • id — идентификатор продавца (для тестового окружения можно использовать идентификатор тестового магазина: bbb9c171-2fab-45e6-b1f8-6212980aa9bb).
    • name — наименование продавца, которое будет отображаться у пользователя.
    • url — URL продавца, который будет отображаться у пользователя.
  • environment — среда выполнения Yandex Pay SDK:

    • PROD — production окружение.
    • SANDBOX— тестовое окружение.
  • locale — выбор локализации для Yandex Pay SDK:

    • SYSTEM — согласно системным настройкам: RU или EN.
    • RU — всегда RU вне зависимости от системных настроек.
    • EN — всегда EN вне зависимости от системных настроек.
  • logging — признак того, нужно ли записать в лог событие.

Шаг 4. Разместите кнопку Yandex Pay на экране

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <com.yandex.pay.core.ui.YandexPayButton
        android:id="@+id/button"
        android:layout_width="300dp"
        android:layout_height="54dp"
        android:layout_marginTop="4dp"
        app:yandexpay_color_scheme="by_theme"
        app:yandexpay_corner_radius="4dp"
     />

При создании кнопки можно передать значения атрибутов:

  • yandexpay_color_scheme позволяет определить цветовую гамму кнопки. Возможные значения:

    • by_theme — цветовая гамма адаптируется в зависимости от темы в системе.
    • light — всегда светлая цветовая гамма.
    • dark — всегда темная цветовая гамма.
  • yandexpay_corner_radius позволяет определить закругление кнопки, значение передается в dp.

При добавлении кнопки на экран (onAttachedToWindow) она посылает запрос на обновление данных профиля.

Шаг 5. Зарегистрируйте контракт запуска Yandex Pay

Более подробно узнать о подходе можно узнать в документации.

При регистрации контракта добавьте callback с получением результата YandexPayResult:

private val yandexPayLauncher = registerForActivityResult(OpenYandexPayContract()) { result ->
        when (result) {
            is YandexPayResult.Success -> showToast("token: ${result.paymentToken}")
            is YandexPayResult.Failure -> when (result) {
                is YandexPayResult.Failure.Validation -> showToast("failure: ${result.details}")
                is YandexPayResult.Failure.Internal -> showToast("failure: ${result.message}")
            }
            is YandexPayResult.Cancelled -> showToast("cancelled")
        }
    }

Шаг 6. Задайте обработчик кнопки

val button = findViewById(R.id.button)
button.setOnClickListener { ->

  // Детали заказа
  val orderDetails = OrderDetails(
    Order(
      // ID заказа
      OrderID.from("ORDER1"),
      // Общая цена
      Amount.from("150000.00"),
      // Метка заказа (для пользователя)
      "ORDER 1",
      // Элементы заказа. Можно передать пустой список.
      // В случае передачи хотя бы одного элемента пройдет валидация суммы
      listOf(
        OrderItem(
          // Название элемента
          label = "item1",
          // Цена элемента
          amount = Amount.from("50000.00"),
          // Тип элемента
          type = OrderItemType.Pickup,
          // Данные о количестве элемента
          quantity = OrderItemQuantity(1),
        ),
          OrderItem(
          label = "item2",
          amount = Amount.from("100000.00"),
          type = OrderItemType.Shipping,
          quantity = OrderItemQuantity(1)
        )
      ),
    ),
    // Список доступных платежных методов в вашем PSP
    listOf(
      PaymentMethod(
        // Что будет содержаться в платежном токене: зашифрованные данные банковской карты
        // или токенизированная карта
        listOf(AuthMethod.PanOnly),
        // Метод оплаты
        PaymentMethodType.Card,
        // ID поставщика платежных услуг
        Gateway.from("gatewayID"),
        // Список поддерживаемых платежных систем
        listOf(CardNetwork.Visa, CardNetwork.MasterCard, CardNetwork.MIR),
        // ID продавца в системе поставщика платежных услуг
        GatewayMerchantID.from("MerchantGW1"),
      ),
    ),
  )

  // запустите сервис с помощью лаунчера, передав сформированные orderDetails
  yandexPayLauncher.launch(orderDetails)

}

Шаг 7. Передайте полученный токен

Передайте YandexPayResult.Success.paymentToken поставщику платежных услуг.