diff --git a/app/assets/javascripts/darkswarm/services/checkout.js.coffee b/app/assets/javascripts/darkswarm/services/checkout.js.coffee index 8df1caf754..3c1ebcf773 100644 --- a/app/assets/javascripts/darkswarm/services/checkout.js.coffee +++ b/app/assets/javascripts/darkswarm/services/checkout.js.coffee @@ -5,7 +5,7 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeJ order: CurrentOrder.order purchase: -> - if @paymentMethod()?.method_type == 'stripe' + if @paymentMethod()?.method_type == 'stripe' && !@secrets.selected_card StripeJS.requestToken(@secrets, @submit) else @submit() @@ -60,14 +60,21 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeJ } if @paymentMethod()?.method_type == 'stripe' - angular.extend munged_order.payments_attributes[0], { - source_attributes: - gateway_payment_profile_id: @secrets.token - cc_type: @secrets.cc_type - last_digits: @secrets.card.last4 - month: @secrets.card.exp_month - year: @secrets.card.exp_year - } + if @secrets.selected_card + angular.extend munged_order.payments_attributes[0], { + source_attributes: + id: @secrets.selected_card + type: 'Spree::CreditCard' + } + else + angular.extend munged_order.payments_attributes[0], { + source_attributes: + gateway_payment_profile_id: @secrets.token + cc_type: @secrets.cc_type + last_digits: @secrets.card.last4 + month: @secrets.card.exp_month + year: @secrets.card.exp_year + } munged_order diff --git a/app/views/spree/checkout/payment/_gateway.html.haml b/app/views/spree/checkout/payment/_gateway.html.haml index 72775e36db..8fbf7dc052 100644 --- a/app/views/spree/checkout/payment/_gateway.html.haml +++ b/app/views/spree/checkout/payment/_gateway.html.haml @@ -10,17 +10,17 @@ %input{type: :text, disabled: true, "ng-value" => "order.bill_address.lastname"} .small-6.columns - = validated_input t(:card_number), "secrets.card_number", "ng-required" => "!selected_card", maxlength: 19, autocomplete: "off", "ng-disabled" => "!!selected_card" + = validated_input t(:card_number), "secrets.card_number", "ng-required" => "!secrets.selected_card", maxlength: 19, autocomplete: "off", "ng-disabled" => "!!secrets.selected_card" .small-6.columns - = validated_input t(:card_securitycode), "secrets.card_verification_value", "ng-required" => "!selected_card", "ng-disabled" => "!!selected_card" + = validated_input t(:card_securitycode), "secrets.card_verification_value", "ng-required" => "!secrets.selected_card", "ng-disabled" => "!!secrets.selected_card" .row .small-12.columns %label{for: "secrets.card_month"} - = t :card_expiry_date, "ng-disabled" => "!!selected_card" + = t :card_expiry_date, "ng-disabled" => "!!secrets.selected_card" .row .small-6.columns - %select{"ng-model" => "secrets.card_month", "ng-options" => "currMonth.value as currMonth.key for currMonth in months", name: "secrets.card_month", "ng-required" => "!selected_card", "ng-disabled" => "!!selected_card"} + %select{"ng-model" => "secrets.card_month", "ng-options" => "currMonth.value as currMonth.key for currMonth in months", name: "secrets.card_month", "ng-required" => "!secrets.selected_card", "ng-disabled" => "!!secrets.selected_card"} .small-6.columns - %select{"ng-model" => "secrets.card_year", "ng-options" => "year for year in years", name: "secrets.card_year", "ng-required" => "!selected_card", "ng-disabled" => "!!selected_card"} + %select{"ng-model" => "secrets.card_year", "ng-options" => "year for year in years", name: "secrets.card_year", "ng-required" => "!secrets.selected_card", "ng-disabled" => "!!secrets.selected_card"} diff --git a/app/views/spree/checkout/payment/_stripe.html.haml b/app/views/spree/checkout/payment/_stripe.html.haml index 153262c43b..ad94b03e1b 100644 --- a/app/views/spree/checkout/payment/_stripe.html.haml +++ b/app/views/spree/checkout/payment/_stripe.html.haml @@ -2,7 +2,7 @@ .small-12.columns %label = t :previously_used_credit_cards - %select{"ng-model" => "selected_card", "ng-options" => "card.id as card.formatted for card in savedCreditCards", name: "selected_card", required: false} + %select{"ng-model" => "secrets.selected_card", "ng-options" => "card.id as card.formatted for card in savedCreditCards", name: "selected_card", required: false} = render "spree/checkout/payment/gateway", payment_method: payment_method diff --git a/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee index 95ee9e8416..67a93f44d1 100644 --- a/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/checkout_spec.js.coffee @@ -125,6 +125,13 @@ describe 'Checkout service', -> Checkout.purchase() expect(StripeJS.requestToken).toHaveBeenCalled() + it "doesn't hit Stripe when reusing a credit card", inject (StripeJS) -> + spyOn(StripeJS, "requestToken") + Checkout.secrets.selected_card = 1 + Checkout.purchase() + expect(StripeJS.requestToken).not.toHaveBeenCalled() + + describe "data preprocessing", -> beforeEach -> Checkout.order.payment_method_id = 99