Сұрақтарыңыз бар болса, бір түймен біргеміз

Бізге хабарласу

Төлем SDK

SDK алу

Android операциялық жүйесіне арналған Төлем SDK [Github бетінде] қолжетімді (https://github.com/Radarpayments/android-sdk).

Кітапхананың .aar файлдарын қосу арқылы Gradle жобасына қосылу

libs қалтасына sdk_core-release.aar кітапханасының файлын қосып, сосын, қосылған кітапханадан тәуелділікті көрсету қажет.

Егер графикалық интерфейсті қолдану қажет болса, онда libs қалтасына sdk_ui-release.aar кітапханасын да қосып, тәуелділікті көрсету керек.

build.gradle.kts

allprojects {
        repositories {
            // ...
            flatDir {
                dirs("libs")
            }
        }
    }

    dependencies {
        // dependency is mandatory to add
        implementation(group = "", name = "sdk_core-release", ext = "aar")
        // if you want to use a graphical interface
        implementation(group = "", name = "sdk_ui-release", ext = "aar")

        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7")
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7")
        implementation("com.caverock:androidsvg-aar:1.4")
        implementation("com.google.android.material:material:1.2.0-beta01")
        implementation("io.card:android-sdk:5.5.1")
        implementation("com.github.devnied.emvnfccard:library:3.0.1")
    }

build.gradle

allprojects {
       repositories {
          // ...
          flatDir {
            dirs 'libs'
          }
       }
    }

    dependencies {
        // dependency is mandatory to add
        implementation(group:'', name:'sdk_core-release', ext:'aar')
        // if you want to use GUI
        implementation(group:'', name:'sdk_ui-release', ext:'aar')

        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7")
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7")
        implementation("com.caverock:androidsvg-aar:1.4")
        implementation("com.google.android.material:material:1.2.0-beta01")
        implementation("io.card:android-sdk:5.5.1")
        implementation("com.github.devnied.emvnfccard:library:3.0.1")
    }

Kotlin_core мысалы (графикалық интерфейссіз)

Криптограмма құрастырудың мысалы

import com.radarpayments.mobile.payment.sdk.core.SDKCore
import com.radarpayments.mobile.payment.sdk.core.TokenResult
import com.radarpayments.mobile.payment.sdk.core.model.BindingParams
import com.radarpayments.mobile.payment.sdk.core.model.CardParams
import com.radarpayments.mobile.payment.sdk.core.validation.BaseValidator
import com.radarpayments.mobile.payment.sdk.core.validation.CardCodeValidator
import com.radarpayments.mobile.payment.sdk.core.validation.CardExpiryValidator
import com.radarpayments.mobile.payment.sdk.core.validation.CardHolderValidator
import com.radarpayments.mobile.payment.sdk.core.validation.CardNumberValidator
import com.radarpayments.mobile.payment.sdk.core.validation.OrderNumberValidator

class MainActivity : AppCompatActivity() {
    // initialization of validators for card information entry fields
    private val cardNumberValidator by lazy { CardNumberValidator(this) }
    private val cardExpiryValidator by lazy { CardExpiryValidator(this) }
    private val cardCodeValidator by lazy { CardCodeValidator(this) }
    private val cardHolderValidator by lazy { CardHolderValidator(this) }
    private val orderNumberValidator by lazy { OrderNumberValidator(this) }
    private val sdkCore by lazy { SDKCore(context = this) }

    override fun onCreate(savedInstanceState: Bundle?) {
        // installation of validators on the card information entry fields
        cardNumberInput.setupValidator(cardNumberValidator)
        cardExpiryInput.setupValidator(cardExpiryValidator)
        cardCodeInput.setupValidator(cardCodeValidator)
        cardHolderInput.setupValidator(cardHolderValidator)
        mdOrderInput.setupValidator(orderNumberValidator)

        // creation of an object and initialization of fields for a new card
        val params = CardParams(
            mdOrder = mdOrderInput.text.toString(),
            pan = cardNumberInput.text.toString(),
            cvc = cardCodeInput.text.toString(),
            expiryMMYY = cardExpiryInput.text.toString(),
            cardHolder = cardHolderInput.text.toString(),
            pubKey = pubKeyInput.text.toString()
        )
        // method call to get the cryptogram for a new card
        sdkCore.generateWithCard(params)

        // Creation of an object and initialization of fields for the linked card
        val params = BindingParams(
            mdOrder = mdOrderInput.text.toString(),
            bindingID = bindingIdInput.text.toString(),
            cvc = "123",
            pubKey = pubKeyInput.text.toString()
        )
        // method call to get the cryptogram for the linked card
        sdkCore.generateWithBinding(params)
    }
}

Kotlin_ui мысалы (графикалық интерфейспен)

Криптограмма құрастырудың мысалы

import com.radarpayments.mobile.payment.sdk.SDKPayment

class MarketApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        SDKPayment.init(this)
    }
}

