Skip to content

Как получить/синхронизировать платеж? #34

Open
renya84 opened this issue Jan 26, 2021 · 3 comments
Open

Comments

@renya84
Copy link

renya84 commented Jan 26, 2021

номер заказа к примеру 44 - своя база, с отметкой не оплачено. во время проведения платежа в случае успеха получаю номер транзакции в onActivityResult. нужно получить с успехом номер заказа что бы отметить в своей базе чек на Оплачен. Как получать дополнительную информацию о платеже? или быть может есть какой та запрос информации по номеру транзакции чтоб получить информацию?

@renya84 renya84 changed the title Как получить синхронизировать платеж? Как получить/синхронизировать платеж? Jan 26, 2021
@MaryAPc
Copy link
Contributor

MaryAPc commented Jan 26, 2021

Здравствуйте! Номер заказа orderId вы сами создаете и передаете в SDK, далее он не меняется. Если в onActivityResult возвращается номер транзакции paymentId, это означает что заказ успешно оплачен, тогда вы можете отметить переданный orderId в базе.

Есть еще способ, в модуле core, в классе AcquiringSdk есть метод getState, который по paymentId возвращает информацию о состоянии платежа: orderId, paymentId и статус. Метод синхронный.

Например, вы передали в параметры экрана оплаты orderId = 44, после оплаты получили в onActivityResult номер транзакции paymentId = 777.
Далее вызываете метод getState, передаете в запрос paymentId = 777, получаете в ответе объект GetStateResponse, в котором есть параметры:
orderId = 44,
paymentId = 777,
status = CONFIRMED

статусы CONFIRMED и AUTHORIZED означают, что была произведена успешная оплата и списание денег

@renya84
Copy link
Author

renya84 commented Jan 26, 2021

покажите пример как это будет на java в onActivityResult при получении paymentId?

@MaryAPc
Copy link
Contributor

MaryAPc commented Jan 26, 2021

для использования метода на java, нужно будет подключить в gradle модуля приложения зависимость:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.21"

Затем в onActivityResult получаете paymentId:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        // ... check requestCode, resultCode
        
        long paymentId = data.getLongExtra(TinkoffAcquiring.EXTRA_PAYMENT_ID, -1);
        checkState(paymentId);
        
        super.onActivityResult(requestCode, resultCode, data);
}

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

private void checkState(long paymentId) {
        AcquiringSdk sdk = new AcquiringSdk(TERMINAL_KEY, TERMINAL_PASSWORD, PUBLIC_KEY); // создание объекта sdk модуля core
        GetStateRequest request = sdk.getState(getStateRequest -> { // создание объекта метода
            getStateRequest.setPaymentId(paymentId); // установка параметра paymentId
            return Unit.INSTANCE; // нужно для поддержки kotlin-java (аналог void в java)
        });

        // так как метод синхронный, вызов должен происходить не на main потоке, можно использовать любой механихм работы с потоками
        new Thread(() -> request.execute(getStateResponse -> { // execute делает вызов метода, getStateResponse - возврат объекта с параметрами в случае успешного завершения вызова метода
            if (getStateResponse.getStatus() == ResponseStatus.AUTHORIZED || getStateResponse.getStatus() == ResponseStatus.CONFIRMED) { // проверка статуса успешного платежа
                String orderId = getStateResponse.getOrderId(); // получаем orderId оплаченного заказа
                saveSuccessPayment(orderId); // какая то обработка
            }

            return Unit.INSTANCE; // нужно для поддержки kotlin-java (аналог void в java)
        }, e -> { //возвращает ошибку, если метод вернул ошибку
            handleError(e); // обработка ошибки
            return Unit.INSTANCE; // нужно для поддержки kotlin-java (аналог void в java)
        })).start();
    }

сейчас есть задача на доработку методов модуля core для вызова их на java без дополнительного подключения зависимости и возврата неких Unit.INSTANCE. но пока можно использовать как в примере выше

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants