正在与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。关于为什么抛出此消息的任何想法?
我们正在逐步放弃让网站在没有用户输入的情况下进行跨源呼叫。
被锁定一段时间的一种方法是,例如,您不能触发表单的提交按钮...,除非您从click()处理程序中执行此操作。因此,您可以在页面上放置一个大的闪亮的“立即购买”图片,然后单击该图片即可提交表单,但是您不能只执行setTimeout(form.submit(), 100)
我认为您在这里遇到了同样的事情。 REST调用位于click处理程序中,但是apple pay调用位于REST调用的回调中,因此实际上不在click()处理程序中。
当然,您正在使用REST调用来生成要传递给Apple的数据。您可能不得不推测性地生成该数据。但是在完成基础架构工作之前,我将尝试使用异步版本的点击处理程序是否通过其健全性检查。
与杰森和伍德罗弟兄讨论后的工作摘要
用于调用后端并获取当前购物车详细信息的同步功能。我们之前在成功回调中拥有此功能的原因是因为我们使用的是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似乎不再希望这样做。