Подключение оплаты через платежный токен

Общая информация

Схема работы

  1. Пользователь нажимает кнопку оплаты в приложении.
  2. Пользователь переходит на экран платежной формы Яндекс Пэй, где отображается информация о заказе и способы оплаты:

    • Список банковских карт пользователя.
    • Варианты оплаты через систему быстрых платежей (СБП).
  3. Пользователь выбирает способ оплаты и нажимает кнопку подтверждения заказа.

  4. Сервис формирует платежный токен и возвращает его в качестве успешного результата.
  5. Продавец получает платежный токен и самостоятельно проводит платеж через платежный шлюз.

flow

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

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

Примечание

Если ваш проект имеет minSdkVersion 23 или ниже, то прочитайте пункт о поддержке младших версий устройств.

Шаг 1. Выполните настройку окружения

Смотрите документацию о том, как подготовить проект к интеграции.

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

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

dependencies{
    implementation "com.yandex.pay:token:2.1.0"
}

Шаг 3. Получите объект платежной сессии

При помощи функции getPaymentSession получите объект платежной сессии:

private val yPayConfig: YPayConfig = YPayConfig(
    merchantData = MerchantData(
        id = MerchantId("merchantId"),
        name = MerchantName("merchantName"),
        MerchantUrl = MerchantUrl("https://merchant.com")
    ),
    allowedAuthMethods = listOf(
        AuthMethod.PanOnly,
        AuthMethod.CloudToken
    ),
    allowedCardNetworks = listOf(CardNetwork.MIR, CardNetwork.VISA),
    environment = YPayApiEnvironment.PROD
)

private val paymentSession: PaymentSession = YPay.getPaymentSession(
    context = this,
    config = yPayConfig,
    sessionKey = "sessionKey" // является необязательным для реализации на Kotlin
)
private YPayConfig yPayConfig = new YPayConfig(
    new MerchantData(
        new MerchantId("merchantId"),
        new MerchantName("merchantName"),
        new MerchantUrl("https://merchant.com")
    ),
    Arrays.asList(AuthMethod.PanOnly,AuthMethod.CloudToken),
    Arrays.asList(CardNetwork.MIR,CardNetwork.VISA),
    YPayApiEnvironment.PROD
    )

private PaymentSession paymentSession=YPay.INSTANCE.getPaymentSession(
    context = this,
    config = yPayConfig
)

При получении PaymentSession необходимо передать:

  • Context - контекст приложения или Activity.
  • YPayConfig - данный конфигурации Яндекс Пэй SDK.
  • PaymentSessionKey - ключ платежной сессии.

При создании YPayConfig необходимо передать:

  • merchantData - данные продавца:
    • id - уникальный идентификатор продавца. Его можно получить при регистрации продавца в сервисе Яндекс Пэй.
    • name - имя продавца, которое будет отображаться у пользователя.
    • url - URL продавца, который будет отображаться у пользователя.
  • allowedAuthMethods - способы проведения платежа, где:
    • PanOnly - платеж по карточным данным.
    • CloudToken - платеж по токенам.
  • allowedCardNetworks - доступные платежные системы для оплаты.
  • environment - Окружение для проведения платежей.
    • PROD - production окружение.
    • SANDBOX - тестовое окружение.

Шаг 4. (опционально) Разместите кнопку Яндекс Пэй на экране

Разместите кнопку в вашей верстке:

<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.token.YPayButton
        android:id="@+id/y_pay_button"
        android:layout_width="300dp"
        android:layout_height="54dp"
        android:layout_marginTop="4dp"
        app:ypay_color_scheme="by_theme"
        app:ypay_corner_radius="4dp" />

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

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

При инициализации view компонентов свяжите текущий объект сессии с кнопкой при помощи объекта класса PaymentSession и его функции bindTo:

fun initViews() {
    paymentSession.bindTo(yPayButton)
}
void initViews(){
    paymentSession.bindTo(yPayButton);
}

После привязки кнопка сможет показывать персонализированные данные пользователя.

Шаг 5. Инициализируйте контракт запуска Яндекс Пэй

Для получения результата работы сервиса необходимо инициализировать специальный контракт.

private val yandexPayLauncher = registerForActivityResult(YPayContract()) { result: YPayResult ->
    when (result) {
        is YPayResult.Success -> {
            val token = result.paymentToken
            //send token in psp for continue payment
            handleResult("Finished with success");
        }
        is YPayResult.Cancelled -> {
            handleResult("Finished with cancelled event");
        }
        is YPayResult.Failure -> {
            handleResult("Finished with domain error");
        }
    }
}
private final ActivityResultLauncher<YPayContractParams> launcher
    = registerForActivityResult(new YPayContract(), yPayResult -> {
    if(yPayResult instanceof YPayResult.Cancelled) {
        handleResult("Finished with cancelled event");

    } else if (yPayResult instanceof YPayResult.Success) {
        PaymentToken token = (YPayResult.Success yPayResult).paymentToken
        //send token in psp for continue payment
        handleResult("Finished with success");

    } else if (yPayResult instanceof YPayResult.Failure) {
        handleResult("Finished with domain error");
    }
    });

