2015-01-14 12 views
5

Utilizzo Rails 4.2 e cerco di integrare Stripe Checkout (https://stripe.com/docs/checkout/guides/rails) nella mia app per rails e ho uno scenario che non ho visto delineato ovunque. Nota: ho provato l'integrazione di moduli personalizzati da un certo numero di risorse online, ma non ho potuto farlo funzionare così ho deciso di dare checkout.Cercando di inviare il modulo Rails solo dopo il pagamento con stripe di successo Pagamento

Nella mia app per rotaie, ho una tabella degli ordini e la cosa principale che sto cercando di realizzare è avere un modulo in cui l'utente può inviare le proprie informazioni personali (mancato pagamento) per effettuare un ordine. Quindi, l'integrazione di checkout stripe consentirà loro di pagare; tuttavia, una registrazione dell'ordine non verrà creata nel database senza che venga registrato un costo di stripe. Non sono stato in grado di farlo utilizzando l'apposito controller "oneri" suggerito dalla striscia e ho anche provato a incorporare il codice stripe nel mio controller degli ordini (vedi sotto).

Vorrei sottolineare che io HO stato in grado di ottenere il pulsante checkout per presentare al Stripe e le accuse sono elaborati, ma non hanno stato in grado di ottenere un record per essere creato nel mio database.

Ho cercato in lungo e in largo per una risposta a questa domanda (attualmente in attesa di risposta dal supporto stripe). Qualsiasi suggerimento sarebbe molto apprezzato!

orders_controller.rb

(questo è l'esempio in cui ho provato combinando il codice stripe dal controller oneri suggeriscono nel mio regolatore di ordini. Io non sono sicuro che ora che cosa fare dopo la carica viene elaborato per farlo inviare il modulo)

def create 
    @order = Order.new(order_params) 

    customer = Stripe::Customer.create(
    :email => '[email protected]com', 
    :card => params[:stripeToken] 
) 

    charge = Stripe::Charge.create(
    :customer => customer.id, 
    :amount  => 5000, 
    :description => 'Rails Stripe customer', 
    :currency => 'usd' 
) 

    rescue Stripe::CardError => e 
    flash[:error] = e.message 
    render 'new' 
    end 

ordini/new.html.erb

(sto tralasciando il codice per tutti gli altri campi nel mio modulo, questo mostra solo il pulsante di invio del modulo e il pulsante di verifica dello stripe. Idealmente avrei potuto combinare le azioni in un unico tasto, o hanno solo il submit passare attraverso quando il pagamento elabora con successo attraverso la banda)

<%= form_for @order do |f| %> 
    // lots of form fields 
<%= f.submit %> 

<script src="https://checkout.stripe.com/checkout.js" class="stripe-button" 
     data-key="<%= Rails.configuration.stripe[:publishable_key] %>" 
     data-description="A month's subscription" 
     data-amount="500"></script> 

risposta

11

In genere si dovrebbe fare ...

def create 
    @order = Order.new(order_params) 
    charge_error = nil 

    if @order.valid? 
    begin 
     customer = Stripe::Customer.create(
     :email => '[email protected]', 
     :card => params[:stripeToken]) 

     charge = Stripe::Charge.create(
     :customer => customer.id, 
     :amount  => 5000, 
     :description => 'Rails Stripe customer', 
     :currency => 'usd') 

    rescue Stripe::CardError => e 
     charge_error = e.message 
    end 
    if charge_error 
     flash[:error] = charge_error 
     render :new 
    else 
     @order.save 
     redirect_to (successful page) 
    end 
    else 
    flash[:error] = 'one or more errors in your order' 
    render :new 
    end 
end 

In questo modo il l'addebito non viene effettuato a meno che @order non venga convalidato e @order non venga salvato a meno che l'addebito non abbia esito positivo.

+0

Grazie mille. Ha funzionato come un fascino! –

Problemi correlati