import com.radarpayments.mobile.payment.sdk.core.model.ExpiryDate
import com.radarpayments.mobile.payment.sdk.PaymentConfigBuilder
import com.radarpayments.mobile.payment.sdk.ResultCallback
import com.radarpayments.mobile.payment.sdk.SDKPayment
import com.radarpayments.mobile.payment.sdk.model.CameraScannerOptions
import com.radarpayments.mobile.payment.sdk.model.Card
import com.radarpayments.mobile.payment.sdk.model.CardSaveOptions
import com.radarpayments.mobile.payment.sdk.model.HolderInputOptions
import com.radarpayments.mobile.payment.sdk.model.PaymentData
import com.radarpayments.mobile.payment.sdk.ui.helper.Locales.english

class MainActivity : AppCompatActivity() {

    private fun executeCheckout() {
        // List of linked cards.
        val cards = setOf(
            Card("492980xxxxxx7724", "aa199a55-cf16-41b2-ac9e-cddc731edd19", ExpiryDate(2025, 12)),
            Card("558620xxxxxx6614", "6617c0b1-9976-45d9-b659-364ecac099e2", ExpiryDate(2024, 6)),
            Card("415482xxxxxx0000", "3d2d320f-ca9a-4713-977c-c852accf8a7b", ExpiryDate(2019, 1)),
            Card("411790xxxxxx123456", "ceae68c1-cb02-4804-9526-6d6b2f1f2793")
        )

        // The order ID is mandatory.
        val order = "00210bac-0ed1-474b-8ec2-5648cdfc4212"
        val paymentConfig = PaymentConfigBuilder(order)
            // Optional, by default localized transaction "Pay".
            .buttonText("Pay 200 Ꝑ")
            // Optional, by default HIDE.
            .cardSaveOptions(CardSaveOptions.YES_BY_DEFAULT)
            // Optional, by default HIDE.
            .holderInputOptions(HolderInputOptions.VISIBLE)
            // Optional, by default true.
            .bindingCVCRequired(false)
            // Optional, by default ENABLED.
            .cameraScannerOptions(CameraScannerOptions.ENABLED)
            // Optional, by default SYSTEM.
            .theme(Theme.DEFAULT)
            // Optional, local forms of payment, defined automatically.
            .locale(english())
            // Optional, by default ENABLED.
            .nfcScannerOptions(NfcScannerOptions.ENABLED)
            // Optional, by default empty list.
            .cards(cards)
            // Optional, unique payment ID, generated automatically.
            .uuid("27fb1ebf-895e-4b15-bfeb-6ecae378fe8e")
            // Optional, payment formation time, set automatically.
            .timestamp(System.currentTimeMillis())
            .build()

        // Сall payment screen.
        SDKPayment.cryptogram(this, paymentConfig)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        // Result handling.
        SDKPayment.handleResult(requestCode, data, object : ResultCallback<PaymentData> {

            override fun onSuccess(result: PaymentData) {
                //Cryptogram formation result.
                when {
                    result.status.isSucceeded() -> {
                        val info = result.info
                        if (info is PaymentInfoNewCard) {
                            log("New card ${info.holder} ${info.saveCard}")
                        } else if (info is PaymentInfoBindCard) {
                            log("Saved card ${info.bindingId}")
                        } else if (info is PaymentInfoGooglePay) {
                            log("Google Pay ${info.order}")
                        }
                        log("$result")
                    }
                    result.status.isCanceled() -> {
                        log("canceled")
                    }
                }
            }

            override fun onFail(e: Exception) {
                // An error occurred.
                log(e.toString())
            }
        })
    }
}

