iOS 13 При нажатии кнопки Apple Pay выдается сообщение об ошибке: «Необходимо создать новый ApplePaySession из обработчика пользовательских жестов». - PullRequest
1 голос
/ 04 октября 2019

Работа над сайтом, который был интегрирован с Apple Pay около года без проблем. Мы замечаем, что теперь мы всегда получаем ошибку только для устройств iOS 13. iOS 12 и все остальные работают как положено.

Обработчик щелчков интерфейса:

<div class="btn btn-apple">
  <div class="apple-pay-button apple-pay-button-white" lang="en" data-bind="click: intializeApplePaySession"></div>
</div>

Обработчик щелчков JS:

self.intializeApplePaySession = function() {
  new RestClient(RestClient.POST, "/rest/model/someController", {},
    //Success
    function(data, textStatus, jqXHR) {

      var session = new ApplePaySession(3,data.applePayPaymentRequest);
      initializeCallbacks(session);
      session.begin();
    },
...

"Необходимо создать новую ApplePaySession изобработчик пользовательских жестов. "всегда выбрасывается в

var session = new ApplePaySession (3, data.applePayPaymentRequest);

для всех устройств iOS 13. iOS 12 и ниже отлично работают с тем же кодом.

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

Ответы [ 2 ]

3 голосов
/ 04 октября 2019

Мы перестаем позволять веб-сайтам совершать звонки из разных источников без ввода данных пользователем.

Один из способов, которым это какое-то время было заблокировано, заключается в том, что вы не можете запустить, например, отправкукнопка для формы ... если вы не делаете это из обработчика click (). Таким образом, вы можете поместить большое блестящее изображение «Купить сейчас» на страницу и отправить форму, нажав на это изображение, но вы не можете просто сделать setTimeout(form.submit(), 100)

Я думаю, что вы получили то же самоекласс вещей, идущих сюда. Вызов REST находится в обработчике кликов, но вызов Apple Pay находится в обратном вызове вызова REST, и, следовательно, на самом деле не в обработчике click ().

Конечно, вы используете вызов REST длягенерировать данные для передачи в Apple. Возможно, вам придется генерировать эти данные умозрительно. Но прежде чем выполнять эту инфраструктурную работу, я бы поэкспериментировал с тем, проходит ли асинхронная версия вашего обработчика кликов свои проверки работоспособности.

0 голосов
/ 07 октября 2019

Рабочий фрагмент после обсуждения с Джейсоном и братом Вудроу

Синхронная функция для вызова бэкэнда и получения текущих сведений о корзине. Причина, по которой мы ранее имели это в обратном вызове успеха, заключается в том, что мы используем структуру SPA, поэтому корзина может измениться в любое время. Мы не можем вызвать это, когда страница загружается или данные могут устареть.

self.getApplePayData = function() {
  var self = this;
  new RestClient(RestClient.POST, "/rest/model/getApplePayPaymentRequest", {},
    function(data, textStatus, jqXHR) {
      self.applePayData = data;
    },
....

 self.intializeApplePaySession = function() {
  var self = this;
  self.getApplePayData();
  var session = new ApplePaySession(3,self.applePayData.applePayPaymentRequest);

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

...