diff --git a/app/assets/javascripts/darkswarm/services/checkout.js.coffee b/app/assets/javascripts/darkswarm/services/checkout.js.coffee index 94c871a482..85e5e8ae94 100644 --- a/app/assets/javascripts/darkswarm/services/checkout.js.coffee +++ b/app/assets/javascripts/darkswarm/services/checkout.js.coffee @@ -61,10 +61,8 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeJ if @paymentMethod()?.method_type == 'stripe' if @secrets.selected_card - angular.extend munged_order.payments_attributes[0], { - source_attributes: - credit_card_id: @secrets.selected_card - type: 'Spree::CreditCard' + angular.extend munged_order, { + existing_card: @secrets.selected_card } else angular.extend munged_order.payments_attributes[0], { @@ -75,7 +73,6 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeJ month: @secrets.card.exp_month year: @secrets.card.exp_year } - munged_order shippingMethod: -> diff --git a/app/controllers/checkout_controller.rb b/app/controllers/checkout_controller.rb index be35682a7b..d06eb1f1c2 100644 --- a/app/controllers/checkout_controller.rb +++ b/app/controllers/checkout_controller.rb @@ -119,6 +119,9 @@ class CheckoutController < Spree::CheckoutController if (params[:order][:payments_attributes]) params[:order][:payments_attributes].first[:amount] = @order.total end + if params[:order][:existing_card] + construct_saved_card_attributes + end params[:order] end @@ -202,4 +205,21 @@ class CheckoutController < Spree::CheckoutController render json: {path: spree.paypal_express_url(payment_method_id: payment_method.id)}, status: 200 true end + + def construct_saved_card_attributes + existing_card_id = params[:order].delete(:existing_card) + if existing_card_id.present? + credit_card = Spree::CreditCard.find(existing_card_id) + if credit_card.user_id != spree_current_user.id || credit_card.user_id.blank? + raise Core::GatewayError.new Spree.t(:invalid_credit_card) + end + + # Not currently supported but maybe we should add it...? + credit_card.verification_value = params[:cvc_confirm] if params[:cvc_confirm].present? + + params[:order][:payments_attributes].first[:source] = credit_card + params[:order][:payments_attributes].first[:payment_method_id] = credit_card.payment_method_id + params[:order][:payments_attributes].first.delete :source_attributes + end + end end diff --git a/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee index cb0d99f8b2..d21f10fb15 100644 --- a/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee @@ -204,8 +204,6 @@ describe 'Checkout service', -> it "passes the card ID in source attributes if a saved card is selected", -> Checkout.secrets.selected_card = 1 - source_attributes = Checkout.preprocess().payments_attributes[0].source_attributes + source_attributes = Checkout.preprocess() expect(source_attributes).toBeDefined() - expect(source_attributes.credit_card_id).toBe 1 - expect(source_attributes.type).toBe "Spree::CreditCard" - expect(source_attributes.year).toBeUndefined() + expect(source_attributes.existing_card).toBe 1