2

編集: フォームの非モーダル バージョンで transactions.js.coffee を使用すると、すべてが機能します。へのアクセスxhrを妨げているようにフォームを処理することについての何か。または、モーダルが存在する前にオブジェクトが作成されているため、その要素がモーダルにあり、スクリプトの実行時に非表示になっているために見つからないため、サイレントに失敗しますか? たぶんモーダルで動作しませんか?Stripe.createTokenf.hidden_field :stripe_card_tokenjQuerysetupForm()$("#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()handleStripeResponseStripe 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

私の人生では、問題が何であるかを理解することはできません。どんな助けでも大歓迎です。ありがとうアミーゴ。

4

0 に答える 0