Skip to content

Примеры использования SDK на Java. Модуль UI

jQwout edited this page Jan 13, 2023 · 2 revisions

Первоначальная настройка SDK

Создание объекта TinkoffAcquiring, с передачей в конструктор данных терминала и настройка работы SDK:

    TinkoffAcquiring tinkoffAcquiring = new TinkoffAcquiring(TERMINAL_KEY, TERMINAL_PASSWORD, PUBLIC_KEY);
    AcquiringSdk.AsdkLogger.setDeveloperMode(true); //Включение тестового контура API
    AcquiringSdk.AsdkLogger.setDebug(true); //Включение логирования запросов к API

Специфика работы экранов SDK

Для конфиругации экранов, необходимо передать соответствующие опции, которые содержат данные для заказа, данные покупателя, настройки работы и отображения экранов оплаты.

Все экраны SDK могут возвращать 3 варианта результата работы:

  1. Activity.RESULT_OK - успешное выполнение с данными в Intent;
  2. Activity.RESULT_CANCELED - отмена, закрытие экана без результата;
  3. TinkoffAcquiring.RESULT_ERROR - ошибка при выполнении. Ошибку типа Throwable можно получить из Intent.

Вызов экрана оплаты

Для вызова экрана оплаты, первоначально необходимо установить опции:

private PaymentOptions createPaymentOptions() {
    //Данные заказа
    OrderOptions orderOptions = new OrderOptions();
    orderOptions.setAmount(Money.ofCoins(1000));
    orderOptions.setTitle("Order title");
    orderOptions.setDescription("Some description");
    orderOptions.setOrderId(String.valueOf(new Random().nextInt()));
    orderOptions.setRecurrentPayment(false);

    //Данные покупателя
    CustomerOptions customerOptions = new CustomerOptions();
    customerOptions.setCustomerKey("user-key");
    customerOptions.setCheckType(CheckType.HOLD.toString());
    customerOptions.setEmail("[email protected]");

    //Настройки для конфигурирования визуального отображения и функций экранов SDK
    FeaturesOptions featuresOptions = new FeaturesOptions();
    featuresOptions.setLocalizationSource(new AsdkSource(Language.RU));
    featuresOptions.setHandleCardListErrorInSdk(true);
    featuresOptions.setUseSecureKeyboard(true);
    featuresOptions.setCameraCardScanner(new CameraCardIOScanner());
    featuresOptions.setFpsEnabled(true);
    featuresOptions.setDarkThemeMode(DarkThemeMode.AUTO);
    featuresOptions.setTheme(R.style.Theme_MyApplication);
    featuresOptions.setUserCanSelectCard(true);

    //Настройки для проведения платежа
    PaymentOptions paymentOptions = new PaymentOptions();
    paymentOptions.setOrder(orderOptions);
    paymentOptions.setCustomer(customerOptions);
    paymentOptions.setFeatures(featuresOptions);

    return paymentOptions;
}

Полный список поддерживаемых опций можно найти в Документации, Таблица 1. Описание параметров настройки экранов SDK

Запустить экран оплаты, передав контекст, опции и код для получения результата в onActivityResult:

    tinkoffAcquiring.openPaymentScreen(this, createPaymentOptions(), PAYMENT_REQUEST_CODE)

