1

我们无法从 Phonegap 应用程序调用balanced.card.create。这是在股票 Phonegap 应用程序中复制的:https ://github.com/kevg/phonegap-balanced 。完整的细节在 github 上的 README.md 中,但基本的总结是:

对于那些不熟悉 phonegap 的人来说,加载的主页是 index.html。这会在 index.js 中初始化 phonegap。当设备准备就绪时,我们将显示一个隐藏的 DIV,并带有一个名为“Execute Balanced”的按钮。单击此按钮时,将调用 index.js 中的 app.executeBalanced,提示输入平衡市场 URI,使用 $.getScript 加载balanced.js,然后使用测试信用卡调用balanced.card.create。

预期的结果是callbackHandler被调用或者异常被捕获。相反,似乎Javascript线程的执行消失在balanced.card.create中,永远不会返回并且没有任何错误。

示例截图

4

1 回答 1

1

好的,我在balanced.js 中发现了这个错误。因此,在 Phonegap 中,window.location.href 返回类似 file:///.../index.html 的内容。Balanced.js 为https://js.balancedpayments.com/proxy#file之类的东西创建了一个 iframe

var src = proxy + "#" + encodeURIComponent(window.location.href);

https://github.com/balanced/balanced-js/blob/master/src/utils.js#L48

在 proxy.html(我在 github 上找不到)返回的脚本中,它确实:

c.parentURL=decodeURIComponent(
    window.location.hash.replace(/^#/,"")
  ).replace(/#.*$/,"")
c.parentDomain=c.parentURL.replace(/([^:]+:\/\/[^\/]+).*/,"$1")

正则表达式不匹配,因为 file: 有三个斜杠。现在,起初,我以为我可以将正则表达式转换为:

/([^:]+:\/+[^\/]+).*/

但是,还有另一个问题,因为平衡对匹配进行了安全来源检查:

if (d.origin.toLowerCase() !== c.toLowerCase()) return !1;

但是,正则表达式返回 file:///firstcomponent,而event.origin不包含文件方案的主机名,因此即使使用固定的正则表达式也不匹配。

我无法更改代理响应中返回的脚本中的任何内容,因为如果我从 balancepayments.com 以外的域加载该脚本,那么 AJAX POST 将失败(返回代码 0,正文为空白)。因此,我唯一能控制的就是传递给 iframe 的哈希值。

然而,由于这个正则表达式是一个替换,我们可以简单地传递我们知道我们需要的东西(我们不在乎这个正则表达式是一个空操作)。

因此,解决方法是将上面的L48改成:

var src = proxy + "#" + encodeURIComponent("file://");

这行得通。

于 2014-02-12T22:22:38.873 回答