iOS 13 Apple Pay按钮单击引发错误:“必须从用户手势处理程序创建新的ApplePaySession。”

问题描述 投票:1回答:2

正在与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。关于为什么抛出此消息的任何想法?

javascript ios knockout.js applepay
2个回答
3
投票

我们正在逐步放弃让网站在没有用户输入的情况下进行跨源呼叫。

被锁定一段时间的一种方法是,例如,您不能触发表单的提交按钮...,除非您从click()处理程序中执行此操作。因此,您可以在页面上放置一个大的闪亮的“立即购买”图片,然后单击该图片即可提交表单,但是您不能只执行setTimeout(form.submit(), 100)

我认为您在这里遇到了同样的事情。 REST调用位于click处理程序中,但是apple pay调用位于REST调用的回调中,因此实际上不在click()处理程序中。

当然,您正在使用REST调用来生成要传递给Apple的数据。您可能不得不推测性地生成该数据。但是在完成基础架构工作之前,我将尝试使用异步版本的点击处理程序是否通过其健全性检查。


0
投票

与杰森和伍德罗弟兄讨论后的工作摘要

用于调用后端并获取当前购物车详细信息的同步功能。我们之前在成功回调中拥有此功能的原因是因为我们使用的是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似乎不再希望这样做。

© www.soinside.com 2019 - 2024. All rights reserved.