tinkoff-mobile-tech / tinkoff-asdk-ios

Tinkoff Acquiring SDK
https://tinkoff.ru/kassa
44 stars 35 forks source link

Не работает терминал на Android, на ios не вызывается sdk #55

Closed ilia1103 closed 3 years ago

ilia1103 commented 3 years ago

Здравствуйте, посоветовали обратиться к вам сюда. Нам включили тестовый терминал, я вроде как правильно ввожу все данные терминала, но Android пишет такой лог в любом случае, на реальном устройстве или эмуляторе: I/System.out: Tinkoff Acquiring SDK: === Got server response: {"Success":false,"ErrorCode":"9999","Message":"Неверные параметры.","Details":"Терминал не найден."} I/System.out: Tinkoff Acquiring SDK: === Request done with fail Я сомневаюсь в 1 месте, а именно в PAYMENT_REQUEST_CODE, я не понимаю как его объявить на Java, я так понимаю, что он должен быть int,я ставил 0 в него. экран оплаты появляется, с этим все хорошо, а вот тестировать не могу pay_java

Также хотел спросить по поводу ios SDK. Сейчас там такая картина:

Снимок экрана 2021-02-23 в 03 38 34

Также хотел узнать по поводу onPaymentCompletionHandler. Он постоянно возвращает nil, я объявляю его в коде и после чего вызываю, если не задавать его локально, тогда выходит такая ошибка : Cannot convert value of type 'PaymentCompletionHandler.Type' (aka '((Result<PaymentStatusResponse, Error>) -> ()).Type') to expected argument type 'PaymentCompletionHandler' (aka '(Result<PaymentStatusResponse, Error>) -> ()') Само объявление и вызов происходят так:

public typealias PaymentCompletionHandler = ((_ result: Result<PaymentStatusResponse, Error>) -> Void) var onPaymentCompletionHandler: PaymentCompletionHandler? if let sdk = try? AcquiringUISDK.init(configuration: acquiringSDKConfiguration) { sdk.presentPaymentView(on: vc, paymentData: pay_data, configuration: viewConfigration, completionHandler: onPaymentCompletionHandler!) }

Буду благодарен за помощь.

ilia1103 commented 3 years ago

Хотелось бы добавить, что логи ios идентичны: https://rest-api-test.tcsbank.ru/v2/GetCardList, with response data: {"Success":false,"ErrorCode":"9999","Message":"Неверные параметры.","Details":"Терминал не найден."}

ilia1103 commented 3 years ago

Покопался в текущих issue, нашел похожу проблему в Android, поставил developer_mode = false, и AndroidSDK заработал poooow Хотелось бы победить бесконечную загрузку на ios, после того как на ios поставил prod терминал - стали выводиться такие логи: {"Success":false,"ErrorCode":"7","Message":"Неверный статус покупателя.","Details":"Покупатель не найден.","CustomerKey":"109"} Но форма так и не прогружается

grishamsc commented 3 years ago

@ilia1103 Здравствуйте. По поводу бесконечной загрузки скорее всего вам поможет сильная ссылка на сам объект AcquiringUISDK. Можете посмотреть также данный issue

По поводу onPaymentCompletionHandler, он передается в метод не для того, что бы там "наполнится" каким-то данными, а что бы быть вызванным. У вас получается, что вы создаете переменную onPaymentCompletionHandler, в которой изначально nil и просто этот nil передаете в метод presentPaymentView. Вам необходимо самому определить это замыкание, которое уже будет вызвано тогда, когда вся асинхронная работа в методе presentPaymentView будет закончена. Как пример - файл BuyProductsViewController.swift, 245-246 строка

По поводу ошибки при вызове GetCardList

 {"Success":false,"ErrorCode":"7","Message":"Неверный статус покупателя.","Details":"Покупатель не найден.","CustomerKey":"109"}

это говорит о том, что покупателя с CustomerKey 109 не зарегистрировано и не получается найти информацию о его привязанных картах

ilia1103 commented 3 years ago

Можно ли увидеть пример, что значит сильная ссылка? Я присваивал SDK локальной переменной,после чего производил вызов через нее. Я видел тот issue, но не понял как именно решить проблему и как именно реализовать сильную ссылку

grishamsc commented 3 years ago

@ilia1103 любая переменная, если не указано обратная, является сильной ссылкой на тот объект, который мы этой переменной присвоили если я правильно понял, исходя из вашего сообщения, что вы присваиваете SDK локальной переменной, вы это делаете внутри какого-то метода и жизненный цикл это локальной переменной ограничен этим самым методом. т.е. получается такая ситуация - вы внутри метода создаете экземпляр SDK, присваиваете его локальной переменной внутри этого метода и это позволяет жить в памяти экземпляру SDK до того момента, пока выполняется код в этом методе. после этого эта локальная переменная пропадает -> не остается ни одной сильной ссылки на экземпляр SDK -> экземпляр SDK уничтожается.

я, к сожалению, не вижу полной картины того, где конкретно вы создаете экземпляр SDK, но смею предположить, что это происходит внутри какого-то вашего UIViewController. В таком случае, что бы экземпляр SDK не уничтожался, стоит добавить свойство у этого вью контроллера, которому вы присвоите экземпляр SDK. В таком случае, пока существует ваш UIViewController, будет существовать экземпляр SDK. Это должно помочь с возникшей проблемой.

