Подключение оплаты по платежной ссылке
- Общая информация
- Шаг 1. Получите необходимые идентификаторы
- Шаг 2. Подключите Client ID
- Шаг 3. Инициализируйте FirebaseApp во всех процессах приложения
- Шаг 4. Подключите Yandex Pay SDK
- Шаг 5. Получите объект платежной сессии
- Шаг 6. (опционально) Разместите кнопку Яндекс Пэй на экране
- Шаг 7. Инициализируйте контракт запуска Яндекс Пэй
- Шаг 8. Сформируйте данные для запуска Яндекс Пэй
- Шаг 9. Запустите сервис Яндекс Пэй
- Шаг 10. Обработайте результат
- Настройка для устройств с версией ниже 7.0
Общая информация
Примечание
Начиная с версии 2.3.0-alpha01 SDK переведен на новую схему работы. Подробнее можно узнать в этой статье.
Схема работы
- Пользователь нажимает на кнопку оплаты в приложении.
-
Пользователь переходит на экран платежной формы Яндекс Пэй, где отображается информация о заказе и способы оплаты:
- список банковских карт пользователя;
- варианты оплаты через систему быстрых платежей (СБП).
-
Пользователь выбирает способ оплаты и нажимает на кнопку подтверждения заказа.
- Сервис Яндекс Пэй проводит платеж и возвращает результат выполнения операции.
Полная оплата
Оплата в сплит
Требования к подключению
Поддерживаемая версия: Android 7.0 и выше.
Примечание
Если ваш проект имеет minSdkVersion 23 или ниже, то прочитайте пункт о поддержке младших версий устройств.
Перед началом интеграции нужно получить и добавить в проект несколько идентификаторов:
- Merchant ID
- SHA256 Fingerprints
- Client ID (
YANDEX_CLIENT_ID
) - Android package name (
applicationId
)
Шаг 1. Получите необходимые идентификаторы
-
Получите значение хеша SHA256 Fingerprints с помощью утилиты
keytool
:keytool -list -v -alias <your-key-name> -keystore <path-to-production-keystore>
После ввода команды значение хеша отобразится в блоке
Certificate fingerprints: SHA256
. -
Для регистрации приложения перейдите в сервис Яндекс OAuth.
-
В поле Название вашего сервиса укажите название, которое будет видно пользователям на экране авторизации.
-
В разделе Платформы приложения выберите Android-приложение и укажите его параметры:
- Android package name — уникальное имя приложения из
applicationId
в конфигурационном файле проекта; - SHA256 Fingerprints — значение хеша SHA256, полученное в пункте 1. Все буквы в хеше должны быть заглавными.
- Android package name — уникальное имя приложения из
-
Убедитесь, что на Яндекс OAuth у вашего приложения добавлен доступ к Яндекс Пэй. Для этого в блоке Доступ к данным в поле Название доступа выберите Оплата через Yandex Pay.
-
Нажмите кнопку Создать приложение и скопируйте значение поля Client ID.
-
На странице Настройки личного кабинета Яндекс Пэй укажите значения Client ID, SHA256 и Android package name в полях Client ID, SHA256 Fingerprint и Android package name соответственно.
Шаг 2. Подключите Client ID
Укажите полученный Client ID в сборочном скрипте build.gradle
в manifestPlaceholders
в качестве значения YANDEX_CLIENT_ID
:
android {
defaultConfig {
manifestPlaceholders = [
// Подставьте ваш Client ID
YANDEX_CLIENT_ID: "12345678901234567890",
]
}
}
Шаг 3. Инициализируйте FirebaseApp во всех процессах приложения
Мобильный SDK использует службы AppMetrica, которые необходимы для стабильной работы SDK. Этот шаг позволяет исправить проблемы совместимости сервисов Firebase и сервисов метрик.
При использовании Firebase вместе с Яндекс Пэй SDK необходимо вызывать FirebaseApp.initialize(context)
во всех процессах приложения.
Если вы используете AppMetrica в своем приложении, активировать YandexMetrica необходимо после инициализации Firebase.
Пример
// don`t forget declare MyApplication in AndroidManifest.xml in <application/> block using android:name
class MyApplication: Application() {
override fun onCreate() {
// inited at every app processes
FirebaseApp.initializeApp(this)
}
}
Подробнее о взаимодействии можно прочитать в статье После обновления Firebase до версии 31+ перестала работать AppMetrica.
Шаг 4. Подключите Yandex Pay SDK
Укажите зависимость в ваших сборочных скриптах build.gradle
:
dependencies {
implementation 'com.yandex.pay:pay:2.3.10'
}
Шаг 5. Получите объект платежной сессии
При помощи функции getYandexPaymentSession
получите объект платежной сессии:
private val yaPayConfig = YPayConfig(
merchantData = MerchantData(
id = MerchantId("merchantId"),
name = MerchantName("merchantName"),
url = MerchantUrl("https://merchant.com/"),
),
environment = YPayApiEnvironment.PROD,
)
private val paymentSessionKey = PaymentSessionKey(
generateSessionKey()
)
private val paymentSession: PaymentSession = YPay.getYandexPaymentSession(
context = this,
config = yaPayConfig,
sessionKey = paymentSessionKey // является необязательным в реализации на Kotlin
)
private YPayConfig getPayConfig() {
return new YPayConfig(
new MerchantData(
new MerchantId("merchantId"),
new MerchantName("MERCHANT_NAME"),
new MerchantUrl("https://merchant.com/")
),
YPayApiEnvironment.PROD
);
}
private PaymentSessionKey getPaymentSessionKey() {
return new PaymentSessionKey(
generateSessionKey()
);
}
private PaymentSession getPaymentSession() {
return YPay.INSTANCE.getYandexPaymentSession(
this,
getPaymentSessionKey(),
getPayConfig()
);
}
При получении PaymentSession
необходимо передать:
Context
— контекст приложения или Activity;PaymentSessionKey
- ключ платежной сессии;YPayConfig
— данные конфигурации Yandex Pay SDK.
При создании YPayConfig
необходимо передать:
-
merchantData
— данные продавца:id
— уникальный идентификатор продавца. Его можно получить при регистрации продавца в сервисе Яндекс Пэй;name
— наименование продавца, которое будет отображаться у пользователя;url
— URL продавца, который будет отображаться у пользователя.
-
environment
— среда выполнения Yandex Pay SDK:PROD
— production окружение;SANDBOX
— тестовое окружение.
Шаг 6. (опционально) Разместите кнопку Яндекс Пэй на экране
Разместите кнопку в вашей верстке:
<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.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
:
Передайте дополнительно SessionListenerArgs, в котором укажите платежные способы для пользователя.
fun initViews() {
paymentSession.bindTo(yPayButton, SessionListenerArgs(listOf(PaymentMethodType.CARD,PaymentMethodType.SPLIT)))
}
void initViews() {
getPaymentSession().bindTo(yPayButton);
}
Шаг 7. Инициализируйте контракт запуска Яндекс Пэй
При инициализации контракта добавьте callback с получением результата YPayResult
:
private val yandexPayLauncher = YPayLauncher(this) { result: YPayResult ->
when (result) {
is YPayResult.Success -> showToast("Finished with success")
is YPayResult.Cancelled -> showToast("Finished with cancelled event")
is YPayResult.Failure -> showToast("Finished with domain error")
}
}
private final YPayLauncher launcher = new YPayLauncher(this, yPayResult -> {
if (yPayResult instanceof YPayResult.Success) {
handleResult("Finished with success");
} else if (yPayResult instanceof YPayResult.Cancelled) {
handleResult("Finished with cancelled event");
} else if (yPayResult instanceof YPayResult.Failure) {
handleResult("Finished with domain error");
}
});
В случае неуспешной оплаты, дополнительно возвращается код ошибки errorMsg
:
Код ошибки | Описание |
---|---|
incorrect payment url |
Неверная платежная ссылка |
transaction error |
Ошибка проведения транзакции |
failed to parse order ID |
Не удалось получить orderId при возврате результата |
invalid intent parsing |
Не удалось получить результат оплаты |
invalid result code |
Неверный код результата оплаты |
unresolved payment strategy |
Не удалось обработать результат оплаты\ так как ваше приложение было убито в фоне |
session key not provided |
Не был предоставлен ключ сессии |
config data not provided |
Не был предоставлен объект СonfigData |
payment data not provided |
Не был предоставлен объект PaymentData |
Шаг 8. Сформируйте данные для запуска Яндекс Пэй
Перед запуском Яндекс Пэй сформируйте платежные данные при помощи класса PaymentData.PaymentUrlFlowData
, а также данные платежной сессии. Сформируйте YPayContractParams
на их основе.
val paymentData = PaymentData.PaymentUrlFlowData(
// Ссылка на оплату заказа, полученная из Pay API
paymentUrl = "payment-url"
)
val params = YPayContractParams(
paymentSession = paymentSession,
paymentData = paymentData,
)
final PaymentData paymentData = new PaymentData.PaymentUrlFlowData(
// Ссылка на оплату заказа, полученная из Pay API
"payment-url"
);
// параметры запуска Яндекс Пэй
final YPayContractParams params = new YPayContractParams(
getPaymentSession(),
paymentData
);
Примечание
Если вы хотите проводить оплату в Сплит, при создании ссылки передайте необходимые параметры в availablePaymentMethods
.
Подробнее про генерацию платежной ссылки можно посмотреть в документации бэкенда.
Шаг 9. Запустите сервис Яндекс Пэй
Запуск через кнопку Яндекс Пэй
Передайте ранее созданный лаунчер в кнопку при помощи функции setOnClickListener
и определите логику его запуска в lambda-выражении. При запуске лаунчера передайте в него параметры YPayContractParams
:
yPayButton.setOnClickListener(yandexPayLauncher) { launcher ->
val params = YPayContractParams(...)
launcher.launch(params)
}
yPayButton.setOnClickListener(yandexPayLauncher, launcher -> {
YPayContractParams params = new YPayContractParams(...);
launcher.launch(params);
});
Важно
У YPayButton создана своя функция setOnClickListener
, всю логику обработки нажатия следует определять в ней. Вызов View.setOnClickListener
приведет к выбросу исключения.
Запуск без кнопки
Запустите сервис с помощью лаунчера, передав параметры запуска YPayContractParams
:
val params = YPayContractParams(...)
yandexPayLauncher.launch(params)
final YPayContractParams params = new YPayContractParams(...);
yandexPayLauncher.launch(params);
Шаг 10. Обработайте результат
После запуска сервиса Яндекс Пэй, SDK выберет оптимальную стратегию и запустит платежную форму, в рамках которой будет проведена оплата. Результат будет получен с помощью контракта запуска YPayLauncher
.
Примечание
При возникновении трудностей с настройкой, посмотрите пример интеграции.
Настройка для устройств с версией ниже 7.0
Владельцы устройств с версиями Android 7.0 (API 24 lvl) и выше могут пользоваться SDK Яндекс Пэй без ограничений. Для устройств с версиями ниже 7.0 возможности ограничены:
- нет официальной поддержки;
- ограничен функционал SDK;
- потребуется дополнительная настройка окружения по шагам ниже.
-
Подключите зависимость SDK в
build.gradle
вашего проекта:dependencies{ ... implementation "com.yandex.pay:*pay/other*:*version*" ... }
-
Синхронизируйте проект и попробуйте собрать его. У вас должна появиться ошибка слияния манифестов:
Manifest merger failed : uses-sdk:minSdkVersion *Your min version* cannot be smaller than version 24 declared in library
-
Откройте AndroidManifest.xml файл того модуля, в котором вы подключаете зависимость и перечислите все библиотеки, попадающие в эту ошибку.
Пример:
<manifest xmlns:tools="http://schemas.android.com/tools"> <uses-sdk tools:overrideLibrary="com.yandex.pay, ...* other libraries *... ,com.yandex.pay.base"/> </manifest>
-
Проверьте доступность поддержки SDK через объект YPay и инициализируйте все необходимые компоненты после проверки:
if (YPay.isSupported){ // init Yandex pay } else { // do some other logic }
Важно
Проверяйте доступность
YPay.isSupported
при каждом обращении к SDK Яндекс Пэй.