Java_ui мысалы (графикалық интерфейспен)

Криптограмма құрастырудың мысалы

import com.radarpayments.mobile.payment.sdk.SDKPayment;

public class MarketApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        SDKPayment.INSTANCE.init(this);
    }
}

import com.radarpayments.mobile.payment.sdk.core.model.ExpiryDate;
import com.radarpayments.mobile.payment.sdk.PaymentConfigBuilder;
import com.radarpayments.mobile.payment.sdk.SDKPayment;
import com.radarpayments.mobile.payment.sdk.model.Card;
import com.radarpayments.mobile.payment.sdk.model.CardSaveOptions;
import com.radarpayments.mobile.payment.sdk.model.PaymentConfig;

public class MainActivity extends AppCompatActivity {

    private void executeCheckout() {
        // List of linked cards.
        Set<Card> cards = new HashSet();
        cards.add(new Card("492980xxxxxx7724", "ee199a55-cf16-41b2-ac9e-cc1c731edd19"));

        // The order identifier is mandatory.
        String order = "00210bac-0ed1-474b-8ec2-5648cdfc4212";
        PaymentConfig paymentConfig = new PaymentConfigBuilder(order)
                // Optional, by default localized transaction "Pay".
                .buttonText("Pay 200 Ꝑ")
                // Optional, by default HIDE.
                .cardSaveOptions(CardSaveOptions.YES_BY_DEFAULT)
                // Optional, by default SYSTEM.
                .theme(Theme.DEFAULT)
                // Optional, by default empty list.
                .cards(cards)
                // Optional, unique payment ID, generated automatically.
                .uuid("27fb1ebf-895e-4b15-bfeb-6ecae378fe8e")
                // Optional, payment formation time, set automatically.
                .timestamp(System.currentTimeMillis())
                .build();

        // Сall payment screen.
        SDKPayment.INSTANCE.cryptogram(MainActivity.this, paymentConfig);
    }

    @Override
    protected void onActivityResult(int requestCode, final int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result handling.
        SDKPayment.INSTANCE.handleResult(requestCode, data, new ResultCallback<PaymentData>() {
            @Override
            public void onSuccess(PaymentData result) {
                // Cryptogram formation result.
                if (result.getStatus().isSucceeded()) {
                    PaymentInfo info = result.getInfo();
                    if (info instanceof PaymentInfoNewCard) {
                        PaymentInfoNewCard newCardInfo = (PaymentInfoNewCard) info;
                        log("New card " + newCardInfo.getHolder() + " " + newCardInfo.getSaveCard());
                    } else if (info instanceof PaymentInfoBindCard) {
                        PaymentInfoBindCard bindCard = (PaymentInfoBindCard) info;
                        log("Saved card " + bindCard);
                    }
                    log(result.toString());
                } else if (result.getStatus().isCanceled()) {
                    log("canceled");
                }
            }

            @Override
            public void onFail(Exception e) {
                // An error occurred.
                log(e.toString());
            }
        });
    }
}

Өрістер валидациясының қатесі

Өріс Қате Сипаттама
PAN required Бос өріс көрсетілген
invalid Дұрыс емес мән
invalid-format Рұқсат етілмейтін таңбалар қолданылуда. Тек сандар қолжетімді.
CVC required Бос өріс көрсетілген
invalid Дұрыс емес мән
EXPIRY required Бос өріс көрсетілген
invalid Дұрыс емес мән
invalid-format Пішім MM/YY үлгісіне сәйкес келмейді
CARDHOLDER required Бос өріс көрсетілген
invalid Дұрыс емес мән
invalid-format Рұқсат етілмейтін таңбалар қолданылуда. Тек латын таңбалары мен бос орын қолжетімді
BINDING_ID required Бос өріс көрсетілген
invalid Дұрыс емес мән
MD_ORDER required Бос өріс көрсетілген
invalid Дұрыс емес мән
PUB_KEY required Бос өріс көрсетілген

SDK конфигурациясы

Қажет болған жағдайда, кілт және карта түрі туралы ақпарат көздерін қайта анықтай аласыз. RemoteKeyProvider, RemoteCardInfoProvider дайын шешімдерін пайдалануға болады. Сонымен қатар, сәйкесінше KeyProvider немесе CardInfoProvider интерфейсін жүзеге асыратын өзіңіздің провайдеріңізді пайдалануға болады.