выглядеть это должно примерно так:

class MyViewController: UIViewController {
    var sdk: AcquiringUISDK?

    override func viewDidLoad() {
        super.viewDidLoad()
        sdk = try? AcquiringUISDK.init(configuration: acquiringSDKConfiguration)
}
ilia1103 commented 3 years ago

Спасибо, я так и делал, внутри метода объявлял и вызывал SDK,скорее всего там и была проблема.Осталось понять с BuyProductsViewController.swift, а где этот файл, я просто не могу его найти нигде

ilia1103 commented 3 years ago

Да, проблема с вечной загрузкой точно решена! Я вот так вызвал SDK, без PaymentCompletionHandler и окно появилось: sdk_test?.presentPaymentView(on: self, paymentData: createPaymentData(), configuration: acquiringViewConfiguration()) { [self] (response) in self.responseReviewing(response) }

grishamsc commented 3 years ago

BuyProductsViewController.swift можно посмотреть либо тут на гитхабе, либо скачать весь репозиторий с гитхаба, открыть ASDKSample в Xcode и уже в проекте посмотреть этот файл

ilia1103 commented 3 years ago

Посмотрел, вызвал как там. Теперь новый вопрос)). Соответственно сделал вызов как там и объявил функцию: private func responseReviewing(_ response: Result<PaymentStatusResponse, Error>) { switch response { case let .success(result): При любом раскладе я всегда попадаю в case sucess,даже если закрыл окно оплаты, ничего не делая. Еще 1 проблема, раньше были хоть какие-то логи в консоли, сейчас их нет совсем.

grishamsc commented 3 years ago

@ilia1103 в текущей реализации, закрытие экрана оплаты расценивается как отмена платежа у объекта типа PaymentStatusResponse есть свойство status типа PaymentStatus и в таком случае там будет состояние cancelled, можно через него это обрабатывать

вообще полностью логи всех запросов пропали? возможно, он перестал передаваться в конфигурацию AcquiringSdkConfiguration таким образом

Screenshot 2021-03-17 at 17 18 29
ilia1103 commented 3 years ago

@grishamsc Я удалил строку с логером, но логов не появилось. Я день не заходил, не проверял, теперь окно с оплатой пытается появиться и сразу пропадает(хотя 2 дня назад все нормально работало). Пишет такие логи:ProcessAssertion: Failed to acquire RBS Background assertion 'WebProcess Background Assertion' for process with PID 99987, error: Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo={RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Background" sourceEnvironment:"(null)">,

ilia1103 commented 3 years ago

Ошибка с тем, что окно с оплатой пропадало - была из-за того, что он видимо хочет подгрузить экран с картами для данного пользователя, и выдает такую ошибку, но было бы интересно решить и эту проблему

ilia1103 commented 3 years ago

По поводу статуса оплаты, я сейчас на тестовом терминале вот такая функция по считыванию состояния оплаты: case let .success(result): var message = NSLocalizedString("text.paymentStatusAmount", comment: "Покупка на сумму") let alert = UIAlertController(title: "Привет", message: "Оплачено", preferredStyle: .alert) let action = UIAlertAction(title: "OK", style: .default, handler: nil) alert.addAction(action) self.present(alert, animated: true, completion: nil) if result.status == .cancelled { message.append(NSLocalizedString("text.paymentStatusCancel", comment: "отменена")) let alert = UIAlertController(title: "Привет", message: "НЕОплачено", preferredStyle: .alert) let action = UIAlertAction(title: "OK", style: .default, handler: nil) alert.addAction(action) self.present(alert, animated: true, completion: nil) } else { message.append(" ") message.append(NSLocalizedString("text.paymentStatusSuccess", comment: "paymentStatusSuccess")) message.append("\npaymentId = (result.paymentId)") }

Но собственно она всегда вылетает в sucess, при любом раскладе

grishamsc commented 3 years ago

если удалить строку с логгером, то то, что нет логов - корректное поведение, т.к. никакой логгер не используется если вернуть строку с логгером, то логи должны вернуться, попробуйте

по поводу cancelled записал небольшое видео

https://user-images.githubusercontent.com/2726726/111780355-553f9880-88c8-11eb-996a-48d42653dd92.mov

ilia1103 commented 3 years ago

@grishamsc Добрый день, строки с логером вернул, логов так и нет.Написал такую же функцию как у вас, ощущение, что он просто туда не попадает. Он даже принты в консоль не выводит

ilia1103 commented 3 years ago

Отбой, проблема была в том, что я вызывал отдельно sdk,где не указывал этот самый switch,после того как вручную прописал switch в месте вызова функции - логи снова заработали и консоль снова отображает логи, сейчас буду разбираться как добавлять карты по customer key.

grishamsc commented 3 years ago

@ilia1103 подскажите, в рамках данного issue все вопросы решены и можно закрыть? :)

ilia1103 commented 3 years ago

Да, в рамках этого issue все выполнено, спасибо большое за помощь!