【问题标题】:Problems with Braintree Javascript integration - braintree.Environment.Sandbox undefined error?Braintree Javascript 集成的问题 - Braintree.Environment.Sandbox 未定义错误?
【发布时间】:2015-09-19 11:14:28
【问题描述】:

我正在尝试使用 Javascript 和 Node JS 集成 Braintree 支付解决方案。

根据 Braintree 文档,我的 html 中有以下内容:

            <div id="panel-payment">
                <div id="payment-form"></div>
                <input id="btn-checkout" type="submit" value="Process Order">
            </div>
            <script>
            $(document).ready(function(){

                console.log(braintree); <---- defined AOK
                console.log(braintree.Environment); <---- undefined
                console.log(braintree.Environment.Sandbox); <---- undefined

                var clientToken = "...";
                braintree.setup(clientToken, "dropin", {
                    container: $("#payment-form")
                });
            });
            </script>

我无法获取环境变量,但 Braintree 对象似乎可以正常实例化?有人有什么想法吗?

braintree 对象返回:

Object {api: Object, cse: Object, paypal: Object, dropin: Object, Form: Object…}

当我调用 Braintree.setup() 函数时,我也会得到可怕的“无法找到有效容器”,即使容器值 $("#payment-form") 是有效值并且我正在调用 setup 函数当 HTML 加载完毕时..

【问题讨论】:

    标签: node.js braintree


    【解决方案1】:

    环境变量仅在 NodeJS 包中可用。 见here。

    对于 javascript 中的客户端,您需要一个由您的服务器生成的有效令牌。 因此,您需要一条专用路由,使用 Braintree 节点包传递令牌,如 here 所述。

    对于您的容器问题,请尝试仅将 div 的 id 传递给 Braintree,而不是 jQuery 元素。

    braintree.setup(clientToken, "dropin", {
       container: "payment-form"
    });   
    

    【讨论】:

    • 非常感谢您这么快发表评论。我的问题是我使用了错误的 Braintree npm 包,另外我在客户端 JS 中使用了服务器端代码。我没有意识到 Braintree 在 npm 上有几个包来分别涵盖服务器端和客户端功能。安装“braintree-web”包,然后在 Backbone 客户端应用程序中使用客户端 JS 代码,并添加适当的服务器端 Braintree 代码(在我的情况下为 PHP Zend 框架)为我修复了它。
    【解决方案2】:

    完全披露:我在 Braintree 工作。如果您还有任何问题,请随时contact support。

    @chambo_e 关于节点包上可访问的属性与 Braintree.js 之间的差异的回答是正确的。 environment 属性仅在 Braintree 节点模块上可用。

    我猜您实际看到的错误是“无法找到有效的表单”,这是因为您的付款表单没有包含在表单元素中。默认情况下,Braintree.js looks for the nearest parent form。

    <form id="checkout" method="post" action="/checkout">
      <div id="panel-payment">
          <div id="payment-form"></div>
          <input id="btn-checkout" type="submit" value="Process Order">
      </div>
    </form>
    
    <script src="https://js.braintreegateway.com/v2/braintree.js"></script>
    <script>
      $(document).ready(function(){
        var clientToken = "client token generated form server";
        braintree.setup(clientToken, "dropin", {
          container: $("#payment-form")
        });
      });
    </script>
    

    如果您希望它使用不同的表单,您可以在 setup 调用中指定。见these docs for more details

    <div id="dropin-container"></div>
    <form id="checkout-form">
      <input type='submit' value='Pay'/>
    </form>
    
    <script> 
      braintree.setup("CLIENT-TOKEN-FROM-SERVER", "dropin", {
        container: "dropin-container",
        form: "checkout-form"
      });
    </script>
    

    【讨论】:

    • 非常感谢您的评论。我的表单元素很好,但让我感到困惑的是没有在正确的环境中使用 JS 代码。我没有意识到 Braintree 在 npm 上有几个(令人困惑的!)包。一个用于服务器端,另一个用于客户端!我最终安装了 Braintree-web 代码库以在我的 Backbone 客户端应用程序中使用,并将服务器端 PHP Braintree 库用于我的 Zend 框架。我将发布更详细的解释作为答案,以便对其他人有所帮助。
    猜你喜欢
    • 2016-04-07
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多