Пример обработки результата выполнения экрана оплаты:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (resultCode) {
        case Activity.RESULT_OK: {
            if (requestCode == PAYMENT_REQUEST_CODE && data != null) {
                long paymentId = data.getLongExtra(TinkoffAcquiring.EXTRA_PAYMENT_ID, -1); //получение paymentId операции платежа
                String rebillId = data.getStringExtra(TinkoffAcquiring.EXTRA_REBILL_ID); //получение rebillId платежа, если платеж был рекуррентный
            }
            break;
        }

        case Activity.RESULT_CANCELED: {
            Toast.makeText(this, "Payment cancelled", Toast.LENGTH_SHORT).show();
            break;
        }

        case TinkoffAcquiring.RESULT_ERROR: {
            if (data != null) {
                Throwable throwable = (Throwable) data.getSerializableExtra(TinkoffAcquiring.EXTRA_ERROR); //получение ошибки
            }
            break;
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Вызов экрана привязки карты

Создание опций для экрана привязки:

private AttachCardOptions createAttachCardOptions() {
    CustomerOptions customerOptions = new CustomerOptions();
    customerOptions.setCustomerKey("user-key");
    customerOptions.setCheckType(CheckType.HOLD.toString());
    customerOptions.setEmail("[email protected]");

    FeaturesOptions featuresOptions = new FeaturesOptions();
    featuresOptions.setLocalizationSource(new AsdkSource(Language.RU));
    featuresOptions.setHandleCardListErrorInSdk(true);
    featuresOptions.setUseSecureKeyboard(true);
    featuresOptions.setCameraCardScanner(new CameraCardIOScanner());
    featuresOptions.setDarkThemeMode(DarkThemeMode.AUTO);
    featuresOptions.setTheme(R.style.Theme_MyApplication);

    AttachCardOptions attachCardOptions = new AttachCardOptions();
    attachCardOptions.setCustomer(customerOptions);
    attachCardOptions.setFeatures(featuresOptions);

    return attachCardOptions;
}

Вызов экрана привязки карты с передачей контекста, опций и кода для получения результата в onActivityResult:

    tinkoffAcquiring.openAttachCardScreen(this, createAttachCardOptions(), ATTACH_REQUEST_CODE)

Пример обработки результата:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (resultCode) {
        case Activity.RESULT_OK: {
            if (requestCode == ATTACH_REQUEST_CODE && data != null) {
                String cardId = data.getStringExtra(TinkoffAcquiring.EXTRA_CARD_ID); //возвращает cardId привязанной карты
            }
            break;
        }

        case Activity.RESULT_CANCELED: {...}
        case TinkoffAcquiring.RESULT_ERROR: {...}
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Вызов экрана списка карт

Создание опций для экрана:

private SavedCardsOptions createSavedCardsOptions() {
    CustomerOptions customerOptions = new CustomerOptions();
    customerOptions.setCustomerKey("user-key");
    customerOptions.setCheckType(CheckType.HOLD.toString());

    FeaturesOptions featuresOptions = new FeaturesOptions();
    featuresOptions.setLocalizationSource(new AsdkSource(Language.RU));
    featuresOptions.setHandleCardListErrorInSdk(true);
    featuresOptions.setUseSecureKeyboard(true);
    featuresOptions.setCameraCardScanner(new CameraCardIOScanner());
    featuresOptions.setDarkThemeMode(DarkThemeMode.AUTO);
    featuresOptions.setTheme(R.style.Theme_MyApplication);
    featuresOptions.setUserCanSelectCard(true);

    SavedCardsOptions savedCardsOptions = new SavedCardsOptions();
    savedCardsOptions.setCustomer(customerOptions);
    savedCardsOptions.setFeatures(featuresOptions);

    return savedCardsOptions;
} 

Вызов экрана списка карт с передачей контекста, опций и кода для получения результата в onActivityResult:

    tinkoffAcquiring.openSavedCardsScreen(this, createSavedCardsOptions(), CARD_LIST_REQUEST_CODE)

Пример обработки результата:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (resultCode) {
        case Activity.RESULT_OK: {
            if (requestCode == CARD_LIST_REQUEST_CODE && data != null) {
                boolean cardListChanged = data.getBooleanExtra(TinkoffAcquiring.EXTRA_CARD_LIST_CHANGED, false); //флаг, означающий был ли изменен список карт (пользователь добавил/удалил карту)
                String cardId = data.getStringExtra(TinkoffAcquiring.EXTRA_CARD_ID); //возвращает значение, если пользователь выбрал карту как приоритетную. Возвращает null, если карта не выбрана, или если на экран не была передана опция позволяющая делать выбор карты featuresOptions.setUserCanSelectCard(false)
            }
            break;
        }

        case Activity.RESULT_CANCELED: {...}
        case TinkoffAcquiring.RESULT_ERROR: {...}
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Платеж через Систему быстрых платежей

Для совершения платежа через СБП понадобятся опции платежа, достаточно сконфигурировать данные заказа:

private PaymentOptions createPaymentOptions() {
    OrderOptions orderOptions = new OrderOptions();
    orderOptions.setAmount(Money.ofCoins(1000));
    orderOptions.setTitle("Order title");
    orderOptions.setDescription("Some description");
    orderOptions.setOrderId(String.valueOf(new Random().nextInt()));
    orderOptions.setRecurrentPayment(false);

    PaymentOptions paymentOptions = new PaymentOptions();
    paymentOptions.setOrder(orderOptions);

    return paymentOptions;
}

Вызов оплаты через СБП с передачей контекста, опций и кода для получения результата в onActivityResult:

    tinkoffAcquiring.payWithSbp(this, createPaymentOptions(), PAYMENT_REQUEST_CODE)

Вызов экрана со статическим QR кодом Системы быстрых платежей

Создание опций для экрана:

private FeaturesOptions createFeatureOptions() {
    FeaturesOptions featuresOptions = new FeaturesOptions();
    featuresOptions.setLocalizationSource(new AsdkSource(Language.RU));
    featuresOptions.setHandleCardListErrorInSdk(true);
    featuresOptions.setDarkThemeMode(DarkThemeMode.AUTO);
    featuresOptions.setTheme(R.style.Theme_MyApplication);

    return featuresOptions;
}

Вызов экрана с передачей контекста, опций и кода для получения результата в onActivityResult:

    tinkoffAcquiring.openStaticQrScreen(this, createFeatureOptions(), PAYMENT_REQUEST_CODE)

При закрытии экрана возвращается только результат Activity.RESULT_CANCELED или TinkoffAcquiring.RESULT_ERROR.

Пример совершения платежа без открытия экрана SDK

Для получения статуса и результата выполнения оплаты, реализуйте слушатель:

private PaymentListener createPaymentListener() {
    return new PaymentListener() {
        @Override
        public void onSuccess(long paymentId, String cardId, String rebillId) {
            Toast.makeText(MainActivity.this, "Платеж выполнен успешно", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onUiNeeded(@NonNull AsdkState asdkState) {
            tinkoffAcquiring.openPaymentScreen(MainActivity.this, createPaymentOptions(), PAYMENT_REQUEST_CODE, asdkState);
        }

        @Override
        public void onError(@NonNull Throwable throwable) {
            Toast.makeText(MainActivity.this, throwable.getMessage(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(PaymentState paymentState) {
            Toast.makeText(MainActivity.this, paymentState.toString(), Toast.LENGTH_SHORT).show();
        }
    };
}

Описание методов:

  • onSuccess - вызывается в случае успешного платежа, возвращает paymentId операции, cardId если оплата производилась с привязанной карты, rebillId если был совершен рекуррентный платеж;
  • onUiNeeded - вызывается при необходимости обработать платеж на экране SDK, например в случае подтверждения 3DS. Возвращает параметр asdkState, который необходимо передать в перегруженный метод открытия экрана оплаты;
  • onError - вызывается в случае ошибки в процессе оплаты, возвращает ошибку;
  • onStatusChanged - вызывается при изменении статуса оплаты, возвращает текущий статус.

Вызов проведения полного цикла оплаты оплаты с передачей данных карты:

    CardData cardData = new CardData("4300000000000777", "11/22", "111");
    tinkoffAcquiring.initPayment(cardData, createPaymentOptions()) //создание процесса оплаты с передачей данных карты и опций
              .subscribe(createPaymentListener()) //привязка слушателя
              .start(); //запуск оплаты

Метод произведет оплату в асинхронном режиме. Существуют перегруженные методы, принимающие данные привязанной карты