yoomoney / yookassa-payments-swift

This library allows implementing payment acceptance into mobile apps on iOS and works as an extension to the YooMoney API
https://yookassa.ru/developers
MIT License
41 stars 41 forks source link

Бесконечный loader после отмены/подтверждения оплаты на экране ввода кода из смс #34

Closed mstroshin closed 4 years ago

mstroshin commented 5 years ago

День добрый. После обновления YandexCheckoutPayments с версии 1.3.6 до 2.0.4 столкнулись с бесконечным loader'ом после того, как отменяем/подтверждаем покупку на экране ввода смс кода. https://dsh.re/e6bbb1 Ожидаем получать как раньше (1.3.6) ошибку или успех.

oltv00 commented 5 years ago

@mstroshin Привет. Метод func didSuccessfullyPassedCardSec(on module:) отрабатывает?

mstroshin commented 5 years ago

@oltv00 Нет. Ни при отклонении оплаты (что норм, судя по названию метода), ни при успешной оплате (деньги сняли) метод не дергается. А крутилка крутится.

mstroshin commented 5 years ago

Другие методы TokenizationModuleOutput отрабатывают.

oltv00 commented 5 years ago

При инициализации SDK передайте туда параметр isLoggingEnabled: true и посмотрите на какой URL происходит редирект.

Если вы вызываете 3DS используя метод func start3dsProcess(requestUrl:) и в модель TokenizationModuleInputData не передаете returnUrl, редирект должен быть на URL: https://custom.redirect.url/

В классе CardSecInteractor в методе shouldProcessRequest проверется есть ли нужный нам редирект.

Результат availableRedirects.isEmpty == false должен вернуться true чтобы 3DS закрылся.

mstroshin commented 5 years ago

Метод func start3dsProcess(requestUrl:) не вызываем и returnUrl не передаем. func shouldProcessRequest(_ request: URLRequest) -> Bool не вызывается вообще.

2019-04-15 14:49:17 +0000: {
  request: {
    url: "https://payment.yandex.net/frontend-api/v3/tokens",
    method: "POST",
    headers: {
      Authorization: "**************************************************************************",
      Content-Type: "application/json"
    },
    body: {
      {"amount":{"value":"3","currency":"RUB"},"payment_method_data":{"type":"bank_card","card":{"csc":"123","number":"123","expiry_year":"2020","expiry_month":"12"}},"tmx_session_id":"123","confirmation":{"type":"redirect","return_url":"https:\/\/custom.redirect.url\/"}}: ""
    }
  },
  response: {
    status: "200 (no error)",
    headers: {
      Date: "Mon, 15 Apr 2019 14:49:17 GMT",
      Transfer-Encoding: "Identity",
      Keep-Alive: "timeout=10000, max=100",
      Content-Type: "application/json;charset=UTF-8",
      Connection: "close"
    },
    body: "{
  "payment_token" : "pt-123"
}"
  }
}

Из лога понятно, что redirect_url = https://custom.redirect.url/

mstroshin commented 5 years ago

После того как передал confirmationUrl в func start3dsProcess(requestUrl:), shouldProcessRequest стал отрабатывать и возвращает true. Далее вызывается func didSuccessfullyPassedCardSec(on module:). Стало вроде все ок. Но есть вопрос: didSuccessfullyPassedCardSec вызывается, если я отменю в 3ds транзакцию (например, в тинькофф внизу страницы есть кнопка отменить). Как определить успешную или отмененную транзакцию?

mstroshin commented 5 years ago

К слову, при вводе неправильных реквизитов (cvc кода) тоже вызывается didSuccessfullyPassedCardSec

mstroshin commented 5 years ago

@oltv00 подскажи, пожалуйста, в версии sdk 1.3.6 открывается redirectUrl, указанный нашим бэкендом. В мобильном клиенте никакого redirectUrl мы не передаем и 3ds открываем не через start3dsProcess(requestUrl:). Теперь такой способ не поддерживается? (на версии 2.0.3)

oltv00 commented 5 years ago

@mstroshin В версиях >2.0.0 появился параметр returnUrl в структуре TokenizationModuleInputData. Если вы реализуете 3ds на своей стороне, необходимо передать в returnUrl соответствующее значение.

aaltergot commented 5 years ago

Звучит как будто при использовании SDK новой версии returnUrl, передаваемый бэкендом при запросе оплаты, игнорируется. Вместо него теперь требуется передать returnUrl при получении платежного токена мобильным приложением (так написано в документации). Если клиент использует SDK 1.3.6, то returnUrl, формируемый бэкендом, используется. Это верное наблюдение? Не является ли это регрессией?

oltv00 commented 4 years ago

@mstroshin Привет! Актуальна ли еще проблема?