Неожиданное поведение isReadyToPay, когда массив allowAuthMethods содержит только CRYPTOGRAM_3DS

Если я определяю массив allowedAuthMethods в моем объекте IsReadyToPayRequest как ["CRYPTOGRAM_3DS"], и у пользователя нет сохраненного на его устройстве способа оплаты, соответствующего allowedCardNetworks, но отвечающего всем другим минимальным требованиям, тогда PaymentsClient.isReadyToPay(request:) метод возвращает false независимо от среды Google Pay (например, ТЕСТ или ПРОИЗВОДСТВО) и независимо от значения existingPaymentMethodRequired (например, true или false).

Это ожидаемое поведение?

Учитывая, что PaymentsClient. Метод loadPaymentData(request:) позволяет пользователю добавить карту в поток (см. скриншот ниже), я ожидаю, что метод PaymentsClient.isReadyToPay(request:) вернет true, если для свойства existingPaymentMethodRequired установлено значение false.

Мне не удалось воспроизвести это поведение с образцом android-quickstart. Вызов isReadyToPay() возвращает Task<Boolean>. Может ли это быть вашей проблемой? Если нет, не могли бы вы поделиться своим кодом и показать, как вы вызываете isReadyToPay() и как вы проверяете, возвращает ли он true или false? Большое спасибо за Вашу помощь.

domi 25.10.2022 16:59

Именно приложение google-pay/android-quickstart демонстрирует поведение, которое я описал в своем вопросе. Единственное изменение, которое вам нужно внести в приложение, — это закомментировать значение "PAN_ONLY" из списка SUPPORTED_METHODS в файле Constants. Затем запустите его на устройстве, на котором в приложение Google Wallet не добавлены карты. Я могу разветвить проект и отправить вам ссылку, если хотите. Дайте мне знать.

Adil Hussain 25.10.2022 17:45

Уточнение: когда я сказал, что метод PaymentsClient.isReadyToPay(request:) возвращает false, я имел в виду, что это сокращение означает, что объект Task в обратном вызове OnCompleteListener.onComplete(task:) имеет результирующее значение false.

Adil Hussain 25.10.2022 17:46

Интересный. Я закомментировал метод PAN_ONLY во время тестирования. Я сделаю еще несколько тестов.

domi 25.10.2022 17:52

@domi: Дайте мне знать, как у вас дела с тестированием, пожалуйста. Если вы пытаетесь воспроизвести это, вы можете написать мне в Твиттере или на любой платформе, на которой вы можете меня найти, и мы можем организовать сеанс демонстрации экрана, в котором я продемонстрирую проблему.

Adil Hussain 25.10.2022 18:35

Здравствуйте! В настоящее время мы тестируем Google Pay на нашем веб-сайте. У нас отключен PAN_ONLY (это требование для нашего шлюза), окружение TEST. Я использую код точно в соответствии с руководством (с заполненными данными продавца и шлюза и удаленным PAN_ONLY), но isReadyToPay всегда возвращает false. Я присоединился к группе Test Cards, у меня есть карта в моем приложении Google Wallet, а общий доступ включен в моем профиле Payments и настройках Chrome. Я понятия не имею, чего еще не хватает! Если я добавлю PAN_ONLY обратно, кнопка отображается без проблем (и оплата тоже работает). Есть идеи?

Nuno 26.10.2022 14:02

Обновление: я связался с @domi во время разговора, и мы смогли воспроизвести точно такое же поведение, как описано в моем вопросе, на его машине. Мы пришли к выводу, что это задумано, а не является ошибкой. Я уточню и объясню это в ответе в этой теме.

Adil Hussain 26.10.2022 19:54

@Nuno: я думаю, вам лучше создать отдельный вопрос о поведении, которое вы испытываете с Google Pay для веб-API. Этот вопрос касается API Google Pay для Android.

Adil Hussain 26.10.2022 19:58
0
8
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После обсуждения с инженером по связям с разработчиками в 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 Спасибо, что собрали ответ.

domi 26.10.2022 21:25

Другие вопросы по теме