我们无法从Phonegap应用程序调用balanced.card.create。这是在一个股票Phonegap应用程序中复制的:https://github.com/kevg/phonegap-balanced。完整的详细信息在github上的README.md中,但基本摘要是:
对于那些不熟悉phonegap的人来说,加载的主页是 index.html的。这会初始化index.js中的phonegap。当设备是 准备好之后,我们将使用名为“Execute”的按钮显示隐藏的DIV 平衡。“单击此按钮时,index.js中的app.executeBalanced 将被调用,提示平衡市场URI,加载 balanced.js with $ .getScript,然后调用balanced.card.create 测试信用卡。
预期的结果是调用callbackHandler或异常 被抓住了。相反,它似乎是Javascript线程的执行 消失在balanced.card.create中,永远不会返回,没有任何东西 错误。
答案 0 :(得分:1)
好吧,我在balanced.js中找到了这个bug。因此,在Phonegap中,window.location.href返回类似file:///.../index.html的内容。 Balanced.js会为https://js.balancedpayments.com/proxy#file
之类的内容创建一个iframevar 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:有三个斜杠。现在,起初,我以为我可以将正则表达式转换为:
/([^:]+:\/+[^\/]+).*/
然而,还有另一个问题,因为balance会对匹配进行安全性检查:
if (d.origin.toLowerCase() !== c.toLowerCase()) return !1;
但是,正则表达式返回file:/// firstcomponent,而event.origin不包含文件方案的主机名,因此即使使用固定的正则表达式也不会匹配。
我无法更改代理响应中返回的脚本中的任何内容,因为如果我从balancedpayments.com以外的域加载,则AJAX POST失败(返回代码为0,空白正文)。因此,我唯一可以控制的是传递给iframe的哈希。
但是,由于这个正则表达式是替换,我们可以简单地传递我们知道的所需(我们不关心正则表达式是无操作)。
因此,解决方案是将上面的L48更改为:
var src = proxy + "#" + encodeURIComponent("file://");
这很有效。