9

Stripe ve Ruby on Rails 3.2 ile küçük bir kavram kanıtı yapıyorum. Şimdiye kadar bir RoR uygulamasında Stripe'u nasıl uygulayacağına dair Railscast'i izledim ve gerçekten iyi çalışıyor.Şerit istisnalarının nerede ve nasıl yapılır?

Uygulamamı RailsCast #288 Billing with Stripe izleyerek oluşturdum. Artık kullanıcılarım kredi kartlarını ekleyebilir ve düzenleyebilir, hatta derslere kaydolabilir ve kredi kartlarını tamamlandıktan sonra faturalandırabilirler.

Şimdi Stripe'in sayısız test credit cards ile test ediyorum ve yükseltildiğinde çok fazla özel durum yakalamak istiyorum.

class Registration < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :session 

    attr_accessible :session_id, :user_id, :session, :user, :stripe_payment_id 
    validates :user_id, :uniqueness => {:scope => :session_id} 

    def save_with_payment(user, stripe_card_token) 
    if valid? 
     if user.stripe_customer_id.present? 
     charge = Stripe::Charge.create(
      :customer => user.stripe_customer_id, 
      :amount => self.session.price.to_i * 100, 
      :description => "Registration for #{self.session.name} (Id:#{self.session.id})", 
      :currency => 'cad' 
     ) 
     else 
     customer = Stripe::Customer.create(
      :email => user.email, 
      :card => stripe_card_token, 
      :description => user.name 
     ) 
     charge = Stripe::Charge.create(
      :customer => customer.id, 
      :amount => self.session.price.to_i * 100, 
      :description => "Registration for #{self.session.name} (Id:#{self.session.id})", 
      :currency => 'cad' 
     ) 
     user.update_attribute(:stripe_customer_id, customer.id) 
     end 
     self.stripe_payment_id = charge.id 
     save! 
    end 
    rescue Stripe::CardError => e 
    body = e.json_body 
    err = body[:error] 
    logger.debug "Status is: #{e.http_status}" 
    logger.debug "Type is: #{err[:type]}" 
    logger.debug "Code is: #{err[:code]}" 
    logger.debug "Param is: #{err[:param]}" 
    logger.debug "Message is: #{err[:message]}" 
    rescue Stripe::InvalidRequestError => e 
    # Invalid parameters were supplied to Stripe's API 
    rescue Stripe::AuthenticationError => e 
    # Authentication with Stripe's API failed 
    # (maybe you changed API keys recently) 
    rescue Stripe::APIConnectionError => e 
    # Network communication with Stripe failed 
    rescue Stripe::StripeError => e 
    # Display a very generic error to the user, and maybe send 
    # yourself an email 
    rescue => e 
    # Something else happened, completely unrelated to Stripe 
    end 
end 

Ben sadece şu anda hatalardan kurtarmak ve gerçekten birinin ardından eyleme değilim ortaya atılan ve sonuçta ben o anki sınıfı durdurmak istiyorum: Burada gösterisi olarak benim Tescil modelinde Çizgili example hatalarını kullanıyorum kayıt olmasından ve bir flash hatası ile bir kullanıcıyı yönlendirmek.

rescure_from hakkında okudum ama olası tüm Şerit hatalarını işlemenin en iyi yolunun ne olduğundan emin değilim. Modelden yönlendiremediğimi biliyorum, uzmanlar bunu nasıl hallederdi?

İşte benim Tescil denetleyicisi var: yanıt verdiğiniz için

class Classroom::RegistrationsController < ApplicationController 
    before_filter :authenticate_user! 

    def new 
    if params[:session_id] 
     @session = Session.find(params[:session_id]) 
     @registration = Registration.new(user: current_user, session: @session) 
    else 
     flash[:error] = "Course session is required" 
    end 

    rescue ActiveRecord::RecordNotFound 
     render file: 'public/404', status: :not_found 

    end 

    def create 
    if params[:session_id] 
     @session = Session.find(params[:session_id]) 
     @registration = Registration.new(user: current_user, session: @session) 
     if @registration.save_with_payment(current_user, params[:stripe_card_token]) 
     flash[:notice] = "Course registration saved with success." 
     logger.debug "Course registration saved with success." 
     mixpanel.track 'Registered to a session', { :distinct_id => current_user.id, 
              :id => @session.id, 
              'Name' => @session.name, 
              'Description' => @session.description, 
              'Course' => @session.course.name 
     } 
     mixpanel.increment current_user.id, { :'Sessions Registered' => 1} 
     mixpanel.track_charge(current_user.id, @session.price.to_i) 
     else 
     flash[:error] = "There was a problem saving the registration." 
     logger.debug "There was a problem saving the registration." 
     end 
     redirect_to root_path 
    else 
     flash[:error] = "Session required." 
     redirect_to root_path 
    end 
    end 

end 

sayesinde, çok takdir!

Francis

cevap

10

bir özel doğrulama aslında Çizgili çağrıyı koyarak düşündünüz mü?

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validate

sadece koyamazsınız neden bu arkasındaki mantık sadece bu yüzden yine 'işlem' olarak başarılı işlemler kaydetmek istediğiniz aşağıdaki

gibi bir şeyle nesneye hataları ekleyebilirsiniz Bu şekilde Doğrulayıcıda şerit yükü.

validate :card_validation 

def card_validation 

    begin 
     charge = Stripe::Charge.create(
      :customer => user.stripe_customer_id, 
      :amount => self.session.price.to_i * 100, 
      :description => "Registration for #{self.session.name} (Id:#{self.session.id})", 
      :currency => 'cad' 
     ) 
     etc etc 
    rescue => e 
     errors.add(:credit_card, e.message) 
     #Then you might have a model to log the transaction error. 
     Error.create(charge, customer) 
    end 

end 

Bu şekilde bir giriş tasarruf yerine boş bir hata mesajı vererek veya Stripe'dan her geçen hatayı işlemek zorunda değil alacağı başka hataları gibi hatalar işleyebilir.

class Classroom::RegistrationsController < ApplicationController 
    before_filter :authenticate_user! 

    def create 
    if params[:session_id] 
     @session = Session.find(params[:session_id]) 

     params[:registration][:user] = current_user 
     params[:registration][:session] = @session 
     params[:registration][:stripe_card_token] = params[:stripe_card_token] 

     @registration = Registration.new(params[:registration]) 
     respond_with(@registration) do |format| 
     if @registration.save 
      format.html {redirect_to root_path, :notice => "SOMETHING HERE TO TELL THEM SUC"} 
     else 
      format.html {render} 
     end 
     end 
    else 
     respond_with do |format| 
     format.html {redirect_to root_path, :error => "SOMETHING HERE TO TELL THEM GET SESSION"} 
     end 
    end 
    end 

end 
+0

Girdiğiniz için teşekkürler, daha önce custom_validator'ı hiç duymamıştım (raylarla yeni başladı). Bu yüzden doğru bir şekilde anlarsam, tüm Stripe faturalama mantığını Kayıt modelimde bir yönteme koymalıyım? Kayıt kontrolörü ile ne olacak? Bir kullanıcıyı bir flash hatasıyla nasıl yönlendiririm? Birçok soru için üzgünüm, hala şaşkın :) –

+1

Güncelleme% 100 kesin değil ama genel olarak fikir – rovermicrover

+0

cevabını güncelledim, her zaman bir kayıt modeli veritabanına kaydedilir, validate: card_validation çağrılır (biraz bir önceki filtre gibi) ve sadece geçerli işlem/kartlar kaydedin. Girdiğiniz için teşekkürler! –