-
Notifications
You must be signed in to change notification settings - Fork 28
Примеры использования SDK на Java. Модуль UI
Создание объекта TinkoffAcquiring, с передачей в конструктор данных терминала и настройка работы SDK:
TinkoffAcquiring tinkoffAcquiring = new TinkoffAcquiring(TERMINAL_KEY, TERMINAL_PASSWORD, PUBLIC_KEY);
AcquiringSdk.AsdkLogger.setDeveloperMode(true); //Включение тестового контура API
AcquiringSdk.AsdkLogger.setDebug(true); //Включение логирования запросов к API
Для конфиругации экранов, необходимо передать соответствующие опции, которые содержат данные для заказа, данные покупателя, настройки работы и отображения экранов оплаты.
Все экраны SDK могут возвращать 3 варианта результата работы:
- Activity.RESULT_OK - успешное выполнение с данными в Intent;
- Activity.RESULT_CANCELED - отмена, закрытие экана без результата;
- 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)
Создание опций для экрана:
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.
Для получения статуса и результата выполнения оплаты, реализуйте слушатель:
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(); //запуск оплаты
Метод произведет оплату в асинхронном режиме. Существуют перегруженные методы, принимающие данные привязанной карты