Как принять Apple Pay с Stripe JS внутри WKWebView?

#xamarin.forms #xamarin.ios #stripe-payments #applepay

#xamarin.forms #xamarin.ios #stripe-платежи #applepay

Вопрос:

Я пытаюсь загрузить веб-страницу, которая использует Stripe.js внутри WKWebView на iOS (с использованием Xamarin.Формы).

Все работает нормально (можно принимать платежи по карте), за исключением Apple Pay: PaymentRequest.canMakePayment() всегда возвращает null.

Та же веб-страница внутри SFSafariViewController работает нормально, поэтому проблема, похоже, связана с ограничениями внутри WKWebView. Однако, согласно https://webkit.org/blog/9674/new-webkit-features-in-safari-13 / теперь это должно поддерживаться, и действительно, тот же WKWebView также загружает официальную демонстрационную страницу Apple Pay (https://applepaydemo.apple.com /) без каких-либо проблем.

Казалось бы, проблема в конечном итоге заключается в том, как Stripe.js работает под капотом (возможно, в отношении внедрения скрипта).

Мой пользовательский рендерер в Xamarin выглядит так:

         WKWebView wkWebView;
        protected override void OnElementChanged(ElementChangedEventArgs<NativeWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var config = new WKWebViewConfiguration();
                wkWebView = new WKWebView(Frame, config);
                wkWebView.WeakNavigationDelegate = new WebNavigationDelegate();
                SetNativeControl(wkWebView);
            }

            if (e.NewElement != null)
                Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
        }
  

И JS на веб-странице (взяты из образцов элементов Stripe):

             //set up payment request
            var paymentRequest = stripe.paymentRequest({
                country: 'GB',
                currency: 'gbp',
                total: {
                    label: 'sample order',
                    amount: 100,
                },
                requestPayerName: true,
                requestPayerEmail: true,
            });

            paymentRequest.canMakePayment().then(function (result) {
                // result is always false!
                ...
            });

  

Возможно, существуют дополнительные настройки, которые можно добавить в WKWebView, чтобы заставить это работать?

Комментарии:

1. Насколько я знаю, вы не можете. Apple Pay поддерживается только в SFSafariViewController. Я вижу, что вы говорите, что это работает, но для меня это новость. Если вы считаете, что это ошибка с Stripe, вам следует написать в их службу поддержки.

2. В iOS Apple Pay поддерживается в Safari и в SFSafariViewController объектах. Проверьте developer.apple.com/documentation/apple_pay_on_the_web

3. Ну, согласно статье, которую я связал «В iOS 13 веб-страницы, загруженные в WKWebView, теперь могут принимать Apple Pay». Это, похоже, подтверждается тем, что их демонстрационная страница работает НОРМАЛЬНО. Я предполагаю, что в этом случае проблема связана с компонентом Stripe.

4. Вы могли бы опубликовать проблему в github.com/stripe/stripe-js/issues .

5. Я связался со службой поддержки Stripe, и они также считают, что внутри есть что-то конкретное stripe.js функции переноса библиотеки, которые заставляют canMakePayment возвращать false в WebView. Я опубликую здесь, как только получу от них ответ с потенциальным решением / обходным путем.

Ответ №1:

Это больше не проблема. Stripe признал это недостатком в их оболочке JS и исправил в последних обновлениях официальной библиотеки.