From 05a2629f8c742e18b1aedc8f0575f4b5ed73a0bd Mon Sep 17 00:00:00 2001 From: Chris Beach Date: Tue, 17 Oct 2017 12:35:14 +0100 Subject: [PATCH] Add checkout method --- .../discourse_donations/charges_controller.rb | 26 +++++++++++++++++++ app/services/discourse_donations/stripe.rb | 10 +++++++ 2 files changed, 36 insertions(+) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 1e4fb27..f03e6d9 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -9,6 +9,32 @@ module DiscourseDonations skip_before_action :verify_authenticity_token, only: [:create] + def checkout + output = { 'messages' => [], 'rewards' => [] } + payment = DiscourseDonations::Stripe.new(secret_key, stripe_options) + begin + payment.checkoutCharge(user_params[:amount], user_params[:stripe_options]) + rescue ::Stripe::CardError => e + err = e.json_body[:error] + + output['messages'] << "There was an error (#{err[:type]})." + output['messages'] << "Error code: #{err[:code]}" if err[:code] + output['messages'] << "Decline code: #{err[:decline_code]}" if err[:decline_code] + output['messages'] << "Message: #{err[:message]}" if err[:message] + + render(:json => output) and return + end + + if charge['paid'] == true + output['messages'] << I18n.t('donations.payment.success') + + output['rewards'] << { type: :group, name: group_name } if group_name + output['rewards'] << { type: :badge, name: badge_name } if badge_name + end + + render :json => output + end + def create output = { 'messages' => [], 'rewards' => [] } diff --git a/app/services/discourse_donations/stripe.rb b/app/services/discourse_donations/stripe.rb index c93fffd..0acbbe7 100644 --- a/app/services/discourse_donations/stripe.rb +++ b/app/services/discourse_donations/stripe.rb @@ -9,6 +9,16 @@ module DiscourseDonations @currency = opts[:currency] end + def checkoutCharge(amount, token) + @charge = Stripe::Charge.create( + :amount => amount, + :currency => opts[:currency], + :description => @description, + :source => token, + ) + @charge + end + def charge(email, opts) customer = ::Stripe::Customer.create( email: email,