我正在尝试提交一个表单,通过 Braintree.js 创建新用户(设计)和支付 token ,所有这些都以一个表单的形式进行。我的 html 表单如下所示。
<div class="container">
<h2 class='registration'>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: {:class => 'col-sm-12'}) do |f| %>
<%= devise_error_messages! %>
<div class="form-horizontal">
<%= f.label :email, class: "col-sm-3 control-label" %>
<div class="col-sm-7">
<%= f.email_field :email, class: "form-control" %>
</div>
</div><br /><br />
<div class="form-horizontal">
<%= f.label :full_name, class: "col-sm-3 control-label" %>
<div class="col-sm-7">
<%= f.text_field :full_name, class: "form-control",autofocus: true %>
</div>
</div><br /><br />
<div class="form-horizontal">
<%= f.label :password, class: "col-sm-3 control-label" %>
<div class="col-sm-7">
<%= f.password_field :password, autocomplete: "off", class: "form-control" %>
</div>
</div><br /><br />
<div class="form-horizontal">
<%= f.label :password_confirmation, class: "col-sm-3 control-label" %>
<div class="col-sm-7">
<%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %>
</div>
</div><br /><br />
<input data-braintree-name="number" value="4111111111111111">
<input data-braintree-name="cvv" value="100">
<input data-braintree-name="expiration_month" value="10">
<input data-braintree-name="expiration_year" value="2020">
<div id="braintree-container"></div>
<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
<script>
braintree.setup("MY BRAINTREE TOKEN",
"custom",
{
container: "braintree-container",
paymentMethodNonceInputField: "payment-method-nonce"}
);
var client = new braintree.api.Client({clientToken: <%= @client_token %>});
client.tokenizeCard({number: "4111111111111111", expirationDate: "10/20"}, function (err, nonce) {
</script>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-6">
<%= f.submit "Sign up", class: "btn btn-primary form-registration", id: "user-form-submit" %>
</div>
</div><br /><br />
<% end %>
</div>
当我提交此内容时,我认为应该发生的事情是。 Rails 创建一个新用户。然后 Braintree.js 使用 CC 信息向他们的服务发出请求,并发送回带有值的 params[: payment method_nonce] 。然而,发生的情况是用户被创建,但我没有返回有关 payment_method_nonce 的信息。
您可能会问为什么我要尝试从一页添加所有这些信息?我计划创建一个后台工作人员来在用户注册后创建订阅。
Controller (我的用户 Controller )
class Users::RegistrationsController < Devise::RegistrationsController
def new
@client_token = Braintree::ClientToken.generate()
super
end
def create
super
end
def configure_sign_up_params
devise_parameter_sanitizer.for(:sign_up) << [:full_name, :credit_card, :cvc,
:expiration_month, :expiration_year, :token, :client_token]
end
我的架构如下所示
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.string "full_name", null: false
t.string "token"
end
其他信息
-Rails 4 - ruby 2.0 - Braintree.js v2
最佳答案
我在布伦特里工作。 Braintree 的自定义集成旨在让您控制表单的外观,同时仍然自动处理信用卡信息到 BT 服务器的安全传输,并向您的表单添加支付方式随机数。它不与 Braintree.api.Client 和卡标记化结合使用;仅当您想自己处理卡数据的标记化或在提交之前对表单执行更复杂的操作时才使用此方法。
至于为什么您没有获得随机数,您是否在对 braintree.setup
的调用中插入了客户端 token (就像您在创建客户端时所做的那样)?此外,由于您要向设置调用提供 paymentMethodNonceInputField
,因此这是 BT javascript 将用于向您发送随机数的隐藏输入的名称。这是一个可选字段,因此除非您有理由使用破折号而不是下划线命名此参数,否则您可能需要删除它。如果您同时执行这两项操作,则应可以在 Controller 中以 params[: payment_method_nonce]
的形式访问随机数。
最后,我们不建议以与付款方式相同的形式创建用户。有时,用户会在错误的字段中输入信用卡数据,在这种情况下,该数据最终会出现在您的服务器上。
为了实现你的目标,你可能需要颠倒事情发生的顺序,并有两种不同的形式。首先,单击提交并让 Braintree.js 执行其操作,然后在传递给它的回调中,获取结果并将其放入您提交到 Rails 的单独表单中并提交,然后使用信息进行用户创建等该表单提交。
您可能需要联系Braintree support如果您还有其他问题。
关于ruby-on-rails - 使用 Braintree.js 创建具有 CC 信息的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28464934/