Files
Wabenhain/package.json
T
Nick SzaunigandClaude Opus 5.5 4ee5bafe20 feat: Stripe Embedded Checkout statt Weiterleitung zu checkout.stripe.com
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]>
2026-09-25 08:01:18 +02:00

73 lines
2.3 KiB
JSON

{
"name": "wabenhain",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "node scripts/generate-prisma-clients.mjs && next dev",
"build": "node scripts/generate-prisma-clients.mjs && next build",
"start": "node scripts/generate-prisma-clients.mjs && next start",
"lint": "eslint",
"postinstall": "node scripts/generate-prisma-clients.mjs",
"db:push": "node scripts/prisma-provider.mjs && prisma db push",
"db:migrate": "node scripts/prisma-provider.mjs && prisma migrate dev",
"db:deploy": "node scripts/prisma-provider.mjs && prisma migrate deploy",
"db:seed": "prisma db seed",
"db:seed:demo": "tsx prisma/seed-demo.ts",
"db:studio": "node scripts/prisma-provider.mjs && prisma studio",
"test": "vitest run",
"test:watch": "vitest",
"test:e2e": "playwright test",
"preflight": "tsx scripts/preflight.ts",
"places:find": "tsx scripts/find-place-id.ts",
"orders:release-stale": "tsx scripts/release-stale-orders.ts"
},
"dependencies": {
"@prisma/adapter-mariadb": "^7.10.0",
"@prisma/adapter-pg": "^7.10.0",
"@prisma/client": "^7.10.0",
"@stripe/react-stripe-js": "^6.12.0",
"@stripe/stripe-js": "^9.17.0",
"bcryptjs": "^3.0.3",
"ffmpeg-static": "^5.3.0",
"jose": "^6.2.8",
"mariadb": "^3.5.3",
"motion": "^13.0.0",
"next": "16.3.5",
"nodemailer": "^9.1.1",
"otpauth": "^9.5.1",
"pdfkit": "^0.19.1",
"prisma": "^7.10.0",
"qrcode": "^1.5.4",
"react": "19.2.8",
"react-dom": "19.2.8",
"sharp": "^0.35.4",
"stripe": "^22.4.0",
"zod": "^4.4.3",
"zustand": "^5.0.14"
},
"devDependencies": {
"@playwright/test": "^1.62.1",
"@tailwindcss/postcss": "^4",
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.4",
"@types/bcryptjs": "^3.0.0",
"@types/node": "^20.19.43",
"@types/nodemailer": "^8.0.1",
"@types/pdfkit": "^0.17.6",
"@types/qrcode": "^1.5.6",
"@types/react": "^19",
"@types/react-dom": "^19",
"@vitejs/plugin-react": "^6.0.5",
"dotenv": "^17.4.2",
"eslint": "^9",
"eslint-config-next": "16.3.5",
"jsdom": "^30.0.1",
"tailwindcss": "^4",
"tsx": "^4",
"typescript": "^5",
"vitest": "^4.1.10"
},
"packageManager": "[email protected]"
}