PayPal 灯箱无法在 iPhone Safari/Web 应用程序中打开; 'win.location' 未定义

Posted

技术标签:

【中文标题】PayPal 灯箱无法在 iPhone Safari/Web 应用程序中打开; \'win.location\' 未定义【英文标题】:PayPal lightbox won't open in iPhone safari/web app; 'win.location' undefinedPayPal 灯箱无法在 iPhone Safari/Web 应用程序中打开; 'win.location' 未定义 【发布时间】:2013-06-17 11:01:25 【问题描述】:

(在Chrome iPhone 上工作正常)

我收到此错误:

TypeError: 'undefined' is not an object (evaluating 'win.location') in dg.js line 3

而且灯箱打不开。

PayPal 的dg.js 内有问题的代码是:

startFlow: function (url) 
    var win = that._render();
    if (win.location) 
        win.location = url;
     else 
        win.src = url;
    

那么手机Safari 看不懂that._render() 吗?我该如何解决这个问题?

如果重要的话,我使用Adaptive Payments,这样称呼它:

var dg = new PAYPAL.apps.DGFlow(
    trigger: null, 
    expType: 'light'
);
dg.startFlow('https://www.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=' +data.paykey);

payKey 和整个payflow 在桌面和Safari 以外的移动浏览器上工作我没有任何问题(它在桌面Safari 上工作)。当我们的网站作为ios web 应用程序运行时,它也不起作用,我认为它只是Safari 的外壳。

【问题讨论】:

【参考方案1】:

找到了几种解决此问题的方法...location.replace 使用 PayPal URL 或使用您自己的灯箱。我用easybox。

// Replace
dg.startFlow('https://www.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=' +data.paykey);

// with
var RUNNING_AS_WEB_APP = (window.navigator.standalone == true ? true : false);
if (RUNNING_AS_WEB_APP === false) 
    dg.startFlow('https://www.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=' +data.paykey);
 else 
    location.replace('https://www.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=' +data.paykey);
    // Or, lightbox option: 
    // $.easybox([url: 'https://www.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=' +data.paykey, width: 320, height: 480]);
 

【讨论】:

我在灯箱上没有任何运气(我试过很棒)。我最终不得不为 iOS 集成迷你流程,尽管它可以使用新的浏览器窗口。 @Alex 我也面临着类似的问题。我的应用是一个IOS应用。我所做的是创建支付密钥并使用迷你浏览器 URL 加载 UIWebView。但我无法检测到用户何时完成付款或取消。不调用返回和取消url?你是如何在 IOS 中实现 mini flow 的。请帮帮我。 我实际上正在从我的系统中删除这个集成。根据我从 PayPal 支持中获得的信息,WebView 中不支持此流程,并且 PayPal 不会修复它,因为它们已经有效地停止了 Classic API 的开发。有一种解决方法可以删除 javascript 并直接重定向到 PayPal,将 payKey 作为查询参数传递,但用户体验很糟糕(至少没有针对移动设备进行优化)。【参考方案2】:

尝试使用 expType=mini 的迷你浏览器体验。似乎比移动设备上的灯箱效果更好。

Adaptive Payments without modal box or popups?

【讨论】:

我们也尝试过 mini,但它仍然在 iOS/iOS Web 应用程序上的 Safari 中抛出相同的错误 =/【参考方案3】:

我可以解释您看到此错误的原因。 iOS 上的 Safari 仅允许通过用户点击/触摸事件打开窗口。

DGFlow._render() 函数执行:

window.open('', "PPDG");

如果不是由用户点击/触摸事件触发,则返回 null。

我猜您正在发出 XMLHttpRequest 以在服务器上生成 PayRequest/PayKey,然后在 onsuccess 回调中调用 DGFlow.startFlow()。

解决方法是把过程分成两个步骤:

    当用户准备结帐时,向服务器发出调用以 生成支付密钥。 然后,向用户显示一个使用 PayPal 结帐的按钮,当单击该按钮时,调用 DGFlow.startFlow()

【讨论】:

以上是关于PayPal 灯箱无法在 iPhone Safari/Web 应用程序中打开; 'win.location' 未定义的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 使用嵌入式灯箱预先批准付款

通过灯箱表单点击进入iPhone 6输入区,灯箱跳下页面

使用 Javascript 智能按钮灯箱的 PayPal 访客订阅未关闭

如何让 Paypal 购物车加载到灯箱中

您可以在客户离开您的网站时实施 PayPal 自适应付款吗?

如何使用 Paypal Adeptive 获取 paykey 并在结帐时成功结帐?