Fonctionnalité e-commerce complète pour votre site Larapen. Vendez des produits physiques et numériques avec un panier d’achat complet, un tunnel de commande, un système de coupons, une gestion des commandes et une génération de flux marchands.
Gestion des produits
Créez des produits avec variantes, galerie d’images, prix promotionnels, suivi des stocks et métadonnées SEO. Supporte les types internes, externes et numériques.
Panier & Commande
Panier basé sur la session pour les invités, en base de données pour les utilisateurs connectés. Fusion automatique du panier à la connexion. Commande en tant qu’invité possible.
Gestion des commandes
Cycle de vie complet des commandes avec suivi des statuts, statut de paiement, gestion des stocks, notifications par e-mail et livraison de téléchargements numériques.
Coupons & Réductions
Coupons en pourcentage ou montant fixe avec seuils de commande minimum, limites d’utilisation, plages de dates et plafonds de réduction maximum.
Flux marchands
Générez des flux de produits pour Google, Bing, Facebook, Amazon, TikTok, Yandex et Baidu avec des mappages de champs personnalisables.
Données structurées
Sortie automatique JSON-LD schema.org/Product sur les pages produits pour des résultats de recherche enrichis. Supporte les variantes, les prix et la disponibilité.
Cas d’utilisation
Boutique en ligne
Vendez des produits physiques avec suivi des stocks, calcul des frais de livraison et réductions par coupons. Les clients parcourent les catégories, ajoutent au panier, passent commande et suivent leurs commandes.
Vente de produits numériques
Vendez des fichiers téléchargeables (e-books, modèles, logiciels). Les produits numériques n’ont pas de frais de livraison, et les acheteurs reçoivent des liens de téléchargement à durée limitée après le paiement. Activez d’abord la fonctionnalité Produits numériques (Boutique → Paramètres → Produits numériques — désactivée par défaut) ; en la laissant désactivée, toute la boutique et le panneau d’administration restent en mode produits physiques.
Produits affiliés / externes
Listez des produits qui redirigent vers des détaillants externes. Les produits externes affichent un bouton “Acheter maintenant” qui renvoie vers la boutique externe au lieu du flux de panier interne. Un produit peut lister jusqu’à cinq boutiques (liens d’affiliation, chacun avec son propre nom de fournisseur) : avec un seul lien actif, le bouton y mène directement ; avec plusieurs, le client choisit d’abord une boutique.
Commerce multicanal
Utilisez le système de flux marchands pour diffuser votre catalogue produits sur Google Shopping, Facebook Commerce, Amazon, TikTok Shop et d’autres plateformes.
Prérequis
- Larapen CMS v1.0.0 ou ultérieur
- PHP 8.3+
- MySQL 8.0+
- Au moins un add-on de passerelle de paiement (ex. Stripe) pour traiter les paiements
Installation
Étape 1 : Téléverser l’add-on
Dans le panneau d’administration, allez dans Admin → Extensions → Add-ons et cliquez sur le bouton Téléverser un add-on. Sélectionnez le fichier ZIP de l’add-on : le système le décompresse automatiquement et l’add-on apparaît dans la liste des add-ons installés.
Étape 2 : Activer l’add-on
Repérez Boutique dans la liste et cliquez sur Activer. Ses migrations, ses seeders (le cas échéant) et ses permissions sont mis en place automatiquement.
Étape 3 : Configurer
Naviguez vers Admin → Boutique → Paramètres pour configurer la devise, la taxe, la livraison et les options de commande. Voir Configuration.
Code d’achat (clé de licence)
Boutique est vendu comme un produit séparé, il possède donc son propre code d’achat (clé de licence) — distinct du code d’achat de l’application principale et de celui de chaque autre add-on. Il vous est demandé lorsque vous activez Boutique dans Panneau d’administration → Add-ons.
Nos produits sont vendus sur trois plateformes. La façon dont vous recevez un code d’achat dépend de l’endroit où vous avez acheté le produit.
| Plateforme / Marketplace | Comment obtenir le code d’achat | Où le retrouver |
|---|---|---|
| Boutique bedigit.com Achat sur le site (Shop) |
Généré automatiquement lorsque la commande est payée, puis envoyé par e-mail — soit dans un e-mail de licence dédié, soit dans l’e-mail de confirmation de commande. | Mon compte → Mes licences sur bedigit.com |
| Gumroad | Créé dès que Gumroad nous notifie la vente, puis envoyé dans un e-mail séparé, en plus du reçu Gumroad. | L’e-mail de licence, votre Bibliothèque Gumroad et Mon compte → Mes licences sur bedigit.com |
| Envato Market CodeCanyon |
Délivré par Envato, pas par nous, et jamais envoyé par e-mail : vous le téléchargez vous-même depuis votre compte Envato. | Compte Envato → Downloads → License certificate & purchase code |
1. Boutique bedigit.com (achat sur le site)
- Dès que le statut de paiement de la commande devient Payée, une clé de licence est générée automatiquement pour chaque article sous licence de la commande (une clé par unité achetée — acheter 3 unités donne 3 clés distinctes).
- Elle est envoyée par e-mail à l’adresse utilisée pour la commande, soit dans un e-mail de licence dédié, soit dans l’e-mail de confirmation de commande. Vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
- La clé reste disponible dans votre compte sous Mon compte → Mes licences. Les clés sont masquées dans la liste ; ouvrez la page de détail de la licence pour afficher et copier la clé complète, voir les domaines sur lesquels elle est activée, et désactiver un domaine pour libérer un emplacement d’activation.
- La facture correspondante se trouve sous Mon compte → Mes commandes.
2. Gumroad
- Un achat sur Gumroad produit deux e-mails distincts : le reçu Gumroad (envoyé par Gumroad, donnant accès aux fichiers) et un e-mail de clé de licence (envoyé par bedigit.com) qui contient votre code d’achat.
- L’e-mail de clé de licence est généré dès que Gumroad nous notifie la vente, il arrive donc normalement quelques secondes après le paiement. Ici aussi, vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
- Lorsque le produit Gumroad utilise la fonctionnalité de clés de licence propre à Gumroad, la même clé apparaît aussi dans votre reçu Gumroad et sous Bibliothèque → votre achat sur gumroad.com.
- Utilisez la même adresse e-mail sur bedigit.com que sur Gumroad : vos clés sont alors liées automatiquement à votre compte et listées sous Mon compte → Mes licences, même si vous vous inscrivez après l’achat. Vous pouvez aussi ajouter une clé Gumroad manuellement depuis Mon compte → Mes licences Gumroad.
3. Envato Market (CodeCanyon)
- Les codes d’achat Envato sont délivrés et fournis par Envato Market, jamais envoyés par e-mail par nous — il n’y a donc rien à chercher dans votre dossier de spam : vous récupérez le code depuis votre compte Envato.
- Connectez-vous à votre compte Envato / CodeCanyon, ouvrez la page Downloads, trouvez l’article et choisissez License certificate & purchase code dans le menu déroulant Download. Le code est inscrit dans ce certificat.
- Un code d’achat Envato ressemble à
12345678-90ab-cdef-1234-567890abcdef(8-4-4-4-12 caractères). Il ne change jamais, et le renouvellement du support de l’article n’en délivre pas de nouveau. - Article officiel Envato : Where Is My Purchase Code?
Configuration
Tous les paramètres sont gérés dans Admin → Boutique → Paramètres (stockés dans la table settings, groupe shop).
Les valeurs par défaut sont définies dans config/shop.php.
Général
| Paramètre | Description | Par défaut |
|---|---|---|
shop_order_prefix |
Préfixe pour les numéros de commande générés (ex. ORD-20260307-00000001). | ORD |
shop_products_per_page |
Nombre de produits par page dans le catalogue. | 12 |
shop_sidebar_position |
Position de la barre latérale sur les pages de liste : left, right ou none. |
right |
shop_grid_columns |
Nombre de colonnes de produits par rangée en vue grille (1–4). | 3 |
shop_default_view_mode |
Mode d’affichage initial du catalogue : grid ou list. |
grid |
shop_guest_checkout |
Permettre aux clients de commander sans créer de compte. | true |
shop_payment_terms_override_enabled |
Remplacer les conditions de vente globales (Paramètres › Général › Conditions de vente) pour les pages de commande et de renouvellement de l’accès aux mises à jour. Désactivé, les paramètres globaux s’appliquent. | false |
shop_payment_terms_enabled |
En cas de remplacement : exiger des acheteurs qu’ils acceptent les conditions de vente avant de payer. | valeur globale |
shop_payment_terms_page_id |
En cas de remplacement : la page publiée dont le contenu est affiché dans l’accordéon des conditions. | valeur globale |
Taxes
| Paramètre | Description | Par défaut |
|---|---|---|
shop_tax_enabled |
Activer le calcul des taxes sur les commandes. | false |
shop_tax_rate |
Taux de taxe en pourcentage (ex. 20 pour 20%). | 0 |
shop_tax_inclusive |
Indique si les prix des produits incluent déjà la taxe. Lorsque activé, le montant de la taxe est extrait des prix plutôt qu’ajouté. | false |
Livraison
| Paramètre | Description | Par défaut |
|---|---|---|
shop_shipping_enabled |
Activer les frais de livraison sur les commandes avec des produits physiques. | true |
shop_free_shipping_threshold |
Seuil de sous-total pour la livraison gratuite. Mettre à 0 pour désactiver. | 0 |
shop_shipping_flat_rate |
Tarif forfaitaire de livraison appliqué lorsque la commande ne remplit pas les conditions de livraison gratuite. | 10 |
Produits numériques
| Paramètre | Description | Par défaut |
|---|---|---|
shop_digital_products_enabled |
Interrupteur principal de toute la fonctionnalité produits numériques (téléchargements auto-hébergés, versions publiées, accès aux mises à jour, liaison des licences, détails techniques). Se bascule depuis l’interrupteur situé dans l’en-tête de l’onglet Produits numériques. Lorsqu’il est désactivé, tous les champs propres au numérique, les cartes produit, le bouton “Créer / Mettre à jour le produit de licence” et l’entrée de menu Journaux de versions sont masqués dans tout le panneau d’administration, et la boutique présente chaque produit avec la mise en page physique. Désactivé par défaut, afin que les boutiques vendant uniquement des produits physiques / services ne voient jamais d’options propres au numérique. | false |
shop_catalog_mode |
Type de catalogue (physical ou digital) : adapte la présentation des listes et des pages de détail à une mise en page de type marketplace. Se trouve dans l’onglet Produits numériques et ne prend effet que lorsque shop_digital_products_enabled est activé — la fonctionnalité désactivée, le catalogue est toujours présenté comme physique. |
physical |
shop_digital_max_downloads |
Nombre maximum de téléchargements d’un produit numérique par achat. Mettre à 0 pour illimité. | 5 |
shop_digital_expiry_days |
Nombre de jours après l’achat avant l’expiration du lien de téléchargement. | 30 |
shop_digital_update_access_months |
Fenêtre d’accès aux mises à jour par défaut (en mois) pour les produits avec mises à jour : durée pendant laquelle les acheteurs continuent de télécharger les nouvelles versions après l’achat. Personnalisable par produit. | 6 |
shop_update_access_renewal_enabled |
Permettre aux acheteurs de payer pour prolonger leur fenêtre d’accès aux mises à jour à l’approche ou après son expiration. | true |
shop_update_access_renewal_percent |
Prix de renouvellement par défaut pour prolonger l’accès aux mises à jour, en pourcentage du prix du produit. Personnalisable par produit. | 50 |
shop_update_access_grace_days |
Nombre de jours après la fin de l’accès aux mises à jour pendant lesquels les acheteurs peuvent encore télécharger avant le blocage (0 = aucun délai de grâce). | 0 |
shop_update_access_syncs_license |
Définir la date Expire le de la clé de licence liée selon l’accès aux mises à jour (nécessite l’add-on Licences). Voir Produits avec mises à jour. | true |
Stock & Notifications
| Paramètre | Description | Par défaut |
|---|---|---|
shop_low_stock_threshold |
Quantité en stock à laquelle les produits sont signalés comme stock faible. | 5 |
shop_notify_admin_on_order |
Envoyer une notification par e-mail aux administrateurs lorsqu’une nouvelle commande est passée. | true |
shop_notify_customer_on_order |
Envoyer un e-mail de confirmation de commande au client. | true |
Variables d’environnement
Variables optionnelles pour les produits versionnés adossés à git (toutes ont des valeurs par défaut raisonnables) :
| Variable | Description | Par défaut |
|---|---|---|
SHOP_GIT_PROCESS_TIMEOUT |
Nombre maximum de secondes pendant lesquelles une commande git peut s’exécuter avant d’être interrompue. Augmentez-le pour de très gros dépôts ou des hébergements lents. | 1800 |
SHOP_GIT_VERSION_LINK_TTL_HOURS |
Durée de validité d’un lien de téléchargement privé propre à une version (émis pour un acheteur dont la licence a expiré). | 48 |
SHOP_PHP_BINARY |
Chemin vers le binaire PHP CLI utilisé pour lancer les générations de versions en arrière-plan sur la file sync. Nécessaire uniquement lorsqu’il ne peut pas être détecté automatiquement (par ex. sous mod_php). |
(auto) |
SHOP_GIT_HTTP_PROXY |
Proxy pour le transport HTTP(S) de git. Vide signifie une connexion directe. | (vide) |
Admin : Paramètres
La page des paramètres (Boutique → Paramètres) est organisée en sections :
- Général : Préfixe de commande, produits par page, position de la barre latérale, colonnes de grille, mode d’affichage par défaut, titre/sous-titre/libellé du fil d’Ariane de la page boutique.
- Taxes : Activer/désactiver les taxes, pourcentage du taux de taxe, prix TTC.
- Livraison : Activer/désactiver la livraison, tarif forfaitaire, seuil de livraison gratuite.
- Commande : Commande en tant qu’invité, numéro de téléphone obligatoire, adresse de livraison obligatoire.
- Produits numériques : Un interrupteur principal Activer les produits numériques dans l’en-tête de la carte (désactivé par défaut) active/désactive toute la fonctionnalité — désactivé, ses champs sont masqués ici et toutes les cartes, boutons et entrées de menu propres au numérique sont masqués dans tout le panneau d’administration (et la boutique abandonne la mise en page marketplace). Activé : Type de catalogue, téléchargements maximum par achat, expiration du lien de téléchargement, fenêtre d’accès aux mises à jour et options de renouvellement payant.
- Stock : Seuil de stock faible.
- Notifications : Notification admin pour nouvelle commande, confirmation de commande client.
Admin : Produits
La page Produits (Boutique → Produits) gère votre catalogue de produits.
Liste des produits
Un tableau paginé affichant :
- Image mise en avant (miniature)
- Nom et SKU
- Catégorie
- Prix (avec prix promotionnel le cas échéant)
- Stock quantité
- Statut (brouillon / publié / archivé)
- Type de commande (interne / externe)
Actions par élément : Modifier, Supprimer. Suppression en masse avec sélection par cases à cocher.
Création & Modification de produits
Le formulaire produit comprend les sections suivantes :
Lors de la modification d’un produit publié, un bouton Voir (en haut à droite, à côté de Retour) ouvre sa page publique dans un nouvel onglet. Il est masqué pour les brouillons et les produits programmés dans le futur, qui n’ont pas encore de page publique.
Informations de base
- Nom (traduisible) : titre du produit affiché dans le catalogue.
- Slug (traduisible) : identifiant URL. Généré automatiquement à partir du nom si vide.
- Description courte (traduisible) : résumé affiché sur les pages de liste.
- Description (traduisible) : description complète du produit avec éditeur WYSIWYG.
- Catégorie : sélection parmi les catégories de produits.
- SKU : identifiant d’unité de gestion des stocks (unique parmi les produits de la boutique). Pour un produit numérique vendu avec une clé de licence, c’est aussi l’identifiant de produit que les applications clientes envoient à l’API de licences — voir Produits de licence.
- Statut : Brouillon, Publié ou Archivé.
- Publié le : planifier la date de publication.
Tarification
- Prix : prix normal du produit.
- Prix promotionnel : prix réduit optionnel (doit être inférieur au prix normal pour prendre effet).
- Devise : définie depuis le paramètre de devise par défaut du site.
Inventaire
- Gérer le stock : activer/désactiver le suivi des stocks. Lorsque désactivé, le produit est toujours “en stock”.
- Quantité en stock : nombre d’unités disponibles.
Type de commande
- Interne : flux standard d’ajout au panier et de commande.
- Externe : le produit renvoie vers une ou plusieurs boutiques externes (liens d’affiliation). Ne peut pas être ajouté au panier. Le suivi des stocks est désactivé.
Images
- Image mise en avant : image principale du produit (utilise la médiathèque).
- Images de galerie : images supplémentaires du produit affichées sur la page de détail.
SEO
- Méta titre (traduisible)
- Méta description (traduisible)
Données de flux
- Marque, GTIN, MPN, État, Poids : utilisés dans la génération de flux marchands et les données structurées schema.org.
- Labels personnalisés (0–4) : pour la segmentation des flux marchands.
Variantes de produits
Les produits peuvent avoir plusieurs variantes, chacune avec ses propres :
- Nom (ex. “Grand, Rouge”)
- SKU
- Prix (remplace le prix du produit si défini)
- Quantité en stock
- Attributs (JSON : paires clé-valeur pour taille, couleur, etc.)
- Actif bascule
Les variantes sont synchronisées à l’enregistrement du produit. Les variantes supprimées sont automatiquement effacées.
Produits numériques
Lorsque Est numérique est activé :
- Un champ d’upload Fichier numérique apparaît. Les fichiers sont stockés sur le disque configuré (par défaut :
local) sous le chemindigital-products. - La livraison est automatiquement exclue pour les commandes entièrement numériques.
- Après le paiement, les éléments de commande reçoivent un lien de téléchargement à durée limitée.
- Les tentatives de téléchargement sont suivies via
download_countet appliquées contreshop_digital_max_downloads. - Les liens de téléchargement expirent après
shop_digital_expiry_days.
Détails techniques
Les produits numériques peuvent annoncer leurs technologies & compatibilités à la manière de CodeCanyon dans une carte Détails techniques. Elle apparaît sur le formulaire produit uniquement lorsque Est numérique est activé, et sur la boutique elle est affichée comme une carte dédiée dans la barre latérale droite de la page produit — seuls les champs que vous renseignez sont affichés.
- Type de fichier numérique : la nature de ce produit — Code / Script, Graphisme / Template, Image / Photo, Vidéo, Audio / Musique, Document ou Autre. Le type détermine les champs affichés : par ex. Code expose Langages, Frameworks et Navigateurs compatibles, tandis que Graphisme et Image affichent plutôt Résolution. Il est aussi affiché comme ligne Type dans la carte Détails du produit de la boutique.
- Listes de tags groupées : chaque champ est un sélecteur de tags — Langages, Frameworks et bibliothèques, Navigateurs compatibles, Version logicielle, Résolution et Fichiers inclus. Choisissez une valeur existante parmi les suggestions ou saisissez-en une nouvelle et appuyez sur Entrée.
- Suggestions automatiques : le sélecteur est pré-rempli avec les valeurs courantes et y fusionne toutes les valeurs déjà utilisées par vos autres produits, afin que votre catalogue reste cohérent tout en vous laissant ajouter n’importe quelle nouveauté à la volée.
Produits avec mises à jour
Activez Produit avec mises à jour (affiché au-dessus du champ Fichier numérique) pour les produits livrés avec des mises à jour gratuites — logiciels, thèmes, templates et similaires. Lorsque cette option est activée :
- La limite de téléchargements par commande est levée afin que les acheteurs puissent toujours retélécharger le dernier fichier.
- Deux champs supplémentaires apparaissent : Accès aux mises à jour (fenêtre, en mois, pendant laquelle les acheteurs continuent de recevoir les nouvelles versions ; vide utilise
shop_digital_update_access_months) et Prix du renouvellement de l’accès aux mises à jour (pourcentage du prix du produit pour prolonger la fenêtre ; vide utiliseshop_update_access_renewal_percent). - Sur leur page de commande, les acheteurs voient l’état de leur accès et — à l’approche ou après son expiration — peuvent payer pour prolonger l’accès aux mises à jour.
Liaison des licences (avec l’add-on Licences). Lorsque shop_update_access_syncs_license est activé, la clé de licence émise pour un achat avec mises à jour reçoit une date Expire le correspondant à la fenêtre d’accès aux mises à jour, et prolonger l’accès la repousse. Une clé dépassant sa date Expire le reste valide pour les versions publiées à cette date ou avant — seules les versions plus récentes exigent un renouvellement. L’API de vérification accepte un paramètre version optionnel pour ce contrôle.
Produits de licence (add-on Licences)
Lorsque l’add-on Licences est actif, un produit numérique peut être rattaché à un produit de licence afin que chaque commande payée émette une clé de licence pour celui-ci.
Le bouton apparaît sous la forme d’une icône de clé dans la liste des produits et comme carte Produit de licence en bas de la page de modification du produit (produits numériques uniquement, et seulement lorsque
Activer les produits numériques est actif). Il indique Créer un produit de licence ou Mettre à jour le produit de licence et nécessite la permission
licenses.products.create ou licenses.products.edit.
- Comment le lien est stocké. Le produit de la boutique est enregistré comme la fiche marketplace
shopdu produit de licence (une ligne dans la tablelicenses_product_marketplacede l’add-on Licences :listing_id= le produit de la boutique,external_id= son SKU). L’add-on Boutique ne stocke lui-même rien sur ce lien : l’ancienne colonneshop_products.license_product_ida été supprimée par Licences 1.0.13, qui a copié chaque lien existant dans cette table. - Créer crée un nouveau produit de licence à partir du produit de la boutique (nom, description courte, slug unique basé sur le slug du produit) avec le même SKU, puis enregistre la fiche. Mettre à jour rafraîchit le nom et la description du produit de licence lié et répare la fiche.
- Un seul SKU des deux côtés. Le SKU du produit de la boutique et celui de son produit de licence restent identiques : lorsque vous enregistrez l’un des deux produits et qu’un côté n’a pas de SKU, il est rempli depuis l’autre côté. Deux SKU différents ne sont jamais écrasés silencieusement.
- Le bouton refuse de s’exécuter (toast d’erreur) lorsque :
- le produit de la boutique et son produit de licence portent des SKU différents — alignez l’un des deux, puis cliquez à nouveau ;
- le SKU du produit de la boutique est déjà utilisé par un autre produit de licence ;
- le produit n’est pas numérique.
- Clés de licence pour les commandes. Lorsqu’une commande est payée (ou acceptée hors ligne), une clé est émise pour chaque ligne de commande dont le produit de la boutique est listé comme produit de licence,
à condition que la marketplace Boutique soit activée dans les paramètres de Licences (
licenses_shop_marketplace_enabled). Les produits sans fiche n’émettent aucune clé.
product, et c’est le SKU inscrit dans leur addon.json / theme.json. Si vous le changez sur un produit que des clients utilisent déjà, leurs
installations risquent de ne plus correspondre au produit — changez le SKU du produit de licence et les manifestes livrés en même temps, et exécutez
php artisan licenses:doctor, qui signale les discordances de SKU boutique / licence (sku_mismatch) et les produits vendus sans SKU (sku_missing).
Mises à jour versionnées (Git)
Les produits avec mises à jour peuvent être publiés directement depuis un dépôt git au lieu d’un téléversement manuel de fichier. Activez Mises à jour versionnées (affiché lorsque Produit avec mises à jour est actif) pour révéler le panneau git.
- Fournisseur : GitHub, GitLab, Bitbucket ou un serveur git privé / personnalisé.
- URL du dépôt et Branche optionnelle.
- Authentification : un jeton (jeton d’accès personnel / mot de passe d’application, avec un identifiant optionnel) ou une clé SSH (collez la clé privée ; ajoutez la clé de déploiement correspondante à votre dépôt). Les secrets sont stockés chiffrés et ne sont plus jamais affichés.
- Tester la connexion vérifie que le dépôt est joignable avec les identifiants actuels (fonctionne avant l’enregistrement).
- Créer une archive génère une version téléchargeable à partir d’un tag annoté choisi (ou du dernier tag annoté). Le sélecteur de tags est recherchable et charge les tags du dépôt à la demande. Si le dépôt n’a aucun tag annoté, le dernier commit est utilisé à la place.
Chaque tag annoté devient une version portant sa véritable date de tag. La version la plus récente est le fichier que les acheteurs téléchargent. La liste Versions affiche les dernières (avec un total), chacune avec un bouton de suppression (icône corbeille) qui supprime cette version et son fichier — supprimer la version actuelle vide le fichier du produit jusqu’à ce que vous publiiez une nouvelle version.
Les archives de version sont nommées <project>-v<version>.zip (par ex. larapen-v1.0.8.zip), le nom de projet étant repris de l’URL du dépôt.
storage/logs/shop-git.log.
- Avec une vraie file (
QUEUE_CONNECTION=database/redis) : lancez un worker —php artisan queue:work— et il traite les générations. - Avec la file
syncpar défaut : la génération est lancée automatiquement comme processus d’arrière-plan détaché (aucun worker nécessaire). Si votre binaire PHP CLI ne peut pas être détecté automatiquement, définissezSHOP_PHP_BINARYdans.env.
Dans la liste des produits, les produits avec mises à jour adossés à git affichent un bouton Nouvelle version (icône tag) qui publie une nouvelle version depuis le dernier tag annoté, en remplaçant le fichier précédent.
Journaux de versions
Chaque version porte un journal des modifications. Lorsqu’une version est générée depuis un tag, le journal est créé automatiquement à partir des messages de commit entre ce tag et la version précédente (avec repli sur le message du tag lui-même). Les versions sont créées sans envoyer d’e-mail à personne, afin que vous puissiez d’abord relire et modifier les notes.
- Gérez-les sous Boutique → Journaux de versions (l’entrée de menu n’apparaît que lorsque la fonctionnalité Produits numériques est activée) : une liste recherchable et filtrable de toutes les versions, tous produits confondus. Ajoutez / modifiez / supprimez des entrées, et enregistrez manuellement des versions passées (avec leur propre version, date et notes) antérieures à l’intégration git.
- Modifiez le journal de n’importe quelle version depuis cet écran (ou depuis la liste des versions du produit) avant de le publier.
- Envoyer la notification : un bouton dédié envoie par e-mail le journal de cette version aux acheteurs abonnés. Il n’apparaît que lorsque la version possède un fichier téléchargeable (ainsi les notifications renvoient toujours vers quelque chose à télécharger).
- Page publique : chaque produit numérique avec mises à jour possède un journal des versions public à l’adresse
/shop/product/{slug}/changelog, relié par un bouton Journal des versions dans la carte Détails du produit de la page produit.
Disponibilité & fichiers manquants
Un produit numérique ne peut être acheté que lorsque son fichier téléchargeable existe réellement (téléversé, ou une version a été générée). Lorsque le fichier est manquant — pas encore téléversé, aucune version générée, ou fichier supprimé — la boutique protège automatiquement les acheteurs :
- Les listes de la boutique affichent un bouton Indisponible désactivé, et la page produit affiche un avis de “temporairement indisponible” au lieu de Acheter / Ajouter au panier.
- Ajouter au panier, Acheter maintenant et Commander sont bloqués côté serveur avec un message clair, de sorte qu’un article indisponible ne peut jamais être commandé.
- Sur Mes commandes, si le fichier d’un article acheté est temporairement indisponible, l’acheteur voit un avis explicite, le bouton de téléchargement est masqué et Prolonger l’accès aux mises à jour est désactivé (afin qu’il ne paie pas l’accès à un fichier manquant).
Produits externes
Lorsque le Type de commande est défini sur Externe :
- Une carte Liens externes apparaît : ajoutez jusqu’à 5 boutiques, chacune avec un nom de fournisseur (affilié), une URL, une cible de lien (nouvel/même onglet) et un interrupteur d’activation. Les liens peuvent être supprimés ou temporairement désactivés ; au moins un lien actif est requis.
- Le produit ne peut pas être ajouté au panier.
- Le front-end affiche un bouton “Acheter maintenant”. Avec un seul lien actif, il mène directement à la boutique ; avec deux ou plus, il ouvre une boîte de dialogue “Choisissez où acheter” listant les boutiques (le nom du fournisseur, ou le domaine du lien lorsque aucun nom n’est défini).
- Les plans de service vendus via une commande externe disposent de la même carte Liens externes sur leur page de création/modification, et du même sélecteur de boutique dans la boutique.
- La gestion des stocks, le fichier numérique et les champs d’inventaire sont automatiquement désactivés.
Admin : Catégories
Les catégories de produits utilisent la table unifiée categories avec categorizable_type = 'product'.
Les catégories sont gérées via Boutique → Catégories.
- Nom (traduisible) et Slug (traduisible, généré automatiquement).
- Description (traduisible) et Méta titre / Méta description (traduisible).
- Catégorie parente : supporte l’imbrication hiérarchique.
- Position : valeur d’ordonnancement.
- Est actif bascule.
- Image mise en avant via la médiathèque.
- Catégorie produit Google : données de flux pour la génération de flux marchands (via
shop_category_feed_data).
Admin : Commandes
La page Commandes (Boutique → Commandes) fournit une liste de toutes les commandes clients.
Liste des commandes
Un tableau paginé et filtrable affichant :
- Numéro de commande (format :
ORD-YYYYMMDD-00000001) - Nom & e-mail du client
- Nombre d’articles
- Total (formaté avec devise)
- Statut badge (en attente, en traitement, terminée, annulée, remboursée)
- Statut de paiement badge (en attente, payé, échoué, remboursé)
- Date
Actions par élément : Voir, Supprimer.
Détail de la commande
La page de détail de la commande (Boutique → Commandes → {commande}) affiche :
- Carte résumé de la commande : numéro de commande, date, statut, statut de paiement, méthode de paiement.
- Informations client : nom, e-mail, téléphone, adresse de facturation, adresse de livraison.
- Tableau des articles : nom du produit, SKU, prix, quantité, total, badge numérique, informations de téléchargement.
- Résumé financier : sous-total, réduction, taxe, livraison, total.
- Code coupon (si appliqué).
- Liste des transactions : passerelle, ID de transaction, montant, statut, type (paiement / remboursement).
- Notes du client.
Mises à jour de statut
L’administrateur peut mettre à jour le statut de la commande et le statut de paiement via des sélecteurs déroulants :
- Mettre à jour le statut : envoie
PATCH admin/shop/orders/{id}/status - Mettre à jour le statut de paiement : envoie
PATCH admin/shop/orders/{id}/payment-status
Statuts de commande
| Statut | Description |
|---|---|
pending |
Commande passée mais pas encore traitée ni payée. |
processing |
La commande est en cours de préparation / exécution. |
completed |
La commande a été exécutée et livrée / téléchargée. |
cancelled |
La commande a été annulée. Le stock est automatiquement restauré. |
refunded |
Le paiement a été remboursé au client. |
Statuts de paiement
| Statut | Description |
|---|---|
pending |
En attente de paiement. |
paid |
Paiement reçu et confirmé. |
failed |
La tentative de paiement a échoué. |
refunded |
Le paiement a été remboursé. |
Admin : Coupons
La page Coupons (Boutique → Coupons) gère les codes de réduction.
Champs du coupon
| Champ | Description |
|---|---|
code |
Code coupon unique saisi par le client lors de la commande. |
type |
Réduction en percentage (pourcentage) ou fixed (montant fixe). |
value |
Montant de la réduction (points de pourcentage ou montant fixe en devise). |
min_order_amount |
Sous-total minimum requis pour appliquer le coupon. |
max_discount |
Plafond de réduction maximum (utile pour les coupons en pourcentage sur les grosses commandes). |
max_uses |
Nombre total de fois que ce coupon peut être utilisé par tous les clients. |
max_uses_per_user |
Utilisations maximum par utilisateur individuel. |
starts_at |
Le coupon devient valide après cette date. |
expires_at |
Le coupon expire après cette date. |
is_active |
Activer/désactiver le coupon. |
Règles de validation
Un coupon est considéré comme valide lorsque toutes les conditions suivantes sont remplies :
is_activeesttrue.- La date actuelle est après
starts_at(oustarts_atest null). - La date actuelle est avant
expires_at(ouexpires_atest null). used_countest inférieur àmax_uses(oumax_usesest null).
Un coupon est applicable à une commande lorsqu’il est valide ET que le sous-total de la commande atteint min_order_amount.
Le calcul de la réduction ne dépasse jamais le sous-total de la commande.
Admin : Avis & notes
Les clients notent les produits de 1 à 5 étoiles et laissent un titre et un commentaire depuis la page produit. Les avis sont modérés sur Boutique → Avis (approuver, rejeter, répondre, supprimer, suppression en masse). Les acheteurs du produit obtiennent un badge Achat vérifié ; la note moyenne et le nombre d’avis sont dénormalisés sur le produit (rating_avg, rating_count) et affichés sur les fiches produit, la page produit et dans le JSON-LD Product (aggregateRating + review) pour les résultats enrichis avec étoiles. Les listes peuvent être triées par Les mieux notés.
Paramètres (Boutique → Paramètres → Avis & notes)
| Paramètre | Description |
|---|---|
shop_reviews_enabled | Interrupteur principal du bloc et du formulaire d’avis. |
shop_reviews_guest_allowed | Les visiteurs sans compte peuvent laisser un avis (nom + e-mail ; un avis par e-mail). |
shop_reviews_require_purchase | Seuls les clients ayant une commande payée contenant le produit peuvent le noter. |
shop_reviews_auto_approve | Publier les avis immédiatement au lieu de les conserver en attente. |
shop_reviews_show_on_cards | Afficher la note en étoiles sur les fiches des listes. |
shop_reviews_per_page | Avis par page sur la page produit. |
shop_review_captcha_enabled | (Paramètres → Sécurité) Exiger un CAPTCHA sur le formulaire d’avis. Un champ honeypot et une limite de 10 requêtes/minute sont toujours actifs. |
Admin : Attributs & filtres à facettes
Boutique → Attributs définit les attributs de produit (Couleur, Taille, Matière…) et leurs valeurs. Les attributs de type Pastilles de couleur portent une couleur hexadécimale par valeur. Les produits sont associés à des valeurs depuis la carte Attributs du formulaire produit. Les attributs filtrables apparaissent dans la barre latérale de la boutique comme facettes avec le nombre de produits en direct (chaque facette est comptée sur le jeu de résultats courant, sa propre sélection retirée), à côté des filtres de fourchette de prix, de note client et de disponibilité. Les filtres actifs sont affichés comme puces supprimables au-dessus de la grille.
Paramètres d’URL des filtres
| Paramètre | Description |
|---|---|
attr[<attribute-slug>][]=<value-slug> | Valeurs d’attributs (OU au sein d’un attribut, ET entre attributs). |
min_price / max_price | Fourchette de prix, appliquée sur le prix actuel (promotionnel). |
rating=4 | Note moyenne minimum (4 = 4 étoiles & plus). |
in_stock=1 | Produits en stock uniquement. |
sort=rating | Trier par note moyenne. |
Le panneau de filtres et chaque type de facette peuvent être désactivés dans Boutique → Paramètres → Filtres du catalogue (shop_filters_enabled, shop_filter_price_enabled, shop_filter_stock_enabled, shop_filter_rating_enabled).
Admin : Règles de taxe
Deux modes de taxe sont disponibles (Boutique → Paramètres → Taxes, shop_tax_mode) : Taux unique conserve le taux unique applicable à toute la boutique des versions précédentes, et Règles de taxe applique des règles par localisation gérées sur Boutique → Règles de taxe.
Classes et taux de taxe
Une classe de taxe regroupe les produits taxés de la même manière (Standard, Réduit, Zéro…) ; une classe est celle par défaut et les produits peuvent en choisir une autre depuis le formulaire produit. Un taux de taxe appartient à une classe (ou à toutes les classes) et correspond à un pays, éventuellement à un état/région et à un code postal (exact, préfixe 75* ou plage 1000-1999). Les taux sont appliqués par ordre de priorité ; un taux composé est calculé au-dessus des taxes de priorité inférieure. Les taux marqués Taxe la livraison s’appliquent aussi au montant de la livraison. Les prix TTC sont respectés : le montant net est déduit d’abord et les mêmes fractions s’appliquent.
Résolution de la localisation
La localisation applicable est déterminée par shop_tax_basis : l’adresse de livraison du client, son adresse de facturation ou la localisation de la boutique (shop_tax_store_country / état / code postal). Avant qu’une adresse ne soit saisie, l’estimation lors de la commande utilise, dans l’ordre : la localisation mémorisée d’une estimation précédente, l’adresse par défaut enregistrée du client, le pays GeoIP du visiteur et enfin la localisation de la boutique. Changer le pays, l’état ou le code postal lors de la commande recalcule les totaux en direct (POST shop/checkout/estimate).
TVA UE (B2B)
Avec shop_tax_vat_enabled, la page de commande affiche un champ numéro de TVA. Les numéros sont validés auprès du service VIES de la Commission européenne (résultats mis en cache pendant un jour). Lorsque shop_tax_reverse_charge_enabled est activé, un numéro valide d’un pays de l’UE autre que celui de la boutique rend la commande exonérée de taxe (autoliquidation) ; shop_tax_vat_require_valid bloque en outre la commande lorsque VIES rejette le numéro. Le numéro de TVA, le détail par taux et le motif d’exonération sont enregistrés sur la commande (vat_number, tax_breakdown, tax_exempt_reason) et chaque ligne de commande porte son tax_amount.
Front-end : Liste d’envies & Mettre de côté
Un bouton cœur sur les fiches produit et les pages produit ajoute le produit à la liste d’envies du visiteur. Les clients connectés possèdent une seule liste ; les visiteurs obtiennent une liste de session qui est fusionnée dans leur compte à la connexion. La page Ma liste d’envies (/shop/wishlist, également dans le menu du compte) permet aux clients de déplacer des articles vers le panier, de les retirer et de partager la liste via un lien privé (/shop/wishlist/{token}) qui peut être désactivé à tout moment. Les listes de visiteurs restées inchangées pendant shop.wishlist.guest_retention_days (90 jours) sont purgées chaque semaine par shop:prune-guest-wishlists.
Dans le panier, Mettre de côté met une ligne en attente : elle quitte les totaux et la commande, mais reste listée sous Mis de côté jusqu’à ce qu’elle soit remise (au prix actuel) ou retirée. Les lignes mises de côté survivent à une commande finalisée.
Interrupteurs : shop_wishlist_enabled, shop_wishlist_guest_enabled, shop_save_for_later_enabled (Boutique → Paramètres → Liste d’envies).
Admin : Flux marchands
La page Flux marchands (Boutique → Flux marchands) gère la génération de flux de produits pour les plateformes publicitaires e-commerce.
Plateformes supportées
| Plateforme | Format | Paramètres clés |
|---|---|---|
| Google Merchant Center | XML | ID Merchant Center, Pays cible, Langue du contenu |
| Bing / Microsoft | XML | ID marchand, ID boutique |
| Facebook / Meta Commerce | XML | ID compte Commerce, ID catalogue |
| Amazon Product Ads | XML | ID vendeur, ID marketplace, Catégorie par défaut |
| TikTok Shop | CSV | ID TikTok Shop |
| Yandex.Market | YML | Nom de la boutique, Nom de l’entreprise |
| Baidu Commerce | XML | ID marchand |
Gestion par plateforme
Pour chaque plateforme, l’administrateur peut :
- Activer/Désactiver : basculer la génération de flux.
- Configurer les paramètres : ID marchand, clés API (chiffrées), devise, durée du cache, inclure les variantes, inclure les produits en rupture de stock.
- Personnaliser les mappages de champs : mapper les champs spécifiques à la plateforme aux propriétés des données produit. Remplacer les mappages par défaut, définir des valeurs par défaut et appliquer des transformations.
- Générer le flux : déclencher manuellement la génération du flux.
- Prévisualiser le flux : afficher un échantillon de la sortie générée.
- Valider le flux : vérifier le flux pour détecter les erreurs structurelles.
Commande Artisan
Génère les flux pour toutes les plateformes activées. Peut être planifié via le planificateur de tâches de Laravel pour une régénération périodique automatique.
URLs des flux
Les flux générés sont accessibles à :
Par exemple : /feeds/products/google retourne le flux XML Google Merchant Center.
Front-end : Catalogue produits
Routes
| Méthode | URL | Nom de la route | Description |
|---|---|---|---|
| GET | /{locale}/shop |
shop.index.localized |
Page de liste des produits |
| GET | /{locale}/shop/category/{slug} |
shop.category.localized |
Liste filtrée par catégorie |
| GET | /{locale}/shop/product/{slug} |
shop.product.localized |
Page de détail du produit |
Des variantes non localisées (sans {locale}) sont également enregistrées.
Fonctionnalités du catalogue
- Filtrage par catégorie via l’URL ou les liens de la barre latérale.
- Recherche dans le nom, la description et le SKU des produits.
- Trier par : plus récent, prix (croissant/décroissant), nom, popularité (nombre de vues).
- Filtre de fourchette de prix avec paramètres min/max.
- Vue grille / liste basculable.
- Pagination avec taille de page configurable.
Page de détail du produit
- Galerie d’images du produit avec image mise en avant.
- Affichage du prix avec badge promotionnel et pourcentage de réduction.
- Sélecteur de variante (si des variantes existent).
- Indicateur de disponibilité en stock.
- Bouton Ajouter au panier (ou lien “Acheter maintenant” pour les produits externes).
- Section produits similaires (même catégorie).
- Données structurées JSON-LD schema.org (via le composant
<x-shop-json-ld>).
Les produits numériques utilisent une mise en page dédiée de type marketplace (galerie, carte détails du produit, lien vers le journal des versions, détails techniques) uniquement lorsque la fonctionnalité Produits numériques est activée. La fonctionnalité désactivée, chaque produit — même encore marqué comme numérique — utilise la mise en page physique standard.
Front-end : Panier d’achat
Routes
| Méthode | URL | Nom de la route | Description |
|---|---|---|---|
| GET | /{locale}/shop/cart |
shop.cart.localized |
Voir le panier |
| POST | /{locale}/shop/cart/add |
shop.cart.add.localized |
Ajouter un article au panier |
| POST | /{locale}/shop/cart/update |
shop.cart.update.localized |
Mettre à jour la quantité |
| POST | /{locale}/shop/cart/remove |
shop.cart.remove.localized |
Retirer un article du panier |
| POST | /{locale}/shop/cart/clear |
shop.cart.clear.localized |
Vider le panier |
| POST | /{locale}/shop/cart/coupon |
shop.cart.coupon.localized |
Appliquer un code coupon |
| DELETE | /{locale}/shop/cart/coupon |
shop.cart.coupon.remove.localized |
Retirer le coupon appliqué |
Comportement du panier
- Paniers invités : stockés en base de données, identifiés par un ID basé sur la session (clé de session
shop_cart). - Paniers authentifiés : stockés par
user_id. Lorsqu’un utilisateur se connecte, son panier de session est automatiquement fusionné dans son panier utilisateur. - Validation du stock : l’ajout d’articles vérifie le stock disponible. Si la quantité demandée dépasse le stock, une erreur est retournée.
- Quantité maximum : limite configurable par article (par défaut : 99).
- Les produits externes ne peuvent pas être ajoutés au panier ; une exception est levée avec un message traduisible.
- Le compteur du panier est partagé avec toutes les vues via un View Composer.
Totaux du panier
Le CartService calcule :
- Sous-total : somme de (prix × quantité) pour tous les articles.
- Réduction : réduction coupon (pourcentage ou fixe), plafonnée à
max_discount. - Taxe : calculée sur (sous-total - réduction). Supporte les prix TTC (extraction de la taxe intégrée).
- Livraison : tarif forfaitaire, supprimé pour les commandes entièrement numériques ou lorsque le sous-total atteint le seuil de livraison gratuite.
- Total : sous-total - réduction + taxe + livraison.
Front-end : Commande
Routes
| Méthode | URL | Nom de la route | Description |
|---|---|---|---|
| GET | /{locale}/shop/checkout |
shop.checkout.localized |
Formulaire de commande |
| POST | /{locale}/shop/checkout |
shop.checkout.process.localized |
Traiter la commande |
| GET | /{locale}/shop/checkout/success/{orderNumber} |
shop.checkout.success.localized |
Page de succès de la commande |
Flux de commande
- Validation du panier : redirige vers la page du panier si vide.
- Vérification invité : si la commande en tant qu’invité est désactivée et que l’utilisateur n’est pas authentifié, redirige vers la connexion.
- Affichage du formulaire : informations de facturation (nom, e-mail, téléphone), adresse de facturation, adresse de livraison, notes de commande, sélecteur de méthode de paiement.
- Soumission du formulaire via la validation
CheckoutRequest. - Création de la commande : la méthode
OrderService::createFromCart():- Crée l’enregistrement de la commande avec tous les totaux.
- Crée les articles de la commande à partir des articles du panier.
- Génère les liens de téléchargement pour les produits numériques.
- Décrémente le stock pour les produits à stock géré.
- Incrémente le compteur d’utilisation du coupon.
- Envoie les notifications par e-mail à l’administrateur et au client.
- Traitement du paiement : la commande implémente l’interface
Payable, permettant auPaymentServiceprincipal de router vers la passerelle de paiement sélectionnée. - Page de succès : affiche la confirmation de commande avec le numéro et les détails de la commande.
{prefix}-{YYYYMMDD}-{zero-padded ID}.
Le préfixe est configurable via shop_order_prefix.
Front-end : Mes commandes
Routes
| Méthode | URL | Nom de la route | Description |
|---|---|---|---|
| GET | /{locale}/shop/my-orders |
shop.orders.localized |
Lister les commandes de l’utilisateur (authentification requise) |
| GET | /{locale}/shop/my-orders/{orderNumber} |
shop.orders.show.localized |
Détail de la commande (authentification requise) |
| GET | /{locale}/shop/my-orders/{orderNumber}/download/{itemId} |
shop.orders.download.localized |
Télécharger un produit numérique (authentification requise) |
Téléchargements numériques
Pour les produits numériques, le téléchargement est autorisé lorsque toutes les conditions sont remplies :
- L’article de la commande est marqué comme
is_digitalavec undownload_link. - La commande a été payée (
payment_status = 'paid'). - Le lien de téléchargement n’a pas expiré (
download_expires_atest dans le futur). - Le nombre de téléchargements n’a pas atteint le maximum (
shop_digital_max_downloads).
Chaque téléchargement réussi incrémente download_count.
Accès aux mises à jour & téléchargements versionnés
Pour les produits avec mises à jour, la page de commande affiche l’état de l’accès aux mises à jour de l’acheteur et, à l’approche ou après son expiration, un bouton Prolonger pour payer une nouvelle fenêtre.
Pour les produits adossés à git dont l’accès aux mises à jour a expiré, l’acheteur peut encore récupérer la version exacte que couvre sa licence (la version la plus récente datée au plus tard à la fin de son accès) :
- Il clique sur Obtenir la version… sur la page de commande. L’archive est (re)générée depuis son tag git en arrière-plan — la requête répond donc immédiatement.
- Lorsqu’elle est prête, l’acheteur reçoit par e-mail un lien de téléchargement privé à durée limitée qui indique sa date de validité (48 h par défaut,
SHOP_GIT_VERSION_LINK_TTL_HOURS). - Les liens expirés et les fichiers générés correspondants sont nettoyés automatiquement (
shop:prune-version-downloads, quotidiennement).
Notifications de mise à jour
Les acheteurs d’un produit avec mises à jour sont abonnés par défaut aux notifications de nouvelles versions. Une case à cocher sur la page de commande leur permet de se désabonner. Lorsqu’une nouvelle version est publiée (et que l’administrateur choisit de notifier), chaque acheteur abonné reçoit un e-mail.
Front-end : Suivi de commande
/{locale}/shop/order/track
Description
Suivi de commande pour les invités. Les clients saisissent leur numéro de commande et leur e-mail de facturation pour consulter le statut de la commande sans se connecter.
Paramètres de requête
order_number |
Requis | Le numéro de commande (ex. ORD-20260307-00000001) |
email |
Requis | E-mail de facturation utilisé lors de la commande |
Flux de paiement
- Le client sélectionne une méthode de paiement sur la page de commande.
- Le contrôleur de commande crée la commande via
OrderService::createFromCart(). - Le
PaymentServiceroute la commande vers la passerelle sélectionnée. - La passerelle traite le paiement (redirection vers une page externe, formulaire de carte, etc.).
- En cas de succès, la passerelle appelle
order->markAsPaid()qui définit le statut sur terminé et le statut de paiement sur payé, puis vide le panier. - En cas d’échec, la passerelle appelle
order->markPaymentFailed(). - Le client est redirigé vers l’URL de succès ou de retour à la commande.
Transactions
Les passerelles de paiement créent des enregistrements Transaction pour suivre les événements de paiement :
- Type :
paymentourefund - Statut :
pending,completedoufailed - Infos passerelle : nom de la passerelle, ID de transaction passerelle, montant, devise
- Métadonnées : champ JSON pour les données spécifiques à la passerelle
Mise à jour
Il existe deux façons de mettre à jour cet add-on : depuis le panneau d’administration (recommandé) ou en remplaçant manuellement les fichiers.
Méthode 1 : Téléversement depuis le panneau d’administration (recommandé)
- Téléchargez le dernier fichier
.zipde cet add-on. - Allez dans Panneau d’administration → Add-ons et cliquez sur le bouton Téléverser.
- Sélectionnez ou glissez le fichier
.zipdans la zone de téléversement. - Une demande de confirmation affichera les numéros de version actuel et nouveau. Cliquez sur Remplacer pour continuer.
- Allez dans Panneau d’administration → Mise à jour du système (
/admin/update) pour appliquer les migrations de base de données en attente.
Méthode 2 : Remplacement manuel des fichiers
Étape 1 : Remplacer les fichiers
Remplacez le répertoire de l’add-on par la nouvelle version.
Étape 2 : Exécuter les migrations
php artisan migrate
Les migrations en attente ne s’exécutent qu’une seule fois : la commande peut être relancée sans risque.
Étape 3 : Vider les caches
php artisan config:clear
php artisan route:clear
php artisan view:clear
Étape 4 : Reconstruire les assets
shop_products.license_product_id vers sa table
licenses_product_marketplace.
Désinstallation
Éteindre un add-on sans rien perdre, c’est le désactiver : allez dans Panneau d’administration → Add-ons, trouvez Shop et cliquez sur Désactiver.
- Ses routes, ses vues, ses entrées de menu d’administration et ses permissions cessent d’être enregistrées, et ses pages publiques ne répondent plus.
- Ses tables de base de données et toutes les données qu’elles contiennent sont conservées, et ses fichiers restent dans
extensions/addons/shop/. Rien n’est supprimé. - Le code d’achat enregistré lors de l’activation est conservé lui aussi : réactiver l’add-on ne le redemande pas.
- La désactivation est refusée tant qu’un autre add-on actif dépend de celui-ci : désactivez d’abord cet add-on.
Cliquez sur Activer sur la même carte pour le rallumer. Les migrations en attente sont rejouées, les assets republiés, et l’add-on reprend exactement là où il s’était arrêté.
Suppression
La suppression est définitive et détruit les données de l’add-on. Le bouton Supprimer n’apparaît que sur un add-on désactivé : la suppression se fait donc toujours en deux temps :
- Désactivez Shop (voir Désinstallation).
- Cliquez sur Supprimer sur sa carte et confirmez la demande.
Le panneau d’administration, en une seule passe :
- exécute le hook de désinstallation de l’add-on, s’il en fournit un, tant que son code est encore sur le disque ;
- révoque les permissions déclarées dans son
addon.json; - annule ses migrations — ce qui supprime ses tables de base de données et toutes les lignes qu’elles contiennent — et purge ses entrées de la table
migrations, afin qu’une réinstallation ultérieure reparte de zéro ; - supprime ses assets publiés :
public/addons/shop/,public/vendor/shop/etstorage/app/public/addons/shop/; - supprime le dossier de l’add-on
extensions/addons/shop/; - supprime sa ligne dans la table
addons(le code d’achat enregistré disparaît avec elle) et vide le cache de l’application.
La suppression est refusée, avec un message explicatif et avant toute destruction, lorsque l’add-on est encore actif, lorsqu’un autre add-on actif en dépend, ou lorsque l’utilisateur du serveur web (PHP) ne peut pas supprimer extensions/addons/shop/. Dans ce dernier cas, donnez à cet utilisateur le droit d’écriture sur le dossier et sur son parent, puis réessayez.
Supprimer le dossier en FTP ou en SSH n’est pas équivalent : les tables de l’add-on, ses entrées dans la table migrations et sa ligne addons restent en place, et sa carte reste dans la liste. Utilisez plutôt Supprimer dans le panneau d’administration.
Dépannage
Les produits n’apparaissent pas dans le catalogue
- Vérifiez que le statut du produit est Publié (pas Brouillon ni Archivé).
- Vérifiez
published_at: s’il est défini, il doit être dans le passé. - Vérifiez que le produit a au moins un nom défini pour la langue actuelle.
L’ajout au panier échoue : “Stock insuffisant”
- Vérifiez que
stock_quantityest supérieur à la quantité demandée. - Si l’article est déjà dans le panier, la quantité combinée ne doit pas dépasser le stock disponible.
- Désactivez Gérer le stock sur le produit pour le considérer toujours comme en stock.
Impossible d’ajouter un produit externe au panier
C’est par conception. Les produits externes (checkout_type = 'external') redirigent vers une boutique externe.
Ils ne peuvent pas être ajoutés au panier interne. Sur le front-end, un lien “Acheter maintenant” (ou un sélecteur de boutique lorsque
le produit liste plusieurs boutiques) est affiché au lieu du bouton Ajouter au panier.
Le coupon ne s’applique pas
- Vérifiez que
is_activedu coupon esttrue. - Vérifiez les dates
starts_atetexpires_at. - Confirmez que le sous-total de la commande atteint
min_order_amount. - Vérifiez si
used_counta atteintmax_uses.
La commande échoue : aucune passerelle de paiement disponible
- Installez et activez au moins un add-on de passerelle de paiement (ex. Stripe).
- Le paiement à la livraison (COD) est disponible comme option intégrée lorsque la boutique est active.
- Vérifiez que la passerelle de paiement est correctement configurée dans ses paramètres.
Le téléchargement numérique retourne 403 ou “Téléchargement non disponible”
- Confirmez que le
payment_statusde la commande estpaid. - Vérifiez si le téléchargement a expiré (
download_expires_at). - Vérifiez si le nombre maximum de téléchargements a été atteint.
- Vérifiez que le fichier numérique existe sur le disque de stockage configuré au chemin enregistré.
“Créer / Mettre à jour le produit de licence” échoue
- SKU différents : le produit de la boutique et son produit de licence ont des SKU différents. Rendez-les identiques (sur le produit de la boutique ou dans Licences → Produits), puis cliquez à nouveau sur le bouton.
- SKU déjà utilisé : un autre produit de licence porte déjà ce SKU. Liez plutôt ce produit de licence, ou changez l’un des SKU.
- Le bouton n’existe que pour les produits numériques, avec l’add-on Licences actif et Activer les produits numériques activé.
Aucune clé de licence émise pour une commande payée
- Vérifiez que le produit possède un produit de licence (voir Produits de licence).
- Vérifiez que la marketplace Boutique est activée dans les paramètres de Licences (
licenses_shop_marketplace_enabled). - Les commandes de renouvellement de l’accès aux mises à jour n’émettent jamais de clé : elles prolongent seulement celle qui existe.
Le flux marchand retourne vide ou 404
- Vérifiez que la plateforme est activée dans Boutique → Flux marchands.
- Exécutez
php artisan shop:generate-feedspour régénérer les flux. - Vérifiez que des produits publiés existent avec
is_digital = falseou queinclude_out_of_stockest activé. - Vérifiez l’URL du flux :
/feeds/products/{platformKey}(ex./feeds/products/google).
Le calcul des taxes semble incorrect
- Si vous utilisez des prix TTC, la taxe est extraite du (et non ajoutée au) sous-total. Pour un taux de 20% sur un sous-total de 120$ : taxe = 120$ - (120$ / 1,20) = 20$.
- Pour des prix HT, la taxe est calculée comme : (sous-total - réduction) × taux / 100.
- Vérifiez que le paramètre
shop_tax_rateest le pourcentage correct (ex. 20 pour 20%, pas 0,20).
Le panier ne fusionne pas après la connexion
- Le panier de session est identifié par la clé de session
shop_cart. Si la session a été effacée avant la connexion, le panier invité ne peut pas être trouvé. - La fusion se produit dans
CartService::mergeSessionCart()lors du premier accès au panier après la connexion.
Boutique v1.0.0 : Composant de la plateforme CMS Larapen.
© BeDigit. Tous droits réservés.