Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript iOS 13苹果支付按钮点击抛出错误;必须从用户手势处理程序创建新的AppleParsession。”;_Javascript_Ios_Knockout.js_Applepay - Fatal编程技术网

Javascript iOS 13苹果支付按钮点击抛出错误;必须从用户手势处理程序创建新的AppleParsession。”;

Javascript iOS 13苹果支付按钮点击抛出错误;必须从用户手势处理程序创建新的AppleParsession。”;,javascript,ios,knockout.js,applepay,Javascript,Ios,Knockout.js,Applepay,在一个与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"></di

在一个与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>
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();
    },
...
“必须从用户手势处理程序创建新的ApplePassession。”总是在

var session=newapplepaysession(3,data.applePayPaymentRequest)

适用于所有iOS 13设备。iOS 12及以下版本可以使用相同的代码正常工作


从我的调试中,我可以看到正在处理的事件是一个MouseEvent,这对我来说是有意义的。有什么想法可以解释为什么会有这样的情况吗?

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

其中一种方法已经被锁定了一段时间,例如,你不能启动表单的提交按钮。。。除非您从click()处理程序执行此操作。因此,您可以在页面上放置一个大而闪亮的“立即购买”图像,并通过单击该图像提交表单,但您不能只执行
setTimeout(form.submit(),100)

我想你在这里也有同样的东西。REST调用位于click处理程序中,但apple pay调用位于REST调用的回调中,因此实际上不在click()处理程序中


当然,您正在使用REST调用生成要传递给Apple的数据。您可能需要推测性地生成这些数据。但在进行基础设施工作之前,我会先试验一下异步版本的点击处理程序是否通过了它们的健全性检查。

与Jason和Brother Woodrow讨论后的工作片段

调用后端并获取当前购物车详细信息的同步函数。我们之前在success回调中使用此功能的原因是,我们正在使用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);

我认为关键问题在于,我们在rest调用的成功回调中创建了一个新的ApplePaySession,而苹果似乎不想再这样做了。

参考官方文档

您尝试在用户手势之外创建AppleParsession 处理程序。异常错误“必须从 出现“用户手势处理程序”

因此,在您的情况下,您必须创建一个apple pay会话,如

session = new window.ApplePaySession(version, request);
然后创建对服务器的请求并接收响应

const data = async getSomeCheckoutData();
你可以继续支付苹果支付

...
session.begin();

主要思想是,首先,创建一个会话。然后你可以执行请求,在启动Apple PaySession之后。

< p>你必须声明Apple PayStaseAtvices以上的类,以欺骗Apple PayCession,所以它把它当作手势,也不要调用承诺< /P>

现场直播。查看该点击处理程序,您可能可以在viewmodel加载(并保存返回的数据)后立即初始化RestClient,因为处理程序似乎不会向RestClient传递任何与购买相关的数据。那么现在成功回调中的代码将变成
initializeApplePaySession
。感谢Jason和Woodrow兄弟,这实际上是有意义的。我完全可以将Rest调用与Apple Pay会话的创建分离。我会试试这个。你试过异步吗?还是您的浏览器不允许ES6?