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

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

Примечание

Начиная с версии 2.3.0-alpha01 SDK переведен на новую схему работы. Подробнее можно узнать в этой статье.

Схема работы

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

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

  4. Сервис Яндекс Пэй проводит платеж и возвращает результат выполнения операции.

Полная оплата

flow

Оплата в сплит

flow

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

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

Примечание

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

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

  • Merchant ID
  • SHA256 Fingerprints
  • Client ID (YANDEX_CLIENT_ID)
  • Android package name (applicationId)

Шаг 1. Получите необходимые идентификаторы

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

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

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

  2. Для регистрации приложения перейдите в сервис Яндекс OAuth.

  3. В поле Название вашего сервиса укажите название, которое будет видно пользователям на экране авторизации.

  4. В разделе Платформы приложения выберите Android-приложение и укажите его параметры:

    • Android package name — уникальное имя приложения из applicationId в конфигурационном файле проекта;
    • SHA256 Fingerprints — значение хеша SHA256, полученное в пункте 1. Все буквы в хеше должны быть заглавными.
  5. Убедитесь, что на Яндекс OAuth у вашего приложения добавлен доступ к Яндекс Пэй. Для этого в блоке Доступ к данным в поле Название доступа выберите Оплата через Yandex Pay.

  6. Нажмите кнопку Создать приложение и скопируйте значение поля Client ID.

  7. На странице Настройки личного кабинета Яндекс Пэй укажите значения 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;
  • потребуется дополнительная настройка окружения по шагам ниже.
  1. Подключите зависимость SDK в build.gradle вашего проекта:

    dependencies{
        ...
        implementation "com.yandex.pay:*pay/other*:*version*"
        ...
    }
    
  2. Синхронизируйте проект и попробуйте собрать его. У вас должна появиться ошибка слияния манифестов:

    Manifest merger failed : uses-sdk:minSdkVersion *Your min version* cannot be smaller than version 24 declared in library
    
  3. Откройте AndroidManifest.xml файл того модуля, в котором вы подключаете зависимость и перечислите все библиотеки, попадающие в эту ошибку.

    Пример:

    <manifest xmlns:tools="http://schemas.android.com/tools">
        <uses-sdk tools:overrideLibrary="com.yandex.pay, ...* other libraries *... ,com.yandex.pay.base"/>
    </manifest>
    
  4. Проверьте доступность поддержки SDK через объект YPay и инициализируйте все необходимые компоненты после проверки:

    if (YPay.isSupported){
        // init Yandex pay
    } else {
        // do some other logic
    }
    

    Важно

    Проверяйте доступность YPay.isSupported при каждом обращении к SDK Яндекс Пэй.

Предыдущая
Следующая