AcquiringSdkAndroid
AcquiringSdkAndroid copied to clipboard
Как получить/синхронизировать платеж?
номер заказа к примеру 44 - своя база, с отметкой не оплачено. во время проведения платежа в случае успеха получаю номер транзакции в onActivityResult. нужно получить с успехом номер заказа что бы отметить в своей базе чек на Оплачен. Как получать дополнительную информацию о платеже? или быть может есть какой та запрос информации по номеру транзакции чтоб получить информацию?
Здравствуйте! Номер заказа 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 означают, что была произведена успешная оплата и списание денег
покажите пример как это будет на java в onActivityResult при получении paymentId?
для использования метода на 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. но пока можно использовать как в примере выше