spree_stripe 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/spree_stripe/confirm_payments_controller.rb +52 -0
  3. data/app/helpers/spree_stripe/base_helper.rb +24 -2
  4. data/app/javascript/spree_stripe/controllers/stripe_button_controller.js +256 -338
  5. data/app/javascript/spree_stripe/controllers/stripe_controller.js +129 -206
  6. data/app/models/spree/payment_sessions/stripe.rb +1 -2
  7. data/app/models/spree_stripe/gateway/payment_intents.rb +0 -4
  8. data/app/models/spree_stripe/gateway/payment_sessions.rb +1 -1
  9. data/app/models/spree_stripe/order_decorator.rb +0 -27
  10. data/app/models/spree_stripe/shipment_decorator.rb +3 -3
  11. data/app/services/spree_stripe/create_payment_session.rb +18 -0
  12. data/app/services/spree_stripe/webhook_handlers/payment_intent_payment_failed.rb +4 -15
  13. data/app/services/spree_stripe/webhook_handlers/payment_intent_succeeded.rb +1 -7
  14. data/app/views/spree/checkout/payment/_spree_stripe.html.erb +58 -58
  15. data/app/views/spree_stripe/_quick_checkout.html.erb +9 -15
  16. data/config/locales/en.yml +1 -8
  17. data/config/routes.rb +3 -22
  18. data/db/migrate/20250310152812_setup_spree_stripe_models.rb +0 -17
  19. data/lib/spree_stripe/configuration.rb +0 -1
  20. data/lib/spree_stripe/engine.rb +0 -7
  21. data/lib/spree_stripe/version.rb +1 -1
  22. metadata +5 -44
  23. data/app/controllers/spree_stripe/payment_intents_controller.rb +0 -61
  24. data/app/jobs/spree_stripe/complete_order_job.rb +0 -8
  25. data/app/models/spree_stripe/payment_intent.rb +0 -81
  26. data/app/services/spree_stripe/create_payment_intent.rb +0 -40
  27. data/app/services/spree_stripe/create_setup_intent.rb +0 -20
  28. data/lib/spree_api_v2/spree/api/v2/platform/affirm_serializer.rb +0 -9
  29. data/lib/spree_api_v2/spree/api/v2/platform/after_pay_serializer.rb +0 -9
  30. data/lib/spree_api_v2/spree/api/v2/platform/alipay_serializer.rb +0 -9
  31. data/lib/spree_api_v2/spree/api/v2/platform/ideal_serializer.rb +0 -9
  32. data/lib/spree_api_v2/spree/api/v2/platform/klarna_serializer.rb +0 -9
  33. data/lib/spree_api_v2/spree/api/v2/platform/link_serializer.rb +0 -9
  34. data/lib/spree_api_v2/spree/api/v2/platform/przelewy24_serializer.rb +0 -9
  35. data/lib/spree_api_v2/spree/api/v2/platform/sepa_debit_serializer.rb +0 -9
  36. data/lib/spree_api_v2/spree/api/v2/storefront/stripe/base_controller.rb +0 -21
  37. data/lib/spree_api_v2/spree/api/v2/storefront/stripe/payment_intents_controller.rb +0 -89
  38. data/lib/spree_api_v2/spree/api/v2/storefront/stripe/setup_intents_controller.rb +0 -19
  39. data/lib/spree_api_v2/spree/v2/storefront/affirm_serializer.rb +0 -7
  40. data/lib/spree_api_v2/spree/v2/storefront/after_pay_serializer.rb +0 -7
  41. data/lib/spree_api_v2/spree/v2/storefront/alipay_serializer.rb +0 -7
  42. data/lib/spree_api_v2/spree/v2/storefront/ideal_serializer.rb +0 -7
  43. data/lib/spree_api_v2/spree/v2/storefront/klarna_serializer.rb +0 -7
  44. data/lib/spree_api_v2/spree/v2/storefront/link_serializer.rb +0 -7
  45. data/lib/spree_api_v2/spree/v2/storefront/payment_intent_serializer.rb +0 -15
  46. data/lib/spree_api_v2/spree/v2/storefront/przelewy24_serializer.rb +0 -7
  47. data/lib/spree_api_v2/spree/v2/storefront/sepa_debit_serializer.rb +0 -7
  48. data/lib/spree_api_v2/spree_stripe/v2/storefront/payment_method_serializer_decorator.rb +0 -17
  49. data/lib/spree_stripe/testing_support/factories/payment_intent_factory.rb +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29e7b17d5c521a1ecabbff665256fabda9299e5f5121d2b60f23ba102f386b7b
4
- data.tar.gz: ab6a21916a2b08f1772227bb5f9261e286f9c9350d7b775f220de530bdb8f6f9
3
+ metadata.gz: 6ec2a5a3cd5e0a0b8e5160018ad055ff16dd27a2eea3e8404e4906e83b9e0758
4
+ data.tar.gz: b51ad1b1e21337ad780f5e2269c1850b0fd1dfb39ac778db187ae0629c933944
5
5
  SHA512:
