Closed ilia1103 closed 3 years ago
Хотелось бы добавить, что логи ios идентичны: https://rest-api-test.tcsbank.ru/v2/GetCardList, with response data: {"Success":false,"ErrorCode":"9999","Message":"Неверные параметры.","Details":"Терминал не найден."}
Покопался в текущих issue, нашел похожу проблему в Android, поставил developer_mode = false, и AndroidSDK заработал Хотелось бы победить бесконечную загрузку на ios, после того как на ios поставил prod терминал - стали выводиться такие логи: {"Success":false,"ErrorCode":"7","Message":"Неверный статус покупателя.","Details":"Покупатель не найден.","CustomerKey":"109"} Но форма так и не прогружается
@ilia1103 Здравствуйте. По поводу бесконечной загрузки скорее всего вам поможет сильная ссылка на сам объект AcquiringUISDK. Можете посмотреть также данный issue
По поводу onPaymentCompletionHandler
, он передается в метод не для того, что бы там "наполнится" каким-то данными, а что бы быть вызванным. У вас получается, что вы создаете переменную onPaymentCompletionHandler
, в которой изначально nil и просто этот nil передаете в метод presentPaymentView
.
Вам необходимо самому определить это замыкание, которое уже будет вызвано тогда, когда вся асинхронная работа в методе presentPaymentView
будет закончена.
Как пример - файл BuyProductsViewController.swift
, 245-246 строка
По поводу ошибки при вызове GetCardList
{"Success":false,"ErrorCode":"7","Message":"Неверный статус покупателя.","Details":"Покупатель не найден.","CustomerKey":"109"}
это говорит о том, что покупателя с CustomerKey 109 не зарегистрировано и не получается найти информацию о его привязанных картах
Можно ли увидеть пример, что значит сильная ссылка? Я присваивал SDK локальной переменной,после чего производил вызов через нее. Я видел тот issue, но не понял как именно решить проблему и как именно реализовать сильную ссылку
@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)
}
Спасибо, я так и делал, внутри метода объявлял и вызывал SDK,скорее всего там и была проблема.Осталось понять с BuyProductsViewController.swift, а где этот файл, я просто не могу его найти нигде
Да, проблема с вечной загрузкой точно решена! Я вот так вызвал SDK, без PaymentCompletionHandler и окно появилось: sdk_test?.presentPaymentView(on: self, paymentData: createPaymentData(), configuration: acquiringViewConfiguration()) { [self] (response) in self.responseReviewing(response) }
BuyProductsViewController.swift
можно посмотреть либо тут на гитхабе, либо скачать весь репозиторий с гитхаба, открыть ASDKSample
в Xcode и уже в проекте посмотреть этот файл
Посмотрел, вызвал как там. Теперь новый вопрос)). Соответственно сделал вызов как там и объявил функцию: private func responseReviewing(_ response: Result<PaymentStatusResponse, Error>) { switch response { case let .success(result): При любом раскладе я всегда попадаю в case sucess,даже если закрыл окно оплаты, ничего не делая. Еще 1 проблема, раньше были хоть какие-то логи в консоли, сейчас их нет совсем.
@ilia1103 в текущей реализации, закрытие экрана оплаты расценивается как отмена платежа
у объекта типа PaymentStatusResponse
есть свойство status
типа PaymentStatus
и в таком случае там будет состояние cancelled
, можно через него это обрабатывать
вообще полностью логи всех запросов пропали?
возможно, он перестал передаваться в конфигурацию AcquiringSdkConfiguration
таким образом
@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)">,
Ошибка с тем, что окно с оплатой пропадало - была из-за того, что он видимо хочет подгрузить экран с картами для данного пользователя, и выдает такую ошибку, но было бы интересно решить и эту проблему
По поводу статуса оплаты, я сейчас на тестовом терминале вот такая функция по считыванию состояния оплаты: 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, при любом раскладе
если удалить строку с логгером, то то, что нет логов - корректное поведение, т.к. никакой логгер не используется если вернуть строку с логгером, то логи должны вернуться, попробуйте
по поводу cancelled записал небольшое видео
https://user-images.githubusercontent.com/2726726/111780355-553f9880-88c8-11eb-996a-48d42653dd92.mov
@grishamsc Добрый день, строки с логером вернул, логов так и нет.Написал такую же функцию как у вас, ощущение, что он просто туда не попадает. Он даже принты в консоль не выводит
Отбой, проблема была в том, что я вызывал отдельно sdk,где не указывал этот самый switch,после того как вручную прописал switch в месте вызова функции - логи снова заработали и консоль снова отображает логи, сейчас буду разбираться как добавлять карты по customer key.
@ilia1103 подскажите, в рамках данного issue все вопросы решены и можно закрыть? :)
Да, в рамках этого issue все выполнено, спасибо большое за помощь!
Здравствуйте, посоветовали обратиться к вам сюда. Нам включили тестовый терминал, я вроде как правильно ввожу все данные терминала, но 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 в него. экран оплаты появляется, с этим все хорошо, а вот тестировать не могу
Также хотел спросить по поводу ios SDK. Сейчас там такая картина:
Также хотел узнать по поводу 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!) }
Буду благодарен за помощь.