Подключение оплаты по платежной ссылке
- Общая информация
- Шаг 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.
Пример
// Не забудьте объявить MyApplication в AndroidManifest.xml в блоке <application/>, используя android:name
class MyApplication: Application() {
    override fun onCreate() {
        // Инициализируется в каждом процессе приложения
        FirebaseApp.initializeApp(this)
    }
}
Подробнее о взаимодействии можно прочитать в статье После обновления Firebase до версии 31+ перестала работать AppMetrica.
Шаг 4. Подключите Yandex Pay SDK
Укажите зависимость в ваших сборочных скриптах build.gradle:
dependencies {
    implementation 'com.yandex.pay:pay:2.9.0'
}
Шаг 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 Яндекс Пэй.