6
- metadata.gz: 765382a672704ba2660861fd1f145b43ca0418c534c63e817db38983f6cdf84d770e3ea2e870e40765a22b3ad0a7e44e4b0d368c79518ad3a10c17357f7666bf
7
- data.tar.gz: 1aec94ce6369b320efc11e2697560c4c07106ac67f3f66227e4fa0d1d48a15cda0972ffe892e3c6bcd35f0230718eed32459a845e685242f713dd3e4b0f2eacf
6
+ metadata.gz: f3f47966c0982f865f7dfa55074f4df6c2f8c90e2c5bdb656012266eb7c46ed690260b47fab15d7fabf0889fbaef8d22fbd153548d23f4316bcc6cdca4353d64
7
+ data.tar.gz: 4c9696c085fa47b26f0eb6c6dd06f4b855e0de02dd7ec583efea2c552e8be03c9d9f2952500001357ae04c06e0315a65374846a833d2267a7b6ed89b4b25e325
@@ -0,0 +1,52 @@
1
+ # Stripe redirects here after payment confirmation. Mirrors the Next.js storefront's server-side
2
+ # completion: finalizes the payment session + order via existing services, then
3
+ # redirects to the confirmation page. Completion is idempotent — an already-completed
4
+ # order (e.g. the webhook won the race) is treated as success.
5
+ module SpreeStripe
6
+ class ConfirmPaymentsController < (defined?(Spree::StoreController) ? Spree::StoreController : Spree::BaseController)
7
+ include Spree::CheckoutAnalyticsHelper if defined?(Spree::CheckoutAnalyticsHelper)
8
+
9
+ # GET /stripe/confirm_payment/:id?session=ps_...&redirect_status=...
10
+ def show
11
+ @order = current_store.orders.find_by_prefix_id!(params[:id])
12
+
13
+ return redirect_to_cart_canceled if @order.canceled?
14
+ return redirect_to_complete if @order.completed?
15
+
16
+ payment_session = @order.payment_sessions.find_by_prefix_id!(params[:session])
17
+ payment_session.payment_method.complete_payment_session(
18
+ payment_session: payment_session,
19
+ params: { session_result: params[:redirect_status] }
20
+ )
21
+
22
+ return handle_failure(payment_session.errors.full_messages.to_sentence) unless payment_session.completed?
23
+
24
+ Spree::Dependencies.carts_complete_service.constantize.call(cart: @order) unless @order.completed?
25
+
26
+ if @order.reload.completed?
27
+ track_checkout_completed if respond_to?(:track_checkout_completed)
28
+ redirect_to_complete
29
+ else
30
+ handle_failure
31
+ end
32
+ rescue Spree::Core::GatewayError => e
33
+ handle_failure(e.message)
34
+ end
35
+
36
+ private
37
+
38
+ def redirect_to_complete
39
+ redirect_to spree.checkout_complete_path(@order.token), status: :see_other
40
+ end
41
+
42
+ def redirect_to_cart_canceled
43
+ flash[:error] = Spree.t(:order_canceled)
44
+ redirect_to spree.cart_path, status: :see_other
45
+ end
46
+
47
+ def handle_failure(message = nil)
48
+ flash[:error] = message.presence || Spree.t('stripe.payment_could_not_be_processed')
49
+ redirect_to spree.checkout_state_path(@order.token, 'payment'), status: :see_other
50
+ end
51
+ end
52
+ end
@@ -4,10 +4,32 @@ module SpreeStripe
4
4
  @current_stripe_gateway ||= current_store.stripe_gateway
5
5
  end
6
6
 
7
- def current_stripe_payment_intent
7
+ # Server-side payment session for the current order, used for the legacy
8
+ # Rails storefront payment flow: reuses the order's pending Stripe
9
+ # session (keeping its amount in sync) or creates one. Memoized per request.
10
+ # @return [Spree::PaymentSessions::Stripe, nil]
11
+ def current_stripe_payment_session
8
12
  return if current_stripe_gateway.nil?
9
13
 
10
- @current_stripe_payment_intent ||= SpreeStripe::CreatePaymentIntent.new.call(@order, current_stripe_gateway)
14
+ @current_stripe_payment_session ||= SpreeStripe::CreatePaymentSession.new.call(@order, current_stripe_gateway)
15
+ end
16
+
17
+ # The cart-prefixed id the v3 Store API addresses carts by (e.g. `cart_xxx`).
18
+ # Must match Spree::Api::V3::CartSerializer's encoding exactly.
19
+ # @return [String]
20
+ def stripe_cart_prefixed_id(order)
21
+ "cart_#{Spree::PrefixedId::SQIDS.encode([order.id])}"
22
+ end
23
+
24
+ # The store's publishable Spree API key, used by the storefront JS as the
25
+ # `X-Spree-API-Key` header for v3 Store API calls. Creates one on first use
26
+ # when the store has no active publishable key yet.
27
+ # @return [String]
28
+ def current_store_publishable_api_key
29
+ @current_store_publishable_api_key ||= (
30
+ current_store.api_keys.publishable.active.first ||
31
+ current_store.api_keys.create!(key_type: 'publishable', name: 'Storefront')
32
+ ).plaintext_token
11
33
  end
12
34
  end
13
35
  end