SDKPayment.init(
        SDKConfigBuilder(this)
            .keyProvider(
                RemoteKeyProvider("https://securepayments.bank.ru/payment/se/keys.do")
            )
            .cardInfoProvider(
                RemoteCardInfoProvider(
                    url = "https://mrbin.io/bins/display",
                    urlBin = "https://mrbin.io/bins/"
                )
            )
            .build()
    )

Қашықтағы қызметтен кілт алу

SDKPayment.init(
        SDKConfigBuilder(this)
            .keyProvider(
                RemoteKeyProvider("https://securepayments.bank.ru/payment/se/keys.do")
            ).build()
    )

Қызмет келесі пішімде жауап беруі қажет:

{
    "keys": [
    {
        "keyValue": "-----BEGIN PUBLIC KEY-----****-----END PUBLIC KEY-----",
            "protocolVersion": "RSA",
            "keyExpiration": 1598527672000
    }
 ]
}

Қашықтағы қызметтен карта туралы ақпарат алу

SDKPayment.init(
    SDKConfigBuilder(this)
        .cardInfoProvider(
            RemoteCardInfoProvider(
                url = "https://mrbin.io/bins/display",
                urlBin = "https://mrbin.io/bins/"
            )
        ).build()
)

Қызмет келесі пішімде жауап беруі қажет:

{
    "backgroundColor": "#008bd0",
    "backgroundGradient": [
        "#00bcf2",
        "#004e90"
    ],
    "supportedInvertTheme": true,
    "textColor": "#fff",
    "logo": "logo/main/a559252b-3772-4b7e-817d-27b16db17580/1.svg",
    "logoInvert": "logo/invert/a559252b-3772-4b7e-817d-27b16db17580/1.svg",
    "paymentSystem": "mastercard",
    "status": "SUCCESS"
}

Өз провайдерлеріңізді жүзеге асыру

Шифрлеу кілтін және карта туралы ақпаратты беру үшін өз провайдерлеріңізді жүзеге асыруды пайдалануға болады.

SDKPayment.init(
        SDKConfigBuilder(this)
            .keyProvider(
                KeyProvider() {
                // TODO
                }
            )
            .cardInfoProvider(
                CardInfoProvider() {
                // TODO
                }                       
            )
            .build()
    )

Стильдеу

Сыртқы көріністі өзгерту үшін келесі ресурстарды қайта анықтау қажет:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--primary color-->
    <color name="rbs_color_primary"></color>
    <!--primary dark color -->
    <color name="rbs_color_primaryDark"></color>
    <!--accent color (selected input field)-->
    <color name="rbs_color_accent"></color>
    <!--error text output color-->
    <color name="rbs_color_error_text"></color>
    <!--form background color-->
    <color name="rbs_color_main_background"></color>
    <!--the color of the saved card code field-->
    <color name="rbs_color_saved_card_cvc_background">#FFFFFF</color>
    <!--the color of the hint in the saved card code entry field-->
    <color name="rbs_color_saved_card_cvc_hint">#8A000000</color>
    <!--the color of the text in the saved card code input field-->
    <color name="rbs_color_saved_card_cvc_text">#808084</color>
    <!--button text color-->
    <color name="rbs_color_button_text"></color>
    <!--form text color-->
    <color name="rbs_color_text"></color>
    <!--hint text color-->
    <color name="rbs_color_hint_text"></color>
    <!--shadow color-->
    <color name="rbs_color_shadow"></color>
    <!--Default card color-->
    <color name="rbs_color_card_background"></color>
    <!--divider color in the card list-->
    <color name="rbs_color_list_divider"></color>
</resources>

Ақшыл тақырыпта түсті қайта анықтау үшін, values қалтасында түстерді қайта анықтау қажет, ал қараңғы тақырыпта түсті қайта анықтау үшін, values-night қалтасында түстерді қайта анықтау қажет.

Google Pay

Google Pay арқылы төлеу түймесі

SDK жиынтығы Google Pay қызметінің көмегімен төлеу түймесін көрсету үшін GooglePayButton компонентін ұсынады.

<com.radarpayments.mobile.payment.sdk.ui.widget.GooglePayButton
                    android:id="@+id/gpayButtonXmlConfig"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"/>

GooglePayButton сыртқы көрінісін келесі төлсипаттардың көмегімен баптауға болады:

<com.radarpayments.mobile.payment.sdk.ui.widget.GooglePayButton
    app:rbs_google_pay_button_image_format="with_text"
    app:rbs_google_pay_button_background_format="shadow"/>
<com.radarpayments.mobile.payment.sdk.ui.widget.GooglePayButton
    app:rbs_google_pay_button_image_format="without_text"
    app:rbs_google_pay_button_background_format="outlet"/>

Google Pay арқылы төлем жасау

Google Pay арқылы төлеуді бастау үшін, GooglePayPaymentConfig төлем конфигурациясын дайындау қажет.

private fun createGooglePayConfig() : GooglePayPaymentConfig {
    val paymentData =  GooglePayPaymentDataRequest.paymentDataRequestCreate {
        allowedPaymentMethods = AllowedPaymentMethods.allowedPaymentMethodsCreate {
            method {
                type = GooglePayPaymentMethod.CARD
                parameters = PaymentMethodParameters.paymentMethodParametersCreate {
                    allowedAuthMethods = mutableSetOf(
                        GooglePayAuthMethod.PAN_ONLY,
                        GooglePayAuthMethod.CRYPTOGRAM_3DS
                    )
                    allowedCardNetworks =
                        mutableSetOf(
                            GooglePayCardNetwork.AMEX,
                            GooglePayCardNetwork.DISCOVER,
                            GooglePayCardNetwork.INTERAC,
                            GooglePayCardNetwork.JCB,
                            GooglePayCardNetwork.MASTERCARD,
                            GooglePayCardNetwork.VISA
                        )
                }
                tokenizationSpecification =
                    TokenizationSpecification.tokenizationSpecificationCreate {
                        type = GoogleTokenizationSpecificationType.PAYMENT_GATEWAY
                        parameters =
                            TokenizationSpecificationParameters.tokenizationSpecificationParametersCreate {
                                gateway = "bank"
                                gatewayMerchantId = "sbersafe_test"
                            }
                    }
            }
        }
        transactionInfo = TransactionInfo.transactionInfoCreate {
            totalPrice = BigDecimal.valueOf(1)
            totalPriceStatus = GooglePayTotalPriceStatus.FINAL
            countryCode = "US"
            currencyCode = "USD"
            checkoutOption = GooglePayCheckoutOption.COMPLETE_IMMEDIATE_PURCHASE
        }
        merchantInfo = MerchantInfo.merchantInfoCreate {
            merchantName = "Example Merchant"
            merchantId = "01234567890123456789"
        }
    }.toJson().toString()

    return GooglePayButtonConfigBuilder(
        order = "eecbbe96-973e-422e-a220-e9fa8d6cb124",
        paymentData = PaymentDataRequest.fromJson(paymentData)
    ).testEnvironment(true)
        .build()
}

Google құжаттамасын пайдалану арқылы paymentData параметрін құрастыруға немесе GooglePayPaymentDataRequest қолдануға болады.

Мұнда, order – тапсырыстың идентификаторы (ол SDK жауабында қайтарылады), ал paymentData – бұл Google Wallet кітапханасындағы PaymentData нысаны.

SDKPayment.cryptogram(this@MainActivity, googlePayConfig)

Төлем нәтижелері шақырушы Activity-ге қайтарылады.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    // Result handling.
    SDKPayment.handleResult(requestCode, data, object : ResultCallback<PaymentData> {

        override fun onSuccess(result: PaymentData) {
            // Cryptogram formation result.
            when {
                result.status.isSucceeded() -> {
                    val info = result.info
                    if (info is PaymentInfoGooglePay) {
                        log("Google Pay ${info.order}")
                    }
                    log("$result")
                }
                result.status.isCanceled() -> {
                    log("canceled")
                }
            }
        }

        override fun onFail(e: Exception) {
            // An error occurred.
            log(e.toString())
        }
    })
}

Google Pay арқылы төлем жасау мүмкіндігін тексеру

