- checkoutSession() keeps pending purchases in step with the cart: a buyer
who cancels on Stripe and edits the cart pays for (and is invoiced) the
cart as it is, not the first attempt.
- checkout.session.completed is idempotent and locked per payment: a
redelivered event, a concurrent charge.succeeded or the success page
record the payment once. An unpaid (async) session creates the order but
records no payment until Stripe settles it.
- New StripeCheckoutConfirmation + WS cart.confirm {session_id}: the
success page settles a paid session through the webhook's code path, so
the order exists the moment the buyer is back.
- CartService::guest() never hands a converted cart back to its session.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| Cart | ||
| Enums | ||
| Models | ||
| Order | ||
| Product | ||
| Purchase | ||
| Resources | ||
| Stripe | ||
| HtmlDateTimeCastTest.php | ||
| ShopServiceTest.php | ||
| StockManagementTest.php | ||
| StockTypeSafetyTest.php | ||
| TaxServiceTest.php | ||