// COMMANDE_CONFIRMÉE
-MERCI
POUR
VOTRE
COMMANDE
- Vérification du paiement...
+
+ // COMMANDE_CONFIRMÉE
+MERCI
POUR
VOTRE
COMMANDE
+ Vérification du paiement...
// RÉCAPITULATIF
@@ -146,6 +157,12 @@ const params = new URLSearchParams(window.location.search) const sessionId = params.get('session_id') + const PRODUCT_IMAGES = { + lumiere_orbitale: '/assets/lamp-violet.jpg', + table_terrazzo: '/assets/table-terrazzo.jpg', + module_serie: '/assets/lampes-serie.jpg', + } + if (sessionId) { fetch(`/api/session/${sessionId}`) .then(r => r.json()) @@ -156,6 +173,10 @@ const amount = data.amount ? `${(data.amount / 100).toLocaleString('fr-FR')} €` : '—' document.getElementById('amount-display').textContent = amount document.getElementById('email-display').textContent = data.customer_email ?? '—' + + if (data.product && PRODUCT_IMAGES[data.product]) { + document.getElementById('product-img').src = PRODUCT_IMAGES[data.product] + } }) .catch(() => { document.getElementById('loading').textContent = 'Commande enregistrée.' diff --git a/server.mjs b/server.mjs index e7c46d0..19a2c66 100644 --- a/server.mjs +++ b/server.mjs @@ -10,21 +10,16 @@ dotenv.config() const __dirname = dirname(fileURLToPath(import.meta.url)) const isDev = process.env.NODE_ENV !== 'production' - const stripe = new Stripe(process.env.STRIPE_SECRET_KEY ?? '') const DOMAIN = process.env.DOMAIN ?? 'http://localhost:3000' const PRODUCTS = { lumiere_orbitale: { - name: 'LUMIÈRE_ORBITALE — REBOUR', - description: 'Lampe de table unique. Béton texturé coulé à la main + dôme céramique laqué. Collection 001.', - amount: 180000, - currency: 'eur', + price_id: 'price_1T5SBlE5wMMoCUP5ZcjEStwe', }, } const app = Fastify({ logger: true }) - await app.register(cors, { origin: '*', methods: ['GET', 'POST'] }) // ── Statique en dev uniquement (en prod c'est nginx qui sert public/) ───────── @@ -59,27 +54,31 @@ app.post('/api/checkout', async (request, reply) => { const { product, email } = request.body ?? {} const p = PRODUCTS[product] if (!p) return reply.code(404).send({ error: 'Produit inconnu' }) + app.log.info(`Stripe key prefix: ${process.env.STRIPE_SECRET_KEY?.slice(0, 20)}`) + app.log.info(`Price ID: ${p.price_id}`) - const session = await stripe.checkout.sessions.create({ - mode: 'payment', - payment_method_types: ['card'], - line_items: [{ - price_data: { - currency: p.currency, - unit_amount: p.amount, - product_data: { name: p.name, description: p.description }, + let session + try { + session = await stripe.checkout.sessions.create({ + mode: 'payment', + payment_method_types: ['card', 'link'], + line_items: [{ + price: p.price_id, + quantity: 1, + }], + metadata: { product }, + success_url: `${DOMAIN}/success?session_id={CHECKOUT_SESSION_ID}`, + cancel_url: `${DOMAIN}/#collection`, + locale: 'fr', + customer_email: email ?? undefined, + custom_text: { + submit: { message: 'Pièce unique — fabriquée à Paris. Délai : 6 à 8 semaines.' }, }, - quantity: 1, - }], - success_url: `${DOMAIN}/success?session_id={CHECKOUT_SESSION_ID}`, - cancel_url: `${DOMAIN}/#collection`, - locale: 'fr', - customer_email: email ?? undefined, - custom_text: { - submit: { message: 'Pièce unique — fabriquée à Paris. Délai : 6 à 8 semaines.' }, - }, - }) - + }) + } catch (err) { + app.log.error(err) + return reply.code(500).send({ error: err.message }) + } return { url: session.url } }) @@ -91,6 +90,7 @@ app.get('/api/session/:id', async (request) => { amount: session.amount_total, currency: session.currency, customer_email: session.customer_details?.email ?? null, + product: session.metadata?.product ?? null, } }) @@ -120,13 +120,12 @@ app.post('/api/webhook', { app.log.info(`✓ Paiement — ${session.id} — ${session.customer_details?.email}`) } } - return { received: true } }) // ── Start ───────────────────────────────────────────────────────────────────── try { - await app.listen({ port: 8000, host: '127.0.0.1' }) + await app.listen({ port: process.env.PORT ?? 8888, host: '127.0.0.1' }) } catch (err) { app.log.error(err) process.exit(1)