Если я определяю массив allowedAuthMethods
в моем объекте IsReadyToPayRequest как ["CRYPTOGRAM_3DS"]
, и у пользователя нет сохраненного на его устройстве способа оплаты, соответствующего allowedCardNetworks
, но отвечающего всем другим минимальным требованиям, тогда PaymentsClient.isReadyToPay(request:) метод возвращает false
независимо от среды Google Pay (например, ТЕСТ или ПРОИЗВОДСТВО) и независимо от значения existingPaymentMethodRequired
(например, true
или false
).
Это ожидаемое поведение?
Учитывая, что PaymentsClient. Метод loadPaymentData(request:) позволяет пользователю добавить карту в поток (см. скриншот ниже), я ожидаю, что метод PaymentsClient.isReadyToPay(request:) вернет true
, если для свойства existingPaymentMethodRequired
установлено значение false
.
Именно приложение google-pay/android-quickstart демонстрирует поведение, которое я описал в своем вопросе. Единственное изменение, которое вам нужно внести в приложение, — это закомментировать значение "PAN_ONLY"
из списка SUPPORTED_METHODS
в файле Constants
. Затем запустите его на устройстве, на котором в приложение Google Wallet не добавлены карты. Я могу разветвить проект и отправить вам ссылку, если хотите. Дайте мне знать.
Уточнение: когда я сказал, что метод PaymentsClient.isReadyToPay(request:)
возвращает false
, я имел в виду, что это сокращение означает, что объект Task
в обратном вызове OnCompleteListener.onComplete(task:)
имеет результирующее значение false
.
Интересный. Я закомментировал метод PAN_ONLY
во время тестирования. Я сделаю еще несколько тестов.
@domi: Дайте мне знать, как у вас дела с тестированием, пожалуйста. Если вы пытаетесь воспроизвести это, вы можете написать мне в Твиттере или на любой платформе, на которой вы можете меня найти, и мы можем организовать сеанс демонстрации экрана, в котором я продемонстрирую проблему.
Здравствуйте! В настоящее время мы тестируем Google Pay на нашем веб-сайте. У нас отключен PAN_ONLY
(это требование для нашего шлюза), окружение TEST
. Я использую код точно в соответствии с руководством (с заполненными данными продавца и шлюза и удаленным PAN_ONLY), но isReadyToPay
всегда возвращает false
. Я присоединился к группе Test Cards, у меня есть карта в моем приложении Google Wallet, а общий доступ включен в моем профиле Payments и настройках Chrome. Я понятия не имею, чего еще не хватает! Если я добавлю PAN_ONLY
обратно, кнопка отображается без проблем (и оплата тоже работает). Есть идеи?
Обновление: я связался с @domi во время разговора, и мы смогли воспроизвести точно такое же поведение, как описано в моем вопросе, на его машине. Мы пришли к выводу, что это задумано, а не является ошибкой. Я уточню и объясню это в ответе в этой теме.
@Nuno: я думаю, вам лучше создать отдельный вопрос о поведении, которое вы испытываете с Google Pay для веб-API. Этот вопрос касается API Google Pay для Android.
После обсуждения с инженером по связям с разработчиками в Google (@domi) я пришел к выводу, что поведение, описанное в моем вопросе, недокументировано, но задумано, а не является ошибкой.
Свойство existingPaymentMethodRequired
в объекте IsReadyToPayRequest имеет отношение к результату PaymentsClient.isReadyToPay(request:) только в том случае, если массив allowedAuthMethods
в объекте IsReadyToPayRequest содержит значение "PAN_ONLY"
. В противном случае API PaymentsClient.isReadyToPay(request:) будет рассматривать свойство existingPaymentMethodRequired
как имеющее значение true
независимо от того, какое значение вы на самом деле указали.
Обоснованием этого является то, что API-интерфейсы Google Pay могут добавлять карту PAN_ONLY
(т. е. карту, которая хранится в файле с учетной записью Google пользователя) в потоке (т. е. в листе выбора способа оплаты Google Pay), но они не могут для добавления карты CRYPTOGRAM_3DS
(то есть карты, которая хранится на устройстве в качестве токена устройства Android) в потоке, а также они не могут определить, можно ли добавить карту CRYPTOGRAM_3DS
на работающее устройство (по различным техническим причинам).
Правильно @adil-hussain Спасибо, что собрали ответ.
Мне не удалось воспроизвести это поведение с образцом android-quickstart. Вызов
isReadyToPay()
возвращаетTask<Boolean>
. Может ли это быть вашей проблемой? Если нет, не могли бы вы поделиться своим кодом и показать, как вы вызываетеisReadyToPay()
и как вы проверяете, возвращает ли онtrue
илиfalse
? Большое спасибо за Вашу помощь.