Bezahlt wird jetzt direkt auf /checkout: die Checkout-Session laeuft mit ui_mode "embedded_page", das Zahlungsformular ist ein Stripe-iframe (PCI SAQ A bleibt). PayPal, Karte, SEPA und Klarna kommen weiterhin dynamisch aus dem Dashboard. - Zahlungsschritt ersetzt das Formular; "Zurueck zu deinen Angaben" gibt Sitzung und Bestand sofort frei (POST /api/checkout/cancel) und behaelt alle Eingaben, Turnstile wird neu geladen - Rueckkehrseite prueft serverseitig bei Stripe und gleicht die Sitzung mit der eigenen Bestellung ab; bei abgebrochener PayPal-Zahlung wird dieselbe Sitzung erneut eingebettet - Erneuter Versuch und Abbruch sind per HttpOnly-Cookie an den bestellenden Browser gebunden, die session_id in der URL allein reicht nicht - Alte /checkout/cancel?ref= Links aendern per GET nichts mehr - CSP um die Stripe-Hosts fuer Embedded Checkout und 3-D-Secure erweitert - STRIPE_PUBLISHABLE_KEY zur Laufzeit gelesen (kein NEXT_PUBLIC_), mit Preflight-Pruefung auf pk_live und Schutz gegen versehentliche sk_/rk_ Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
21 lines
500 B
TypeScript
21 lines
500 B
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
import { useCartStore } from "@/store/cart-store";
|
|
|
|
/**
|
|
* Leert den Warenkorb, sobald die Rueckkehrseite eine abgeschlossene Zahlung
|
|
* bestaetigt hat. Eigene Komponente, weil die Seite selbst serverseitig
|
|
* rendert (sie fragt dort bei Stripe nach), der Warenkorb aber nur im
|
|
* Browser liegt.
|
|
*/
|
|
export function ClearCartOnMount() {
|
|
const clear = useCartStore((s) => s.clear);
|
|
|
|
useEffect(() => {
|
|
clear();
|
|
}, [clear]);
|
|
|
|
return null;
|
|
}
|