Z Commerce

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

  • Z-commerce est un squelette qui permet, avec step, de charger les plugins nécessaires à la création d’une boutique en ligne. Il offre de plus une démo basique permettant de gérer les différentes étapes d’un achat en ligne.
    Il fonctionne actuellement avec le service de paiement en ligne Paypal (http://fr.wikipedia.org/wiki/PayPal)

Ce plugin est une création de Touti et Rastapopoulos suite à une discussion "Samaritaine", la plupart des plugins spécifiques listés ci-dessous ayant eux été commis par Rastapopoulos. Bravo à eux.

Les plugins

Les plugins génériques :

  • Z, squelette modulaire
  • Bonux, outils de développement
  • Saisies, pour écrire facilement des champs de formulaires
  • YAML, pour gérer le format YAML, format de fichier simple pour éditer des listes de données
  • Vérifier, une API générique pour vérifier les valeurs saisies
  • Médiathèque, pour gérer les images ou documents associées à vos produits ou commandes
  • Afficher objets, pour présenter les listes d’éléments de l’espace privé sous forme de squelettes SPIP
  • Pays, liste officielle des pays utilisée dans le formulaire Clients
  • Contacts et organisations, gestionnaire de contacts clients
  • Coordonnées, pour rajouter des coordonnées postales et téléphoniques aux clients

Les plugins spécifiques :

  • Prix, une API pour connaître et formater le prix d’un objet
  • Paniers, créer des sélections d’objets ayant un prix
  • Commandes, pour gérer des commandes
  • Clients, formulaire d’inscription de clients
  • Produits, pour créer des produits à vendre
  • Bank, liaison avec tout type de banque et + (Stripe, Paypal)

Les plugins utilisables avec

  • Montants, pour donner un prix par défaut aux objets SPIP, (l’objet ayant au moins une colonne ’prix’)
  • Abonnements, ouvrir des droits d’accès durant un temps donné et suivant le paiement

Une décomposition modulaire

Parce qu’il n’y a pas UN site e-commerce, le « workflow » pouvant être différent sur chaque site, il faut pouvoir s’adapter à plusieurs cas différents. C’est le parti pris de cette décomposition modulaire en de nombreux plugins.

Dans cette démo z-commerce, on se propose de suivre la progression suivante

  1. La boutique : le client navigue parmi les produits proposés et remplit son panier.
  2. Le panier : le client valide le contenu de son panier.
  3. Les coordonnées : le client saisit ses coordonnées et s’identifie
  4. Le paiement : le client choisit un moyen de paiement (ici Paypal)
  5. Paiement et retour banque

La vraie commande (c’est-à-dire la transformation du panier en commande) est créée à la fin de l’identification via le pipeline zcommerce_formulaire_traiter() qui crée aussi les adresses de facturation et de livraison qui seront associées à la commande.

A voir :

http://permalink.gmane.org/gmane.comp.web.spip.zone/26198

Préalable

-  Dans tous les cas, vérifiez dans votre SPIP que votre site autorise les inscriptions des visiteurs. Pour cela cliquez l’onglet configuration/Interactivité et choisissez « Accepter l’inscription de visiteurs du site public ».

-  Créer un compte Paypal de simulation (Voir aussi ici et )

PayPal a mis en place une sandbox de son service permettant de tester l’intégration du service et simuler des paiements sans qu’aucun fond ne soit versé. Très pratique pour la période de test !

  1. Rendez-vous sur le site développeur de PayPal (https://developer.paypal.com/) et créez un compte. Le compte sandbox est indépendant de votre compte PayPal original. Vous n’avez pas besoin de mettre la même adresse.
  2. Créer un premier compte de Test de type "Buyer". Dans un premier temps, nous allons créer un compte Buyer, celui qui achètera le produit. Cliquez sur le lien "Create a preconfigured buyer or seller account." situé sur la page d’accueil de la Sandbox. Mettez n’importe quel nom d’utilisateur. L’adresse email n’a pas besoin d’être valide. Puis validez.
  3. Créer un deuxième compte de test, cette fois-ci de type "Seller". Réitérez l’opération pour créer le compte marchand, celui qui recevra l’argent virtuel de nos tests. Cliquez sur le lien "Create a preconfigured buyer or seller account." situé sur la page d’accueil de la Sandbox. Sélectionnez Account Type = "Seller". Validez.
  4. Vérifiez que vos deux comptes soient bien créés dans votre sandbox. Cliquez sur "Test Accounts" dans le menu de la sandbox. Vous devriez avoir vos deux comptes virtuels affichés. Vous pouvez essayer de lancer la sandbox sur l’un des deux comptes, vous verrez que l’interface est identique à celle que vous avez avec votre compte PayPal réel.
  5. Activer les Notifications Instantanées de Paiement (IPN) sur le compte vendeur. Sélectionnez le compte vendeur (Celui qui fini par biz@votredomaine) puis lancez la sandbox (Cliquez sur Enter Sandbox Site). Identifiez vous dans la nouvelle page avec l’email / pass de votre compte virtuel vendeur. Allez dans la partie "Profile" puis "Selling Preferences" et cliquez sur le lien "Instant Payment Notification". Activez la notification et spécifiez le domaine de votre site.

-  Dans votre site SPIP, menu Configuration/CFG/Paypal, choisir l’environnement de test dans le premier formulaire et saisir votre adresse email de vendeur dans le second formulaire.

-  Définir le taux de TVA dans le menu Configuration/Produits (0.196 par exemple)

-  Créer des produits

  1. Créez une rubrique « Boutique » dans votre site
  2. Dans cette rubrique, créez des produits.
  3. Cliquez sur « Ajouter un document », pour associer une image à votre produit,
  4. Publiez vos produits

-  Vérifier que l’inscription des visiteurs est autorisée sur le site dans la page de configuration/interactivité Spip. Vérifier que le site peut envoyer le mail de confirmation d’inscription. Éventuellement rajouter des champs au formulaire d’inscription via le menu Configuration/Clients.

-  Surcharger le fichier commandes/inclure/facture-de.html dans votre dossier squelettes/inclure avec les coordonnées voulues du Vendeur

Votre boutique en action

-  Déconnectez-vous de Spip et rendez-vous sur la page ?page=z-commerce

-  Remplissez votre panier dans la boutique. Allez éventuellement sur d’autres pages du site, puis rajoutez des produits dans votre panier. Enfin cliquez sur continuer pour passer à l’étape 2

-  Vérifiez votre panier, changez éventuellement les quantité et vérifier le recalcul du panier. Cliquez sur continuer pour passer à l’étape 3

-  Remplissez le formulaire des coordonnées. Veillez à renseigner un email valide pour recevoir vos identifiants de connexion (ne pas utiliser ici votre email de simulation client paypal). Après avoir relevé votre courrier, connectez vous (en restant sur la même page) avec les identifiants reçus. Vérifiez les coordonnées et enregistrez. On arrive ici à l’étape 4.

-  A cette étape, la commande est créée avec les adresses de facturation et de livraison issue de l’adresse dite "principale" précédemment saisie. Vous pouvez modifier ces adresses qui sont liées à la commande.

-  Pour payer, cliquez sur le bouton Paypal « Acheter ». On est alors redirigé vers la sandbox paypal. Connectez-vous maintenant avec votre compte simulé client. Vérifiez les informations et cliquez sur « Payer » Cliquez ensuite sur « Retour chez... » pour revenir au site Spip.

-  La page indique que la commande est payée et vous pouvez imprimer une facture...

-  SI vous avez activé les notification dans la page de configuration de Commandes, vous devez avoir reçu des emails de confirmation "vendeur" et "client".

-  Vérifiez les transactions dans vos sandbox client et vendeur.

C’est pas le tout de jouer à la marchande...

Dans back office de Spip, vous avez accès :
-  à la gestion des commandes et des factures via le menu Activités / Commandes
-  à la gestion de vos clients via le menu Edition / Contacts et Organisation. A noter que la page de commandes permet aussi d’afficher une fiche client, différente de la précédente... Pas très clair ça.

Ben maintenant pour de vrai

-  Vous n’avez plus qu’à adapter votre workflow et vos squelettes en vous inspirant de ceux du plugin z-commerce.
-  Désinstallez le plugin z-commerce
-  Et bien sûr créez un vrai compte vendeur Paypal
-  Mettez à jour la configuration du plugin Paypal avec votre compte vendeur. A noter que vous pouvez utiliser le plugin en passant les paramètres directement à la balise #FORMULAIRE_PAYPAL dans votre squelette.

Notes

Mon compte : une fois connecté, un bloc « Mon Compte » s’affiche dans la zone « extras ». On y trouve :

  • un accès à toutes vos commandes.
  • un lien de déconnexion

Simulation de paiement : Il est possible de simuler un retour de paiement de Paypal en changeant l’état d’une commande. Ceci peut se faire depuis l’espace privé dans la page Activités / Commandes en rajoutant &simuler=1 à l’url. Utile pour faire des tests sur vos squelettes en local.

Retour Paypal : Il y a 3 types de communication entre PayPal et votre boutique après que le client ait cliqué sur le bouton d’achat :
-  Le client clique sur le lien « Retour au site du vendeur » après paiement. C’est l’url que vous avez fournie au formulaire PayPal dans le champ caché « return », donc dans la variable d’environnement « redirect_ok ». Par exemple si cette variable vaut #URL_ACTION_AUTEUR{supprimer_panier_encours, "", #URL_PAGE{confirmation, reference=#INFO_REFERENCE{commande, #SESSION{id_commande}}}}, signifie : quand le client revient de PayPal sur mon site, alors je vide son panier en cours directement puis je redirige vers la page de confirmation (genre « votre commande ID1234 s’est bien passé, merci de votre achat blablabla »). Ya une double redirection.
-  Le client clique sur le lien « Annuler et revenir au site du vendeur » avant paiement. C’est l’url fournie au formulaire PayPal dans le champ caché « cancel_return » et qui vaut #SELF. Le client revient donc à la page contenant le formulaire de paiement.
-  Lorsque le client a validé le paiement (ou qu’un paiement est annulé ou remboursé), PayPal envoie une notification (IPN : Notification instantanée de paiement) à l’URL indiquée dans le champ caché « notify_url », soit #URL_ACTION_AUTEUR{paypal_ipn}. La fonction appelée effectue les vérifications nécessaires et appelle les pipelines de traitement XX_traitement_paypal(). Par exemple, le pipeline du plugin commandes_paypal, se charge de gérer le changement de statut de la commande.

Durée de vie des paniers : par défaut 24h pour un anonyme et 7 jours pour un inscrit.

Durée de vie des commandes : 1h, modifiable via la page de configuration du plugin Commandes

Recopie de quelques discussions de la liste zone

Clients, Contacts&Organisations, Coordonnées
-  Touti : Je ne comprends toujours pas pourquoi un client doit être un contact, une explication ?
à part pour le prénom peut-être, vu que coordonnees va gérer les adresses,
perso, j’ai collé un formulaire client directement branché sur auteur, et au besoin, on peut ensuite le passer en contact.
-  km : Pour la logique je n’ai pas de réponse. Dans mes cas d’usage je me
retrouve aussi avec des clients qui ne sont que des contacts, et on
peut avoir tout aussi bien le contraire. Pour ce qui concerne le présent plugin, de ce que j’en ai compris.
l’auteur (au sens objet spip) est là pour la partie authentification
et l’objet contact pour le profil du-dit utilisateur.
Mais je ne comprends pas alors l’affectation des coordonnées à l’objet
auteur et non contact.
-  Rastapopoulos : Oui c’est un peu ça. Pour le choix de la liaison, j’en sais trop rien... disons que pour moi le « cœur » d’un utilisateur c’est forcément l’auteur car il faut une authentification pour utiliser l’application (au sens e-commerce). Ensuite on y ajoute soit des coordonnées, soit des informations supplémentaires sur la personne, soit les deux.

Produits, Prix, Montants, Devises
-  Rastapopoulos : Le plugin Prix est une API centrale commune à tout ce qui pourrait toucher à de l’argent. Des fonctions uniques quelque soit le type d’objet permette de récupérer le prix hors taxe ou le prix taxé d’un objet. Le principe est que chaque objet éditorial *peut* être étiqueté d’un prix. Sinon son prix vaut 0.
inc_prix_dist($type_objet, $id_objet)
Pour implémenter cela, pour un cas simple, il suffit que l’objet ait un champ « prix_ht » ou un champ « prix » dans sa table.
Pour un cas plus complexe (souvent), il faut que l’objet ait un fichier « prix/montruc.php » avec dedans une fonction qui dit quel est son prix HT, et une fonction qui dit quel est son prix taxé (si ça a un sens, sinon prix TTC = prix HT).
Pour les deux fonctions (prix et prix_ht) il y a un pipeline qui permet de modifier le comportement (un plugin externe qui ajoute une taxe supplémentaire par ex).
Le plugin ne gère pas les devises volontairement, avec l’euro par défaut, mais le but est bien que SI le plugin devise existe on puisse l’utiliser (à faire).
Le plugin Prix ne s’occupe que d’indiquer UN nombre associé à un objet, sans indiquer dans quelle devise c’est. Ça c’est au plugin qui utilise Prix de le dire (par exemple Produits devrait permettre de configurer que les prix des produits sont donnés en Yen par défaut).
Ensuite ce sont aux plugins utilisant Prix de faire un peu ce qu’ils veulent avec ce nombre. En effet, pour chaque objet l’utilisant ça peut être un comportement différent, ce n’est pas à l’API centrale de le dire.
Le plugin Montant c’est pas moi, mais je crois que le but est de donner un prix *par défaut* à des types d’objets ou des branches précises de l’arbo quand c’est pour des rubriques ou articles.
À mon avis le plugin Devise doit rester bien séparé, car peut servir à de multiples choses (même quand on a pas d’objets avec des prix). J’ai essayé de construire tout un début de framework e-commerce sur ce principe modulaire.
Pour l’instant je ne sais pas si la jonction se ferait en priorité entre Devise et Prix, ou entre Devise et les plugins utilisant Prix.
Azerttyu a aussi un cas où chaque objet à PLUSIEURS prix dans plusieurs devises, car pour chaque monnaie les prix sont adaptés et non pas calculés automatiquement à partir d’une seule. Et ça pour l’instant le plugin Prix ne le prévoie pas. Donc ça serait peut-être à lui de le prévoir dans l’API, pour qu’on puisse demander le prix de l’objet patate-34 dans la devise XX...
Bref tout ceci est TRÈS complexe, mais oui : dans l’idée ton plugin était bien prévu dès le départ pour venir se brancher quelque part !
Dans un premier temps il peut déjà s’occuper de la fonction « prix_formater » :
http://zone.spip.org/trac/spip-zone/browser/_plugins_/prix/prix_fonctions.php#L46
Celle-ci affiche un nombre donné en ajoutant la devise (euro pour l’instant) et donc le plugin Devise si y’a une notion de « devise par défaut pour un site » (différent de rubrique 0 car on peut avoir un site sans rubriques mais avec un autre objet ayant un prix) devrait remplacer « euro » par celle-ci.
Voilà j’ai écrit tout ça un peu en bordel, alors n’hésite pas à poser des questions plus précises sur tel ou tel point.
http://archives.rezo.net/archives/spip-zone.mbox/RS7K5PXZBGJBQSSCIXFOC3HQ3TSPCS2R/

Changer la devise

Pour afficher les prix en Canadian Dollar et avec le signe $ seulement (cf http://permalink.gmane.org/gmane.comp.web.spip.user/192165)

Dans plugin PRIX/ prix_fonction.php :

function filtres_prix_formater_dist($prix){
	// Pouvoir débrayer la devise de référence
       if (! defined('PRIX_DEVISE')) {
         define('PRIX_DEVISE','en_CA.utf8');
       }

       // Pouvoir débrayer l'écriture de la devise par défaut
       if (! defined('DEVISE_DEFAUT')) {
         define('DEVISE_DEFAUT',' $');

Mais ainsi, j’obtiens un signe de $ mais le montant est précédé d’un CAD

Puis installer et activer le plugin prix_objet
Choisir la devise CAD.
Dans ce plugin, éditer le fichier prix_objet_fonction.php et changer la ligne 19 par :
’CAD’=>’$’,
Uploader par FTP et miracle le prix s’affiche en $"

Reste à faire dans ce doc :


-  Expliquer les champs de config du plugin Paypal
-  Comment rajouter des frais de port ?

Reste à faire dans le code :


-  un nouveau plugin pour gérer des variantes de produits
-  une API générique de paiement non dépendant d’un prestataire bancaire
-  un plugin pour gérer des réductions
-  Sécuriser le bouton payer de Paypal ? (Cf. fichier plugins/paypal/infos.txt)
-  Statistiques des ventes (dans le plugin commande ?)
-  Regrouper sur une page de l’admin, le suivi des commandes, leur modif, les factures, les clients, les stats (plugin commandes ? plugin Z commerce ?)

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom