Skip to content

tinkoff-mobile-tech/tinkoff-asdk-android

Repository files navigation

Tinkoff Acquiring SDK for Android

Maven Central

Acquiring SDK позволяСт ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-Π­ΠΊΠ²Π°ΠΉΡ€ΠΈΠ½Π³ Tinkoff Π² ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Android.

ВозмоТности SDK:

  • ΠŸΡ€ΠΈΠ΅ΠΌ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ (Π² Ρ‚ΠΎΠΌ числС Ρ€Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½Ρ‹Ρ…);
  • Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ банковских ΠΊΠ°Ρ€Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°;
  • Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ распознаваниС ΠΊΠ°Ρ€Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈΠ»ΠΈ NFC;
  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ ΠΈ сохранСнных ΠΊΠ°Ρ€Ρ‚Π°Ρ…;
  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сохранСнными ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ;
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ;
  • ΠšΠ°ΡΡ‚ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΡ экранов SDK;
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с ΠΎΠ½Π»Π°ΠΉΠ½-кассами;
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° БистСмы быстрых ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ
  • ΠžΠΏΠ»Π°Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· Tinkoff Pay
  • ΠžΠΏΠ»Π°Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· Mir Pay
  • ΠžΠΏΠ»Π°Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Yandex Pay

ВрСбования

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Tinkoff Acquiring SDK Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Android вСрсии 7.0 ΠΈ Π²Ρ‹ΡˆΠ΅ (API level 24).

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ SDK Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² build.gradle вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ зависимости:

implementation 'ru.tinkoff.acquiring:ui:$latestVersion'
implementation 'ru.tinkoff.acquiring:threeds-sdk:$latestVersion'
implementation 'ru.tinkoff.acquiring:threeds-wrapper:$latestVersion'

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ сканированиС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Card-IO, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² build.gradle

implementation 'ru.tinkoff.acquiring:cardio:$latestVersion'

Π’Π°ΠΊ ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² network-security-config содСрТащий сСртификаты ΠΎΡ‚ ΠΌΠΈΠ½Ρ†ΠΈΡ„Ρ€ ΠΈ Π΄ΠΎΠΏ. сСртификат ΠΎΡ‚ Ρ‚ΠΈΠ½ΡŒΠΊΠΎΡ„Ρ„. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² sample выглядит ΠΎΠ½ Ρ‚Π°ΠΊ:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system" />
            <certificates src="@raw/acq_tinkoff_root_cert" />
            <certificates src="@raw/acq_ministry_of_digital_development_root_cert" />
        </trust-anchors>
    </base-config>
</network-security-config>

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅

Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SDK Π²Π°ΠΌ понадобятся:

  • Terminal key
  • Public key

ΠšΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π°ΡŽΡ‚ΡΡ послС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-Π­ΠΊΠ²Π°ΠΉΡ€ΠΈΠ½Π³Ρƒ

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ настройкС Π›ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΡƒΡ‚

SDK позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ (debug/prod). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ - Ρ€Π΅ΠΆΠΈΠΌ prod. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ debug Ρ€Π΅ΠΆΠΈΠΌ, установитС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

AcquiringSdk.isDeveloperMode = true // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ тСстовый URL, дСньги с ΠΊΠ°Ρ€Ρ‚ Π½Π΅ ΡΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ
AcquiringSdk.isDebug = true         // Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ логирования запросов

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΊ запросам ΠΊ API эквайринга Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ΠΊΠΈΠΉ Ρ‚ΠΎΠΊΠ΅Π½ (подпись запроса). Π—Π°Π΄Π°Π½ΠΈΠ΅ способа Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π° Π² случаях, ΠΊΠΎΠ³Π΄Π° это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ см. kDoc AcquiringSdk.tokenGenerator):

AcquiringSdk.tokenGenerator = SampleAcquiringTokenGenerator(password) // гСнСрация Ρ‚ΠΎΠΊΠ΅Π½Π° с использованиСм пароля
// Π’ цСлях бСзопасности Π½Π΅ рСкомСндуСтся Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π² ΠΊΠΎΠ΄Π΅ прилоТСния

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Для Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ TinkoffAcquiring

val tinkoffAcquiring = TinkoffAcquiring(applicationContext, "TERMINAL_KEY", "PUBLIC_KEY") // созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для взаимодСйствия с SDK ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹Π΅ сСссии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ»Π°Ρ‚Ρ‹:

tinkoffAcquiring.initSbpPaymentSession()
tinkoffAcquiring.initTinkoffPayPaymentSession()
tinkoffAcquiring.initMirPayPaymentSession()

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹Π΅ сСссии, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ TinkoffAcquiring.checkTerminalInfo() для получСния списка Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… способов ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΈ произвСсти ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹Ρ… сСссий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½ΠΈΡ….

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ экран с Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PaymentOptions ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ состоят ΠΈΠ· настроСк провСдСния ΠΎΠΏΠ»Π°Ρ‚Ρ‹, Π² Ρ‚ΠΎΠΌ числС Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΊΠ°Π·Π°, Π΄Π°Π½Π½Ρ‹Π΅ покупатСля ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ кастомизации экрана ΠΎΠΏΠ»Π°Ρ‚Ρ‹. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для сканирования (свой ΠΈΠ»ΠΈ CardScannerDelegate). Локализация бСрСтся ΠΈΠ· систСмы, Ρ‚Π°ΠΊ ΠΆΠ΅ имССтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° свСтлой ΠΈ Ρ‚Ρ‘ΠΌΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ экрана ΠΈ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² опрСдСляСтся ΠΈΠ· доступных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ»Π°Ρ‚Ρ‹, настраиваСтся Π² Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅.

val paymentOptions =
    PaymentOptions().setOptions {
        orderOptions {                          // Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΊΠ°Π·Π°
            orderId = "ORDER-ID"                // ID Π·Π°ΠΊΠ°Π·Π° Π² вашСй систСмС
            amount = Money.ofRubles(1000)       // сумма для ΠΎΠΏΠ»Π°Ρ‚Ρ‹
            title = "ΠΠΠ—Π’ΠΠΠ˜Π• ΠŸΠ›ΠΠ’Π•Π–Π"          // Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°, Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ
            description = "ΠžΠŸΠ˜Π‘ΠΠΠ˜Π• ΠŸΠ›ΠΠ’Π•Π–Π"    // описаниС ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°, Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ
            recurrentPayment = false            // Ρ„Π»Π°Π³ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ являСтся Π»ΠΈ ΠΏΠ»Π°Ρ‚Π΅ΠΆ Ρ€Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½Ρ‹ΠΌ [1]
            successURL  = "URL"                 // URL, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ (см. ΠΏΠΎΠ»Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ)
            failURL = "URL"                     // URL, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ Π² случаС Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ (см. ΠΏΠΎΠ»Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ)
        }
        customerOptions {                       // Π΄Π°Π½Π½Ρ‹Π΅ покупатСля
            checkType = CheckType.NO.toString() // Ρ‚ΠΈΠΏ привязки ΠΊΠ°Ρ€Ρ‚Ρ‹
            customerKey = "CUSTOMER_KEY"        // ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для сохранСния Π΄Π°Π½Π½Ρ‹Ρ… Π΅Π³ΠΎ ΠΊΠ°Ρ€Ρ‚Ρ‹
            email = "[email protected]"          // E-mail ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ увСдомлСния ΠΎΠ± ΠΎΠΏΠ»Π°Ρ‚Π΅
        }
        featuresOptions {                       // настройки Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ экрана ΠΎΠΏΠ»Π°Ρ‚Ρ‹
            cameraCardScanner =
                CardScannerDelegateImpl()       // рСализация ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сканирования ΠΊΠ°Ρ€Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнный CardScannerWrapper
        }
    }

Π—Π°Ρ‚Π΅ΠΌ рСгистрируСм ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ MainFormContract#Contract, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ ActivityResultLauncher#launch

val byMainFormPayment = registerForActivityResult(MainFormLauncher.Contract, ActivityResultCallback {})
byMainFormPayment.launch(MainFormContract.StartData(paymentOptions))

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° вСрнСтся Π² ActivityResultCallback:

  • ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ возвращаСтся MainFormLauncher.Success - содСрТащий paymentId ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°, ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ cardId - id ΠΊΠ°Ρ€Ρ‚Ρ‹, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ проводился ΠΏΠ»Π°Ρ‚Π΅ΠΆ, Ρ‚ΠΈΠΏ String ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ rebillId - rebillId ΠΊΠ°Ρ€Ρ‚Ρ‹, Ссли Π±Ρ‹Π» ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ Ρ€Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΠΏΠ»Π°Ρ‚Π΅ΠΆ
  • ΠΏΡ€ΠΈ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ (MainFormLauncher.Error) содСрТащий Throwable (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ)
  • ΠΏΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° (MainFormLauncher.Canceled)

МоТно Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅ΠΊΠ°, ΡƒΠΊΠ°Π·Π°Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ receipt Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ PaymentOptions#orderOptions ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ additionalData. Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈ ΠΈΡ… Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π½Π° сСрвСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° API Init, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡ… Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС.

val paymentOptions = 
        PaymentOptions().setOptions {
            orderOptions {               
                receipt = myReceipt
                additionalData = dataMap
                // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π°ΠΊΠ°Π·Π°
            }
            customerOptions {                    
                // Π΄Π°Π½Π½Ρ‹Π΅ покупатСля
            }
            featuresOptions {                    
                // настройки Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ экрана ΠΎΠΏΠ»Π°Ρ‚Ρ‹
            }
        }

val byMainFormPayment = registerForActivityResult(MainFormContract.Contract)
byMainFormPayment.launch(MainFormContract.StartData(paymentOptions))

[1] Π Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΠΏΠ»Π°Ρ‚Π΅ΠΆ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ для дальнСйшСго списания срСдств с сохранСнной ΠΊΠ°Ρ€Ρ‚Ρ‹, Π±Π΅Π· Π²Π²ΠΎΠ΄Π° Π΅Π΅ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ². Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для осущСствлСния ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΏΠΎ подпискС.

[2] БСзопасная ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСсто систСмной ΠΈ обСспСчиваСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π²Π²ΠΎΠ΄Π°, Ρ‚.ΠΊ. сторонниС ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π½Π° устройствС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΡƒ.

Π­ΠΊΡ€Π°Π½ привязки ΠΊΠ°Ρ€Ρ‚

Для запуска экрана привязки ΠΊΠ°Ρ€Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ€Π΅Π³Π΅ΡΡ‚ΠΈΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ AttachCardLauncher#Contract. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ - Ρ‚ΠΈΠΏ привязки, Π΄Π°Π½Π½Ρ‹Π΅ покупатСля ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ кастомизации (ΠΏΠΎ-Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с экраном ΠΎΠΏΠ»Π°Ρ‚Ρ‹):

val attachCardOptions = 
        AttachCardOptions().setOptions {
            setTerminalParams("TERMINAL_KEY", "PUBLIC_KEY")
            customerOptions {                       // Π΄Π°Π½Π½Ρ‹Π΅ покупатСля
                customerKey = "CUSTOMER_KEY"        // ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для сохранСния Π΄Π°Π½Π½Ρ‹Ρ… Π΅Π³ΠΎ ΠΊΠ°Ρ€Ρ‚Ρ‹
                checkType = CheckType.NO.toString() // Ρ‚ΠΈΠΏ привязки ΠΊΠ°Ρ€Ρ‚Ρ‹
                email = "[email protected]"          // E-mail ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ увСдомлСния ΠΎ привязкС
            }
            featuresOptions {                       // настройки Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ экрана ΠΎΠΏΠ»Π°Ρ‚Ρ‹
                useSecureKeyboard = true
                cameraCardScanner = CameraCardIOScanner()
                theme = themeId
            }
        }

attachCard = registerForActivityResult(AttachCard.Contract, ActivityResultCallback {})
attachCard.launch(options)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° вСрнСтся Π² ActivityResultCallback Π² Π²ΠΈΠ΄Π΅ AttachCard.Result:

  • ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ привязкС (AttachCard.Success) возвращаСтся cardId - id ΠΊΠ°Ρ€Ρ‚Ρ‹, которая Π±Ρ‹Π»Π° привязана, Ρ‚ΠΈΠΏ String
  • ΠΏΡ€ΠΈ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ привязкС (AttachCard.Error) возвращаСтся ошибка error Ρ‚ΠΈΠΏΠ° Throwable (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ)

БистСма быстрых ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· БистСму быстрых ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ осущСствляСтся Π² Π›ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅.

ΠŸΡ€ΠΈΠ΅ΠΌ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΏΠΎ статичСскому QR ΠΊΠΎΠ΄Ρƒ Ρ‡Π΅Ρ€Π΅Π· Π‘Π‘ΠŸ

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ»Π°Ρ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ статичСского QR ΠΊΠΎΠ΄Π° Π½Π° экранС прилоТСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

  1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ кассира
  2. Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ TinkoffAcquiring#openStaticQrScreen ΠœΠ΅Ρ‚ΠΎΠ΄ openStaticQrScreen ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: activity, localization - для Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сообщСния Π½Π° экранС, requestCode - для получСния ошибки, Ссли таковая Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠΎ статичСскому QR ΠΊΠΎΠ΄Ρƒ Π½Π΅ отслСТиваСтся Π² SDK, соотвСтствСнно Π² onActivityResult Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ экран Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ошибка ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π° (Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ экрана).

Tinkoff Pay

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· Tinkoff Pay осущСствляСтся Π² Π›ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅.

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Tinkoff Pay ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ для покупатСля:

ΠžΠΏΠ»Π°Ρ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Tinkoff Pay ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ двумя способами

  1. с использованиСм экранов ΠΈΠ· SDK;
  2. с использованиСм своих экранов ΠΈ TpayProcess ΠΈΠ· SDK.

Оба Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° содСрТат ΠΎΠ±Ρ‰ΠΈΠ΅ шаги описанныС Π½ΠΈΠΆΠ΅:

  1. Для Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ TinkoffAcquiring.checkTerminalInfo, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠΏΠ»Π°Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ enableTinkoffPay().
  2. Если enableTinkoffPay() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Tinkoff Pay Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² соотвСтствии с Design Guidelines.
ИспользованиС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… экранов SDK
  1. По Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΡƒΡŽ сСссию ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ экран ΠΎΠΏΠ»Π°Ρ‚Ρ‹ SDK:
TinkoffAcquiring.initTinkoffPayPaymentSession()

val tpayPayment = registerForActivityResult(TpayLauncher.Contract, ActivityResultCallback {})

// Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с экраном ΠΎΠΏΠ»Π°Ρ‚Ρ‹
val paymentOptions = PaymentOptions()
            .setOptions {
                orderOptions { ... }
                customerOptions { ... }
                featuresOptions { ... }
                setTerminalParams("TERMINAL_KEY", "PUBLIC_KEY")
            }

tpayPayment.launch(
        StartData(
            paymentOptions, 
            version  // бСрСтся ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° checkTerminalInfo()
        )
)
  1. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ вСрнСтся Π² ActivityResultCallback Π² Π²ΠΈΠ΄Π΅ TpayLauncher.Result

Mir Pay

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· Mir Pay осущСствляСтся ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с Tinkoff Pay, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ MirPayLauncher ΠΈΠ»ΠΈ MirPayProcess

ИспользованиС своих экранов ΠΈ TpayProcess ΠΈΠ· SDK
  1. По Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΡƒΡŽ сСссию TinkoffAcquiring.initTinkoffPayPaymentSession()
  2. Π—Π°ΠΏΡƒΡΠΈΡ‚ΡŒ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ экрана ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляр TpayProcess#get ΠΈ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ процСсс TpayProcess#start (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ version ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° шагС 1. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ статус процСсса ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅ TpayProcess#state(ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠΌ), ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ событиС onUiNeeded ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ state.deepLink для открытия прилоТСния с Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΎΠΏΠ»Π°Ρ‚Ρ‹.
  3. ΠŸΡ€ΠΈ нСобходимости, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ статус ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ TinkoffAcquiring.sdk.getState (с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ paymentId ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌ Π² state.paymentId Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС); врСмя ΠΈ частота ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ статуса ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° зависит ΠΎΡ‚ Π½ΡƒΠΆΠ΄ клиСнтского прилоТСния ΠΈ остаСтся Π½Π° вашС усмотрСниС (ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ статус ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ прилоТСния ΠΈΠ· Ρ„ΠΎΠ½Π°).

Yandex Pay

AcquiringSdk ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя Yandex Pay Π² качСствС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΊΠ°Ρ€Ρ‚.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Yandex Pay вмСстС с AcquiringSdk Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

  1. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅ Yandex Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ YANDEX_CLIENT_ID
  2. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ YANDEX_CLIENT_ID Π² сборочном скриптС build.gradle Π² качСствС значСния Π² manifestPlaceholders:
android {
  defaultConfig {
    manifestPlaceholders = [
      // ΠŸΠΎΠ΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ваш yandex_client_id
      YANDEX_CLIENT_ID: "12345678901234567890",
    ]
  }
}
  1. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² build.gradle
implementation 'ru.tinkoff.acquiring:yandexpay:$latestVersion'

ΠšΡ€Π°ΠΉΠ½Π΅ Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ru.tinkoff.acquiring:yandexpay вмСстС с com.yandex.pay:core Π² Ρ€Π°ΠΌΠΊΠ°Ρ… вашСго прилоТСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹Π΅ ошибки.

  1. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· Yandex Pay Π² Π›ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅.
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Доступ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Yandex Pay провСряСтся Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ TinkoffAcquiring#checkTerminalInfo, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΠΎ всСх ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… ΠΎΠΏΠ»Π°Ρ‚Ρ‹,ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Yandex Pay Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ TerminalInfo#mapYandexPayData.
  3. Кнопка Yandex Pay инкапсулирована Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ YandexButtonFragment. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°-ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ссли Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ минимальной ΡˆΠΈΡ€ΠΈΠ½Π΅. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° TinkoffAcquiring.createYandexPayButtonFragment. ПослС Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠ°Ρ€Ρ‚Ρ‹ процСсс ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ВозмоТности кастомизации ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² pages.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности

Локализация

SDK ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ 2 Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, Ρ€ΡƒΡΡΠΊΡƒΡŽ ΠΈ Π°Π½Π³Π»ΠΈΠΉΡΠΊΡƒΡŽ.

ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° Π±Π΅Π· открытия экрана ΠΎΠΏΠ»Π°Ρ‚Ρ‹

Для провСдСния ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° Π±Π΅Π· открытия экрана Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ процСсс для ΠΎΠΏΠ»Π°Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свою Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ состояний ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°. Для Ρ€Π°Π·Π½Ρ‹Ρ… способов ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ бизнСс сущности процСсса ΠΎΠΏΠ»Π°Ρ‚Ρ‹, ΠΈ Ρ€Π°Π·Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ состояний, ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π² ΠΏΠ°ΠΏΠΊΠ΅ ru.tinkoff.acquiring.sdk.payment

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запуска ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°:

PaymentByCardProcess.init(sdk, application) // созданиС процСсса ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°
val process = PaymentByCardProcess.get()
process.start(cardData, paymentOptions)     // запуск процСсса
scope.launch {
    process.state.collect { handle(it) }    // подписка Π½Π° события процСсса
}         

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² sample ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ»Π°Ρ‚Ρ‹ с ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ paymentId

Для отобраТСния ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ провСдСния ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Init ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ paymentId Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Launcher-Ρ‹ экранов ΠΈΠ»ΠΈ Ссли Π½Π΅ трСбуСтся UI, Ρ‚ΠΎ Π² Process-Ρ‹ ΠΎΠΏΠ»Π°Ρ‚Ρ‹.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°

SDK состоит ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ:

Core

ЯвляСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Tinkoff Acquiring API. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» взаимодСйствия с сСрвСром ΠΈ позволяСт Π½Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ прямых ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ Π² API. НС зависит ΠΎΡ‚ Android SDK ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² standalone Java прилоТСниях.

Основной класс модуля - AcquiringSdk - прСдоставляСт интСрфСйс для взаимодСйствия с Tinkoff Acquiring API. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π° (см. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅).

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

implementation 'ru.tinkoff.acquiring:core:$latestVersion'

UI

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ классы Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· мобильноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

TinkoffAcquiring - позволяСт:

  • ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ экран ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΏΠΎ статичСскому QR ΠΊΠΎΠ΄Ρƒ
  • ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ»Π°Ρ‚Ρ‹

TPayLauncher - позволяСт ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ экран процСсса ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Tinkoff Pay TpayProcess - ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для провСдСния процСсса ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свой UI

Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ классы для возмоТности провСдСния ΠΎΠΏΠ»Π°Ρ‚Ρ‹.

Card-IO

ΠœΠΎΠ΄ΡƒΠ»ΡŒ для сканирования ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΊΠ°ΠΌΠ΅Ρ€ΠΎΠΉ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Card-IO.

Yandex

ΠœΠΎΠ΄ΡƒΠ»ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ yandexPay

Sample

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Tinkoff Acquiring SDK ΠΈ модуля сканирования Card-IO Π² мобильноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅ ΠΊΠ½ΠΈΠ³.

Proguard

-keep class ru.tinkoff.acquiring.sdk.localization.** { *; }
-keep class ru.tinkoff.acquiring.sdk.requests.** { *; }
-keep class ru.tinkoff.acquiring.sdk.models.** { *; }
-keep class ru.tinkoff.acquiring.sdk.yandexpay.models.** { *; } // Ссли ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ яндСкс
-keep class ru.rtln.tds.sdk.** { *; }
-keep class org.spongycastle.**
-keep class org.bouncycastle.**

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

  • По Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠΌ вопросам ΠΏΡ€ΠΎΡΡŒΠ±Π° ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π° [email protected]
  • Π‘Π°Π³ΠΈ ΠΈ feature-рСквСсты ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π² Ρ€Π°Π·Π΄Π΅Π» issues
  • Полная докумСнтация ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ api