用于添加 CC 的 Braintree 托管字段

Braintree hosted field for added CC

我已经使用托管字段设置了 braintree 支付,如下所示:

在 JS 文件中:

braintree.setup(client_token, "custom", {
      id: "my-sample-form",
      paypal: {
          container: "paypal-container"
        },
        hostedFields: {
          number: {
            selector: '#my-credit-card-field',
          },
          cvv: {
            selector: '#my-security-code-field',
          },
          expirationDate: {
            selector: '#my-expiration-field',
          },
          postalCode: {
            selector: '#my-postal-code-field',
          }
        },
      });

我在尝试设置新客户时没有问题,当他们需要填写他们的 CC 详细信息时,但是,当我尝试设置现有客户时,JS 文件因不存在而失败 #my-credit-card-field,等等..

在我的 new.html.erb 中,我有这样的东西:

 <% unless current_user.has_payment_info? %>
     <div id="my-credit-card" readonly>**** **** **** <%= @last_4_number %></div>
 <% else %>
     <div id="my-credit-card-field"></div>
     <div id="my-security-code-field"></div>
     <div id="my-expiration-field"></div>
     <div id="my-postal-code-field"></div>
 <% end %>

所以我会询问新客户的抄送详细信息,现有客户可以保存他们的付款方式信息。我的控制器中有这样的东西:

def create
  @amount = params[:slider]
  @token = Braintree::Customer.find(current_user.braintree_customer_id).credit_cards.first.token
  unless current_user.has_payment_info?    
    @result = Braintree::Transaction.sale(
            amount: @amount,
            payment_method_nonce: params[:payment_method_nonce],
            options: {
               store_in_vault: true
                     })
  else
    @result = Braintree::Transaction.sale(
            customer_id: current_user.braintree_customer_id,
            amount: @amount,
            payment_method_token: @token)
  end

if @result.success?
 #Some codes here
end
end

我的问题:

如果我将现有客户表单的 ID 设置为 my-credit-card-field,那么由于 hostedfields 选择器 js,他们将需要填写详细信息。如果我没有设置任何选择器,那么 JS 文件中就会有错误。那么有没有更好的方法为已经设置付款方式的现有客户创建表单?

谢谢,我们将不胜感激!

嗯,你可以做以下两件事之一。

选项 1:一个简单的 hack。

当您不需要 Braintree 时,将 div 添加到您页面上表单外的某个位置,例如:

 <div style="display:none" id="my-credit-card-field"></div>
 <div style="display:none" id="my-security-code-field"></div>
 <div style="display:none" id="my-expiration-field"></div>
 <div style="display:none" id="my-postal-code-field"></div>

现在,在页面加载时,Braintree 会找到它们并填充它们,但不会提交任何内容。

当然,当你确实需要它时,不要将这些隐藏的 div 添加到页面(因为它们已经存在于表单中)。

选项 2(推荐):使用部分。

在不需要Braintree的情况下,真的没必要调用javascript,对吧?因此,您可以将 javascript 移动到仅在必要时才添加到页面的部分。这样,在这种情况下,Braintree 甚至都不会尝试调用来填充 div,因此没有错误。只需在您的条件块中包含渲染调用。

虽然选项 1 肯定更快,但我会推荐选项 2,因为它可能是 "right" 方法,当您忘记 hack 时,您将避免在线下的 "why do we have his hidden div" 问题。