Brancher une boutique
Le paiement est hébergé par LuminaPay, sur un sous-domaine de votre boutique. Votre serveur crée une commande, votre client est redirigé, il paie, il revient. Il n'y a rien à installer côté Stripe.
Le principe
- Le client clique sur « Commander » dans votre boutique.
- Votre serveur appelle
POST /api/commandeavec le panier, et reçoit une référenceord_…. - Vous redirigez le client vers
https://checkout.votre-boutique.fr/ord_…. La page de paiement s'affiche à votre marque, encaisse, puis renvoie le client chez vous.
Clés et environnement
À l'ouverture du compte, vous recevez une clé d'API et l'adresse de votre checkout. Rangez les deux dans les variables d'environnement de votre boutique.
LUMINA_API_KEY=<votre clé, à garder secrète> LUMINA_CHECKOUT_URL=https://checkout.votre-boutique.fr
Le sous-domaine checkout est un simple enregistrement CNAME que vous posez chez votre registrar. On vous donne la valeur exacte pendant l'ouverture, et le certificat est émis automatiquement.
Créer une commande
POST/api/commande
POST https://checkout.votre-boutique.fr/api/commande
Authorization: Bearer $LUMINA_API_KEY
Content-Type: application/json
{
"reference": "CMD-10428",
"devise": "eur",
"articles": [
{
"nom": "Nom du produit",
"prix": 2490,
"quantite": 2,
"variante": "Taille M",
"image": "https://votre-boutique.fr/photo.jpg"
}
],
"livraisons": [
{ "id": "offerte", "nom": "Livraison offerte", "delai": "3 à 5 jours", "prix": 0 }
]
}Le même appel depuis un serveur Node :
// Route serveur de votre boutique, appelée au clic sur « Commander »
const r = await fetch(process.env.LUMINA_CHECKOUT_URL + "/api/commande", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.LUMINA_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({ reference, devise: "eur", articles, livraisons })
});
if (!r.ok) throw new Error((await r.json()).error);
const { url } = await r.json();
// Il ne reste qu'à rediriger le client
res.redirect(303, url);Champs du panier
| Champ | Type | À savoir |
|---|---|---|
reference | texte | Votre numéro de commande. Il est repris dans la description du paiement, ce qui permet le rapprochement des deux côtés. Fortement conseillé. |
devise | texte | Code ISO en minuscules, eur par exemple. |
articles | liste | Ne peut pas être vide. Une trentaine de lignes au maximum. |
articles[].prix | entier | Prix unitaire en centimes. 24,90 € s'écrit 2490. |
articles[].quantite | entier | Ramenée entre 1 et 999. |
articles[].variante | texte | Facultatif. Affiché sous le nom du produit. |
articles[].image | URL | Facultatif. Vignette affichée dans le récapitulatif. |
livraisons | liste | Les options proposées au client. La première est présélectionnée. Si le champ est absent, une livraison standard à 0 est appliquée. |
livraisons[].prix | entier | En centimes, comme les articles. |
Le total doit atteindre le minimum accepté par Stripe pour la devise, soit 1 € en euros.
Réponse
Une commande créée répond 201 :
{
"reference": "ord_3RxAbC…",
"url": "https://checkout.votre-boutique.fr/ord_3RxAbC…",
"total": 4980,
"devise": "eur"
}Redirigez le client vers url. Il n'y a rien d'autre à construire : la page gère la saisie de la carte, l'authentification forte, les portefeuilles et l'écran de confirmation.
Codes d'erreur
| Code | Signification | Quoi faire |
|---|---|---|
400 | Commande invalide | Le message précise le champ en cause : panier vide, montant sous le minimum, panier trop volumineux. |
401 | Clé d'API invalide | Vérifier l'en-tête Authorization et la variable d'environnement. |
404 | Domaine non déclaré | Le sous-domaine de checkout n'est pas encore rattaché à votre compte. Nous écrire. |
405 | Méthode non autorisée | Seuls POST et GET sont acceptés sur cette route. |
503 | Plateforme indisponible | Réessayer après quelques secondes. Si ça dure, nous écrire. |
Toutes les erreurs ont la même forme : { "error": "message lisible" }.
Retour sur la boutique
Une fois le paiement accepté, l'écran de confirmation propose au client de revenir chez vous. Il arrive sur la racine de votre domaine, avec la référence en paramètre :
https://votre-boutique.fr/?commande=ord_3RxAbC…
C'est le seul signal que votre boutique reçoit dans le navigateur. Servez-vous-en pour vider le panier, et seulement là : un client qui abandonne le paiement doit retrouver son panier intact.
Relire une commande
GET/api/commande?ref=ord_…
Renvoie le panier, les options de livraison, les totaux et l'état du paiement. Aucune clé n'est nécessaire, la référence étant déjà imprévisible.
{
"etat": "succeeded",
"dejaPayee": true,
"reference": "CMD-10428",
"articles": [ { "nom": "Nom du produit", "prix": 2490, "quantite": 2 } ],
"livraisons": [ { "id": "offerte", "nom": "Livraison offerte", "prix": 0 } ],
"livraisonId": "offerte",
"sousTotal": 4980,
"fraisLivraison": 0,
"total": 4980,
"devise": "eur"
}etat | Ce que ça veut dire |
|---|---|
requires_payment_method | La commande existe, le client n'a pas encore payé. |
processing | Paiement en cours de traitement par la banque. dejaPayee vaut déjà true. |
succeeded | Paiement accepté. Vous pouvez préparer la commande. |
canceled | Commande annulée, aucun débit. |
Devises et montants
- Tous les montants sont des entiers, dans la plus petite unité de la devise.
- En euros, en dollars, en livres : des centimes.
2490vaut 24,90. - En yens, pas de sous-unité :
2490vaut 2 490 ¥. - La devise envoyée avec la commande est celle dans laquelle le client est débité.
À ne pas faire
- Ne pas appeler
POST /api/commandedepuis le navigateur. - Ne pas mettre
LUMINA_API_KEYdans du code client, un bundle front ou un dépôt public. - Ne pas recalculer ni afficher de commission. Le prix payé par le client est exactement le total envoyé, la commission est prélevée côté plateforme et reste invisible pour l'acheteur.
- Ne pas envoyer un panier de plus d'une trentaine de lignes. Au-delà, l'API répond « Panier trop volumineux ».
Recette avant mise en production
- Passer une commande d'un article à 1 €, avec une vraie carte.
- Vérifier que le paiement apparaît sur votre compte Stripe.
- Vérifier que votre référence est visible dans la description du paiement.
- Rembourser depuis votre tableau de bord Stripe, et vérifier que la commission est rendue.
Une question sur l'intégration ? contact@lumina-pay.com, réponse sous 24 h ouvrées.