平衡付款似乎不适用于Phonegap

时间:2014-02-12 01:16:45

标签: balanced-payments

我们无法从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中,永远不会返回,没有任何东西   错误。

example screenshot

1 个答案:

答案 0 :(得分:1)

好吧,我在balanced.js中找到了这个bug。因此,在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:有三个斜杠。现在,起初,我以为我可以将正则表达式转换为:

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

然而,还有另一个问题,因为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://");

这很有效。