Подключение оплаты через платежный токен
- Общая информация
- Шаг 1. Выполните настройку окружения
- Шаг 2. Подключите Yandex Pay SDK
- Шаг 3. Получите объект платежной сессии
- Шаг 4. (опционально) Разместите кнопку Яндекс Пэй на экране
- Шаг 5. Инициализируйте контракт запуска Яндекс Пэй
- Шаг 6. Сформируйте данные для запуска Яндекс Пэй
- Шаг 7. Запустите сервис Яндекс Пэй
- Шаг 8. Обработайте результат
Общая информация
Схема работы
- Пользователь нажимает кнопку оплаты в приложении.
-
Пользователь переходит на экран платежной формы Яндекс Пэй, где отображается информация о заказе и способы оплаты:
- Список банковских карт пользователя.
- Варианты оплаты через систему быстрых платежей (СБП).
-
Пользователь выбирает способ оплаты и нажимает кнопку подтверждения заказа.
- Сервис формирует платежный токен и возвращает его в качестве успешного результата.
- Продавец получает платежный токен и самостоятельно проводит платеж через платежный шлюз.
Требования к подключению
Поддерживаемая версия: 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. Обработайте результат
После запуска сервиса откроется форма Яндекс Пэй, в рамках которой будет проведено создание платежного токена
Получите результат как это указано в пятом шаге и обработайте его