Google Pay арқылы төлем жасау мүмкіндігін тексеру үшін possiblyShowGooglePayButton әдісін пайдалануға болады:

GooglePayUtils.possiblyShowGooglePayButton(
        context = this,
        paymentsClient = GooglePayUtils.createPaymentsClient(
            context = this,
            environment = WalletConstants.ENVIRONMENT_TEST
        ),
        isReadyToPayJson = JSONObject(),
        callback = object : GooglePayUtils.GooglePayCheckCallback {
            override fun onNoGooglePlayServices() {
                // No Google Play services on the device
            }

            override fun onNotReadyToRequest() {
                // the app is not ready to pay via Google Pay
            }

            override fun onReadyToRequest() {
                // the app is ready to pay via Google Pay
            }
        }
    )

Функционал сипаттамасы

Жаңа картамен төлеу экраны

Бұл экранда пайдаланушы картаның деректерін енгізу арқылы төлем жасай алады. Төлеу кезінде пайдаланушыда кейінгі төлемдер үшін картаны сақтау мүмкіндігі болады.

Жаңа карта

Сақталған картаны таңдау экраны

Бұл экранда пайдаланушы сақталған карталардың біреуін таңдау арқылы төлем жасай алады немесе жаңа картаның деректерін енгізсе болады.

Сақталған карталардың тізімі

Сақталған картамен төлеу экраны

Бұл экранда пайдаланушы сақталған картамен төлеуді растайды. Баптауларға байланысты картаның құпия кодын енгізу міндетті немесе міндетті емес болуы мүмкін.

Таңдалған карта

Конфигурация сипаттамасы

Локализация

Төлеу үлгісі келесі тілдерде көрсетілуі мүмкін:

Әдепкі бойынша қолданбаның ағымдағы тілі пайдаланылады. Егер ағымдағы тіл қолжетімді тілдердің тізімінде жоқ болса, ағылшын тілі қолданылады.

val paymentConfig = PaymentConfigBuilder(order)
                        .locale(english())
                        .build()

Ақшыл және қараңғы тақырып

Төлем үлгісі екі безендіру тақырыбына қолдау көрсетеді: ақшыл және қараңғы.

Баптаудың мүмкін нұсқалары:

val paymentConfig = PaymentConfigBuilder(order)
                        .theme(Theme.SYSTEM)
                        .build()
Жаңа карта, қараңғы тақырып

NFC арқылы карта деректерін оқу

Егер карта қол тигізбей төлеу әдісіне қолдау көрсететін болса, ал телефон NFC қызметімен жабдықталған жағдайда, картаны телефонның артқы жағына қисайту арқылы жаңа картаның реквизиттерін толтыруға болады.

Егер NFC арқылы деректерді оқу функциясы қосулы болса, онда жаңа картаның деректерін енгізу үлгісінде NFC белгішесі көрсетіледі. Егер құрылғыда NFC функциясы жоқ болса, онда белгіше жасырылады.

val paymentConfig = PaymentConfigBuilder(order)
                        .nfcScannerOptions(NfcScannerOptions.ENABLED)
                        .build()
NFC қолжетімді

Егер құрылғыда NFC функциясы өшірулі болса, онда NFC белгішесіне басқан кезде, телефонның баптауларына тікелей өту мүмкіндігін ұсына отырып, NFC функциясын қосуға кеңес беретін диалогтық терезе пайда болады.

NFC функциясы құрылғыда өшірулі

Камера арқылы карта деректерін оқу

Жаңа картаның деректерін телефонның камерасын пайдалану арқылы толтыруға болады. Карта сканерін баптаудың екі нұсқасы қолжетімді.

val paymentConfig = PaymentConfigBuilder(order)
                        .cameraScannerOptions(CameraScannerOptions.ENABLED)
                        .build()

Түйме мәтінінің конфигурациясы

Төлеу үлгісі әдепкі бойынша мәтін мәнін қайта анықтауға мүмкіндік береді. Түйменің мәтінін қайта анықтау үшін, мәтінді төлем конфигурациясы арқылы беру қажет.

val paymentConfig = PaymentConfigBuilder(order)
                        .buttonText("Pay 200 Ꝑ")
                        .build()

