編集:
フォームの非モーダル バージョンで transactions.js.coffee を使用すると、すべてが機能します。へのアクセスxhr
を妨げているようにフォームを処理することについての何か。または、モーダルが存在する前にオブジェクトが作成されているため、その要素がモーダルにあり、スクリプトの実行時に非表示になっているために見つからないため、サイレントに失敗しますか? たぶんモーダルで動作しませんか?Stripe.createToken
f.hidden_field :stripe_card_token
jQuery
setupForm()
$("#new_transaction_button")
:attr_accessor :stripe_card_token
ユーザーがモーダル ウィンドウにクレジット カードの詳細を入力できるようにしようとしています。私はこれをくまなく調べましたが、Stripe がトークンを空の文字列として設定し続ける理由を理解できませんStripe error while creating customer: Empty string given for card.
これは、フォームが jquery によって渡される方法に問題があると思われます。
これが私のtransactions.js.coffee
ファイルです:
jQuery ->
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
transaction.setupForm()
transaction =
setupForm: ->
$("#new_transaction_button").click ->
$('input[type=submit]').attr('disabled', true)
transaction.processCard()
valuesToSubmit = $("#new_transaction").serialize()
$("#new_transaction_modal").modal "hide"
.ajax(
url: "/posts"
data: valuesToSubmit
type: "POST"
).success (data, status) ->
false
processCard: ->
card =
number: $('#card_number').val()
cvc: $('#card_code').val()
exp_month: $('#card_month').val()
exp_year: $('#card_year').val()
Stripe.createToken(card, transaction.handleStripeResponse)
handleStripeResponse: (status, response) ->
if status == 200
$('#transaction_stripe_card_token').val("test")
$('#new_transaction')[0].submit()
else
alert(response.error.message)
上記の関数では、関数が呼び出されていないように見えることを示すために as "test" をhandleStripeResponse
設定しました。これは正しいです?もしそうなら、なぜ呼ばれないのですか?コントローラーがモーダルフォームを処理する方法が原因ですか?#transaction_stripe_card_token.val()
handleStripeResponse
Stripe error while creating customer: string "test" given for card.
handleStripeResponse
transactions_controller.rb
def create
if @post = Post.where(:id => flash[:the_post_id]).first
#@price = @post.price
@tier_id = @post.tier_id
@amount = @tier_id*100
else
@amount = 1000
end
respond_to do |format|
#non-user encountered form and entered credit details AND password- signing up and paying
if !current_user && params[:password].present?
@user = User.new(:email => params[:transaction][:email], :password => params[:password])
@transaction = @user.transactions.new(params[:transaction].merge(:price => @amount))
@transaction.save_customer(@user)
if @transaction.save && @user.save
@user.charge_as_customer(@amount)
#sign_in @user
format.js { render }
format.html { redirect_to @transaction, notice: 'Transaction was successfully created.' }
format.json { render json: @transaction, status: :created, location: @transaction }
else
format.html { render action: "new" }
format.json { render json: @transaction.errors, status: :unprocessable_entity }
end
モーダル クレジット カード フォーム: (空白/インデントは本番環境では正しいです。コピー/貼り付けに問題があります)
= simple_form_for @transaction, :validate => true, :remote => true, :form => { "data-type" => "json" } do |f|
%div.modal-header
%button.close{"aria-hidden" => "true", "data-dismiss" => "modal", :type => "button"} ×
- if @transaction.errors.any?
#error_explanation
%h2= "#{pluralize(@transaction.errors.count, "error")} prohibited this transaction from being saved:"
%ul
- @transaction.errors.full_messages.each do |msg|
%li= msg
%div.modal-body
=hidden_field_tag :post_id
= f.hidden_field :stripe_card_token
%div.row-fluid
%div
= label_tag :credit_card_number, nil, :id => "credit_label"
= text_field_tag :credit_card_number,nil, :class=>"credit-number span12", :id => "card_number"
%div.row-fluid
%div.span4
= label_tag :card_month, "Card Expiration"
= select_month nil, {:add_month_numbers => true}, {:name => nil, :id => "card_month"}
= select_year nil, {:start_year => Date.today.year, :end_year => Date.today.year+15}, {:name => nil, :id => "card_year"}
%div.span3
%div.span2.credit-cvv
= label_tag :cvv, "CVV"
= text_field_tag :cvv, nil, :class=>"credit-cvv input-block-level", :id => "card_code"
%div.row-fluid
=f.label :email
=f.text_field :email, :validate => true
-unless current_user
%div.row-fluid
=label_tag :password
=text_field_tag :password, params[:password]
%div.modal-footer
= f.button :submit, name: 'Get It', class: "btn-primary", id: "new_transaction_button"
そして、徹底的にするために、これが私save_customer
の取引方法です:
attr_accessor :stripe_card_token
def save_customer(user)
if valid?
customer = Stripe::Customer.create( :description => email, :card => stripe_card_token)
user.stripe_customer_id = customer.id
save!
end
rescue Stripe::InvalidRequestError => e
logger.error "Egads, Stripe error while creating customer: #{e.message}"
errors.add :base, "There was a problem with your credit card."
false
end
私の人生では、問題が何であるかを理解することはできません。どんな助けでも大歓迎です。ありがとうアミーゴ。