AcquiringSdkAndroid icon indicating copy to clipboard operation
AcquiringSdkAndroid copied to clipboard

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

Open renya84 opened this issue 4 years ago • 3 comments

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

renya84 avatar Jan 26 '21 06:01 renya84

Здравствуйте! Номер заказа 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 означают, что была произведена успешная оплата и списание денег

MaryAPc avatar Jan 26 '21 06:01 MaryAPc

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

renya84 avatar Jan 26 '21 08:01 renya84

для использования метода на 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. но пока можно использовать как в примере выше

MaryAPc avatar Jan 26 '21 11:01 MaryAPc