Түйменің мәтінін қолданбада пайдаланылатын тілде беру қажет, себебі бұл мәтін сол қалпында көрсетіледі және төлеу үлгісімен аударылмайды. Егер түйме мәтіні әдепкі бойынша пайдаланылса, онда ол қолжетімді тілдерге аударылады.

Картаны сақтау

Жаңа карта туралы деректерді енгізу кезінде, картаны сақтауға арналған ауыстырғыштың көрсетілуін басқаруға болады.

val paymentConfig = PaymentConfigBuilder(order)
                        .cardSaveOptions(CardSaveOptions.YES_BY_DEFAULT)
                        .build()

Төлеу үлгісінің жауабында пайдаланушының таңдауына (кейінгі төлемдер үшін картаны сақтағысы келетіні не келмейтіні) бағыттайтын өріс қайтарылады.

Карта иесінің атын енгізу өрісі

Жаңа карта туралы деректерді енгізу кезінде, карта иесін енгізу өрісінің көрсетілуін басқаруға болады.

val paymentConfig = PaymentConfigBuilder(order)
                        .holderInputOptions(HolderInputOptions.VISIBLE)
                        .build()

Сақталған карталардың тізімі

Егер пайдаланушыда бұрын сақталып қойған карталар бар болса, онда олардың тізімін cards параметрі арқылы беруге болады.

val paymentConfig = PaymentConfigBuilder(order)
                        .cards(cards)
                        .build()

Егер карталардың тізімі бос немесе жоқ болса, онда төлеу үлгісі жаңа карта үшін деректерді енгізу экранын көрсетеді. Егер тізімде бірнеше карта бар болса, онда төлеу үлгісі алдымен тізімнен картаны таңдауды немесе жаңа картамен төлем жасауды ұсынады.

Сақталған картамен төлеу үшін карта кодын сұрату

Егер пайдаланушы сақталған картамен төлеуді таңдаған болса, онда ол төлеуді растап, карта кодын енгізу экранына қайта бағытталады. Әдепкі бойынша карта кодының өрісін толтыру міндетті болып саналады. Бұл тексерісті өшіруге болады:

val paymentConfig = PaymentConfigBuilder(order)
                        .bindingCVCRequired(false)
                        .build()

Мұндай жағдайда, төлеу үлгісі карта кодын енгізуге арналған өрісті толтыруды талап етпейді. Бірақ, егер өріске тым болмағанда бір сан енгізілетін болса, онда үлгі толық мәнді көрсетуді талап етеді.

Төлем идентификаторы

Төлем конфигурациясын жасау кезінде төлем идентификаторы автоматты түрде құрастырылады. Қажет болған жағдайда, оны қолмен қайта анықтауға болады:

val paymentConfig = PaymentConfigBuilder(order)
                        .uuid("27fb1ebf-895e-4b15-bfeb-6ecae378fe8e")
                        .build()

Төлемді орындау уақыты

Төлем конфигурациясын жасау кезінде төлем уақыты автоматты түрде бекітіледі және телефондағы ағымдағы уақыттың мәні болады. Қажет болған жағдайда, оны қолмен қайта анықтауға болады:

val paymentConfig = PaymentConfigBuilder(order)
                        .timestamp(System.currentTimeMillis())
                        .build()

Сақталған картаның сипаттамасы

Сақталған картаны сипаттау кезінде картаның нөмірі толық пішімде немесе қысқартылған түрде болуы мүмкін. Егер картаның толық нөмірі берілген болса, онда тек алғашқы 6 және соңғы 4 сан ғана көрсетіледі, қалған сандар жасырылады.

Байлам идентификаторы дүкен қолданатын қажетті пішімде беріледі, оның мәні төлеу үлгісін толтырғаннан кейін қайтарылады.

Мәндердің тек біреуін беру мүмкіндігін қоспай күн мен айды көрсету үшін, картаның қолданылу мерзімі бөлек класпен орнатылады.

Мысал:

Card("492980xxxxxx7724", "aa199a55-cf16-41b2-ac9e-cddc731edd19", ExpiryDate(2025, 12))

3DS әдісімен төлеу мысалы

3DS2 кітапханасын қосу

libs қалтасына sdk_threeds-release.aar кітапханасының файлын қосып, сосын қосылған кітапханадан тәуелділікті көрсету қажет.

build.gradle.kts

allprojects {
        repositories {
            // ...
            flatDir {
                dirs("libs")
            }
        }
    }

    dependencies {
        // dependency for connecting the confirmation functionality via 3DS
        implementation(group = "", name = "sdk_threeds-release", ext = "aar")
    }

build.gradle

allprojects {
       repositories {
          // ...
          flatDir {
            dirs 'libs'
          }
       }
    }

    dependencies {
        // dependency for connecting the confirmation functionality via 3DS
        implementation(group = "", name = "sdk_threeds-release", ext = "aar")
    }

3DS2 арқылы растаумен төлемді орындау

private val factory = Factory()

threeDS2Service = factory.newThreeDS2Service()
val configParams = factory.newConfigParameters()
val uiCustomization = factory.newUiCustomization()
threeDS2Service.initialize(
    context,
    configParams,
    "en-US",
    uiCustomization
)

val transaction = threeDS2Service.createTransaction("F000000000", "2.1.0")

//  An example of creating a transaction with deviceInfo encryption with a transmitted RSA key.
//  val rsaPem: String = ...
//  transaction = threeDS2Service.createTransactionWithRSADSKey(
//      rsaPem,
//      "2.1.0"
//   )

//   An example of creating a transaction with deviceInfo encryption with a transmitted EC key.
//   val ecPem: String = ""
//   val directoryServerID: String = ""
//   transaction = threeDS2Service.createTransactionWithECDSKey(
//       ecPem,
//       directoryServerID,
//       "2.1.0"
//    )

// Available data, to be sent to the payment gateway
val authRequestParams = transaction.authenticationRequestParameters!!
val encryptedDeviceInfo: String = authRequestParams.deviceData
val sdkTransactionID: String = authRequestParams.sdkTransactionID
val sdkAppId: String = authRequestParams.sdkAppID
val sdkEphmeralPublicKey: String = authRequestParams.sdkEphemeralPublicKey
val sdkReferenceNumber: String = authRequestParams.sdkReferenceNumber

val challengeParameters = factory.newChallengeParameters()

// Parameters for starting Challenge Flow.
challengeParameters.acsTransactionID =
    paymentOrderSecondStepResponse.threeDSAcsTransactionId
challengeParameters.acsRefNumber = paymentOrderSecondStepResponse.threeDSAcsRefNumber
challengeParameters.acsSignedContent =
    paymentOrderSecondStepResponse.threeDSAcsSignedContent
challengeParameters.set3DSServerTransactionID(paymentOrderResponse.threeDSServerTransId)

// Listener to handle the Challenge Flow execution process.
val challengeStatusReceiver: ChallengeStatusReceiver = object : ChallengeStatusReceiver {

    override fun cancelled() {}

    override fun protocolError(protocolErrorEvent: ProtocolErrorEvent) {}

    override fun runtimeError(runtimeErrorEvent: RuntimeErrorEvent) {}

    override fun completed(completionEvent: CompletionEvent) {}

    override fun timedout() {}
}

val timeOut = 5

// Starting Challenge Flow.
transaction.doChallenge(
    activity,
    challengeParameters,
    challengeStatusReceiver,
    timeOut
)

Кодтың толық мысалын осы жерден қарауға болады.

3DS экранын баптауға арналған қолжетімді ConfigParameters және UiCustomization параметрлері туралы қосымша ақпарат алу үшін, сонымен қатар, 3DS SDK серверлік қолданбасының өзара әрекеттесу процесінің сипаттамасын [3-D Secure сипаттамасы] бетінен қараңыз (https://github.com/Radarpayments/android-sdk/blob/master/documentation/threeds/EMVCo_3DS_SdkSpec_210_1017.pdf)

Растау кодын енгізу экранының мысалы:

3DS бейстандартты экраны

3DS2 бітеуіші

SDK3DS2 жиынтығында бітеуішті пайдалануға болады. SDK экрандары тапсырыс сомасына байланысты болады.

Сома Экран Сурет
111 Радио-топ
222 Көптеген таңдау
333 Веб (кірістірілген HTML)
Кел келген басқа Бір реттік құпиясөз
Санаттар:
eCommerce SDK
Санаттар
Іздеу нәтижелері