diff --git a/app/controllers/checkout_controller.rb b/app/controllers/checkout_controller.rb index dd1a67c702..b79df645c0 100644 --- a/app/controllers/checkout_controller.rb +++ b/app/controllers/checkout_controller.rb @@ -152,11 +152,23 @@ class CheckoutController < Spree::StoreController checkout_succeeded redirect_to(order_path(@order)) && return else + persist_all_payments if @order.state == "payment" flash[:error] = order_error checkout_failed end end + # When a payment fails, the order state machine rollbacks all transactions + # Here we ensure we always persist all payments + def persist_all_payments + @order.payments.each do |payment| + original_payment_state = payment.state + if original_payment_state != payment.reload.state + payment.update(state: original_payment_state) + end + end + end + def checkout_workflow(shipping_method_id) while @order.state != "complete" if @order.state == "payment"