Шаг 6. Сформируйте данные для запуска Яндекс Пэй

Перед запуском Яндекс Пэй сформируйте платежные данные при помощи класса YPayContractParams.

val tokenData = TokenData(
    order = Order(
        id = OrderId("orderId"),
        amount = Amount("100.00"),
        label = "label",
        items = listOf<OrderItem>(
            OrderItem(
                label = "product 1",
                amount = Amount("100.00"),
                type = OrderItemType.Pickup,
                quantity = OrderItemQuantity(
                    count = 1,
                    label = "order item label"
                )
            )
        )
    ),
    paymentMethods = listOf<PaymentMethod>(
        PaymentMethod(
            allowedAuthMethods = listOf(AuthMethod.PanOnly, AuthMethod.CloudToken),
            type = PaymentMethodType.Card,
            gateway = Gateway("gatewayName"),
            allowedCardNetworks = CardNetwork.values().toList(),
            gatewayMerchantId = GatewayMerchantId("MerchantGW1"),
        )
    ),
    requiredFields = RequiredFields(RequiredBillingContact(email = true)),
    currencyCode = CurrencyCode.RUB,
    countryCod = CountryCode.RU
)

val contractParams = YPayContractParams(
    session = paymentSession,
    tokenData = tokenData
)
TokenData tokenData = new TokenData(
         new Order(
            new OrderId("orderId"),
            new Amount("100.00"),
            "label",
            Arrays.asList(new OrderItem(
                "product 1",
                new Amount("100.00"),
                OrderItemType.Pickup,
                new OrderItemQuantity(1,"order item label")
            )
        )
    ),
    Arrays.asList(new PaymentMethod(
        Arrays.asList(AuthMethod.PanOnly,AuthMethod.CloudToken),
        PaymentMethodType.PanOnly,
        new Gateway("gatewayName"),
        Arrays.asList(CardNetwork.MIR,...,CardNetwork.VISA),
        new GatewayMerchantId("MerchantGW1")
        )
    ),
    new RequiredFields(new RequiredBillingContact(true)),
    CurrencyCode.RUB,
    CountryCode.RU
    )

YPayContractParams = new YPayContractParams(paymentSession,tokenData)

Для создания YPayContractParams необходимо передать в конструктор:

  • платежную сессию, полученную в 3 шаге.
  • Данные для создания платежного токена TokenData.

TokenData собирает в себе все необходимые данные, для создания платежного токена:

  • order - заказ покупателя, принимает в себя:
    • orderId - идентификатор заказа.
    • amount - общая сумма заказа.
    • label - название заказа.
    • items - список товаров OrderItem, принадлежащий заказу, где предмет заказа содержит в себе поля:
      • label- название товара.
      • amount - цена товара.
      • type - тип товара. Может быть:
        • Pickup - единичный товар.
        • Shipping - доставка товара.
        • Discount - скидка, которую предлагает магазин.
        • Promocode - промокод, введенный покупателем и дающий специальную скидку.
      • quantity - количество данного товара, где поля OrderItemQuantity:
        • count - число, указывающие на количество товара.
        • label - количественное название товара.
  • paymentMethods - список доступных методов оплаты, где метод оплаты PaymentMethod содержит поля:
    • allowedAuthMethods - доступные методы оплаты в шлюзе:
      • PanOnly - оплата через номер карты.
      • CloudToken - оплата по платежному токену.
    • type - чем будет производить оплату клиент. На даннй момент доступна только оплата по карте.
    • gateway - название платежного шлюза.
    • allowedCardNetworks - список доступных платежных систем для оплаты.
    • gatewayMerchantId - уникальный id магазина в указанном платежном шлюзе.
  • requiredFields - дополнительные поля. На данный момент доступно только включение платежных контактов через класс RequiredBillingContact.
  • currencyCode - валюта, в которой будет происходить сделка.
  • countryCode - код локализации, в которой продавец желает проводить оплату.

Шаг 7. Запустите сервис Яндекс Пэй

Используя лаунчер контракта, полученный в шаге 5, передайте в него созданные данные, полученные в шаге 6 и запустите контракт

launcher.launch(contractParams)
launcher.launch(contractParams)

Шаг 8. Обработайте результат

После запуска сервиса откроется форма Яндекс Пэй, в рамках которой будет проведено создание платежного токена

Получите результат как это указано в пятом шаге и обработайте его