joomla et virtuemart pour créer sa boutique ecommerce


joomla et virtuemart pour créer sa boutique ecommerce

 

2/2008 Dossier 2 ?????????? C etarticleoffreauxconsultantsetauxdé- veloppeurs les outils pour déployer sim- plement une solution Joomla / Virtue- Mart,etillustre,àl'aidedequelquesexemplesclés, la méthodologie d'intégration d'extensions. Pour cela, il est important d'avoir les connaissances sur le langage Php, les tableaux, bases Mysql et feuilles destyle,etlesnotionsdebasesurl'e-commerce. Joomla, le premier CMS du monde Joomla, avant d'offrir une plate-forme perfor- mante pour des sites d'ecommerce, est d'abord un outil de gestion de contenu Web. C'est l?un des premiers système de gestion de contenu Web au monde. Le site Web Alexa le position- nait il y a quelque temps en 450ème place des sites les plus visités au monde. Une solution communautaire La richesse de Joomla repose essentiellement sur sacommunauté,estiméeàplusdecentcinquante développeurs par an. Quel éditeur de logiciels peut aujourd?hui se prévaloir d?un tel nombre de personnes exclusivement dédiées au développe- ment du produit ? La communauté anglophone enregistre plus de cent quatre-vingts mille mem- bres sur les forums et les différents sites interna- tionaux. On y comptabilise par ailleurs près de 1,5 millions de posts. La communauté franco- phone de Joomla est par ailleurs très importante et dispose même d'un site de support spécifique. Cette communauté, très active et réactive, est d'ungrandsecourslorsquevousbutezsurunpro- blème.C'estaussisarécentemobilisationmassive quiacontribuéàlasortiedelaversion1.5dulogi- ciel apportant d'importantes évolutions fonction- nelles et techniques. L'ensemble de la solution est disponible sous licence GPL, garantissant sa dis- ponibilité, son intégrité et sa réutilisabilité. Une solution dotée d'importants modules, dont VirtueMart À ce jour, on compte plus de 2800 extensions réalisées par la communauté. Ces extensions sont majoritairement disponibles gratuite- ment, et vous permettent de répondre rapide- ment à n'importe quel besoin spécifique, de- puis l'intégration de newsletters, en passant par des outils de réservation en ligne, jusqu'à l'inté- gration de boutiques en ligne complètes. Cette richesse fait de Joomla l'une des so- lutions communautaires les plus abouties qui vous permet, lorsque vous souhaitez disposer d'un site d'ecommerce, de bénéficier égale- ment de toutes les avancées fonctionnelles con- cernant aussi bien des principes d'e-commerce que des outils de gestion de contenu. Gérer une boutique en ligne avec VirtueMart Créer une boutique en ligne standard avec Joomla ne nécessite pas de compétences techni- ques particulières. Nous verrons ici quels sont les paramétrages à mettre en oeuvre, avant d'al- ler plus loin dans le code. L?installation de virtuemart s?effectue grâce à l?utilitaire d?installation de modules et com- posants situé dans l?interface d?administration. L?archive de VirtueMart comprend, outre le composant principal, un module obligatoire ain- si que dix modules et deux plugins optionnels. Le module obligatoire mod_virtuemart est le point d?entrée principal de VirtueMart sur le site : il offre la possibilité d?afficher un for- mulaire d?identification, un résumé du panier, une liste des catégories de la boutique, un outil de recherche de produits ainsi qu?un lien vers l?ensemble des produits. La plupart des modules optionnels reprennent certaines fonctionnalités du module principal, comme le résumé du panier ou le formulaire de recherche de produits, l?intérêt étant d?apporter une certaine souplesse à la mise en page en sépa- rant les différentes fonctionnalités. Plusieurs de ces modules ont également pour but d?afficher sur les pages du sites des sélections de produits suivantcertainscritères,commelesderniersajou- tés ou les mieux notés par les utilisateurs. Le plugin de recherche permet au compo- sant de recherche de Joomla! d?intégrer les pro- duits de VirtueMart à ses résultats. Le plugin de contenu, quant à lui, permet d?inclure des informations de produits (des- cription, image, prix, lien ajouter au panier) à du contenu Joomla! Configurer sa boutique VirtueMart propose un outil d?administration qui s?intègre à celui de Joomla!. En cliquant sur le menu Composants>VirtueMart, on accède au panneau de contrôle de VirtueMart, qui re- prend la structure de celui de Joomla! : Un me- nu supérieur permet d?accéder à l?ensemble des fonctionnalités, tandis que la zone centrale est divisée en deux, avec sur la gauche des raccour- cis vers les fonctionnalités principales et sur la droite un panneau proposant divers onglets affi- chant des informations relatives à la boutique. La page de configuration de VirtueMart se divise en six onglets que nous allons à présent regarder en détails : L?onglet Global permet de configurer le fonctionnement général de Vir- tueMart. Il est divisé en plusieurs encarts con- cernant différents aspects de la boutique. Les encarts les plus intéressants se situent en bas de page : les réglages situés dans Fonctionnali- tés de la vitrine et Paramètres principaux affectent en effet directement le fonctionnement du site. L?onglet Chemins et URL comprend plusieurs paramètres qui ne seront à priori pas modifiés. L?url sécurisée sera utilisée pour le paiement si celui-ci est géré directement sur le site. Elle n?est pas utilisée dans le cas où l?utilisateur est redirigé vers une page appartenant au presta- taire de paiement. Les paramètres de l?onglet Site sont d?ordre cosmétique, et non essentiels au fonctionnement de la boutique. L?onglet Expédition permet d?activer ou de désactiver les modules de transport. Le fonc- tionnement de ces modules sera développé dans un chapitre ultérieur. L?onglet Commande sert à configurer le processus de commande. Ce Utiliser Joomla et VirtueMart pour réaliser Joomla est l?un des premiers système de gestion de contenu Web au monde. Le site Web Alexa le positionnait il y a quelque temps en 450ème place des sites les plus visités au monde. Nous vous proposons ici de découvrir le fonctionnement de cette solution et de mettre en oeuvre différentes solutions de paiement. votre boutique en ligne xxxxxxxxxxxxxxxxxxxx www.phpsolmag.org 3 ?????????? processus peut être composé de quatre étapes : Adresse de Livraison, Méthode d?expédition, Mé- thode de paiement et Validation de la commande. Les étapes Adresse de Livraison et Méthode d?ex- pédition sont facultatives et peuvent être désacti- vées, par exemple dans le cadre d?une boutique dont tous les produits sont téléchargeables. Le dernier onglet, Téléchargements, permet quant à lui d?activer et de paramétrer les produits télé- chargeables. Un paramètre important est le che- mindestockagedesfichiers,quidoitsetrouveren dehors de l?arborescence du site afin d?éviter que les fichiers ne soient accessibles directement. Mettre en place les produits VirtueMart permet de gérer une arborescence complexe de catégories et de produits. Chaque produit peut appartenir à une ou plusieurs ca- tégories, et chaque catégorie peut contenir de zéro à plusieurs sous-catégories sur un grand nombre de niveaux. Le formulaire de création de produits est divi- sé en 4 onglets : L?onglet Général permet d?entrer les informations principales du produit : nom, référence, fabricant, prix, description, etc. C?est également sur cet onglet que l?on sélectionnera les catégories dans lesquelles doit apparaître le produit. Il est possible de définir des prix sup- plémentaires via le menu Produits>Produit en cours>Ajouter un prix. Ces prix supplémentaires peuvent être utilisés pour vendre des produits dans plusieurs devises, pour différents groupes de clients ou dans le cas de tarifs dégressifs liés à laquantité.Lesparamètrescommelesfabricants et les taux de taxes sont configurables sur des pa- ges spécifiques. L?onglet Statut du produit permet de paramé- trer la disponibilité et les attributs du produit. Nous reviendrons sur les attributs dans un cha- pitre ultérieur. Le seul paramètre de disponibilité affectant réellement la possibilité de commander un pro- duit est le stock : la date de disponibilité ainsi que les autres champs ne sont qu?indicatifs. Pour empêcher la commande d?un produit pu- blié avant sa date de disponibilité, il est impéra- tif de paramétrer son stock à zéro et d?activer la prise en compte des stocks dans la configura- tion générale de VirtueMart. Les paramètres entrés dans l?onglet Dimen- sion et poids seront utilisés par les modules d?ex- pédition pour le calcul des frais de livraison. Cet onglet permet également de définir si un produit est téléchargeable. Dans ce cas, on Listing 1. Code du fichier ps_payline.php size="50" <?php echo (PRODUCTION)?' checked="checked"':''; ?> /> </td> <td>Décocher pour les phases de test, cocher lors de la mise en production</td> </tr> </table> <?php } function has_configuration() { return true; } function configfile_writeable() { return is_writeable( CLASSPATH."payment/". $this->classname.".cfg.php" ); } function configfile_readable() { return is_readable( CLASSPATH."payment/". $this->classname.".cfg.php" ); } function write_configuration( &$d ) { $my_config_array = array( "MERCHANT_ID" => $d['MERCHANT_ID'], "ACCESS_KEY" => $d['ACCESS_KEY'], "PAYLINE_CONTRACTNUMBER" => $d['PAYLINE_CONTRACTNUMBER'], "PRODUCTION" => $d['PRODUCTION']); $config = "<?php\n"; $config .= "defined('_VALID_MOS') or die('Direct Access to this location is not allowed.'); \n\n"; foreach( $my_config_array as $key => $value ) { $config .= "define ('$key', '$value');\n"; } $config .= "?".">"; if ($fp = fopen(CLASSPATH ."payment/". $this->classname.".cfg.php", "w")) { fputs($fp, $config, strlen($config)); fclose ($fp); return true; } else return false; }function process_payment($order_number, $order_total, &$d) { return true; } } ?> <?php defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' ); class ps_payline { var $classname = "ps_payline"; var $payment_code = "PL"; /** * Show all configuration parameters for this payment method * @returns boolean False when the Payment method has no configration */ function show_configuration() { /** Read current Configuration ***/ include_once(CLASSPATH ."payment/". $this->classname.".cfg.php"); ?> <table class="adminform"> <tr><td><strong>Payline Merchant ID</strong></td> <td> <input type="text" name="MERCHANT_ID" value="<?php echo MERCHANT_ID; ?>" /> </td> <td>L'identifiant commercant fournis par PAYLINE</td> </tr> <tr><td><strong>Payline Access Key</strong></td> <td> <input type="text" name="ACCESS_KEY" value="<?php echo ACCESS_KEY; ?>" /> </td> <td>La clef d'acces fournis par PAYLINE</td> </tr> <tr><td><strong>Payline Contract Number</strong></td> <td> <input type="text" name="PAYLINE_CONTRACTNUMBER" value="<?php echo PAYLINE_CONTRACTNUMBER; ?>" /> </td> <td>Le code ou numéro de contrat représentant le moyen de paiement utilisé</td> </tr> <tr><td><strong>Production</strong></td> <td> <input type="checkbox" name="PRODUCTION" value="1" 2/2008 Dossier 4 ?????????? peut au choix envoyer directement un fichier, soit simplement préciser son nom, auquel cas il faudra l?envoyer séparément, par exemple par FTP. Cette solution est surtout destinée aux fi- chiers volumineux. L?onglet Image permet d?associer une image et une vignette au produit, à partir d?un fichier ou d?une url. Cette image sera l?image princi- pale du produit, affichée par défaut sur sa fiche dans la boutique. Pour ajouter des images supplémentaires, il faut utiliser le menu Produits>Gestionnaire de fichiers>Ajouter Image/Fichier. Cette méthode permet également de joindre d?autre types de fichiers au produit, par exemple une fiche tech- nique au format pdf. L?onglet Produits complémentaires permet de sélectionner d?autres produits, qui seront suggérés à l?utilisateur navigant sur la fiche du produit. Les principes d'attributs de produits Les attributs permettent de définir de manière simple des déclinaisons de produits. Il existe trois types d?attributs. Deux sont ac- cessibles directement depuis l?onglet Statut de la fiche produit, tandis que le dernier nécessite de passer par la page Ajouter un attribut. Les attributs définis dans le champ Liste des attributs personnalisés de l?onglet Statut apparaissent sur la boutique sous la forme de champs textuels, permettant au client d?en- trer une valeur de son choix. Ces attributs sont utiles pour des produits personnalisables, par exemple pour un vêtement sur lequel le client pourra faire imprimer un texte de son choix. A l?inverse, les attributs définis dans le champ Liste des attributs de l?onglet Statut per- mettent un contrôle strict des valeurs entrées, puisque le choix des différentes valeurs sera offert à l?utilisateur sous forme de menu dé- roulant. Les attributs sont entrés à la suite les uns des autres dans une zone de texte, sous la forme Attribut,Valeur1,Valeur2 ;. À chaque valeur d?un attribut peut être attri- buée une modification du prix de base du pro- duit, en suivant cette valeur de crochets [] en- tre lesquels est inscrits un signe +, - ou = selon que la valeur augmente, diminue ou remplace le prix de base du produit, puis la somme con- cernée par la modification. Par exemple, pour une chemise on pourra dé- finir des attributs comme suit : Taille,XL[+2],L[+1],M,S[-1.5]; Couleur,Rouge,Vert,Jaune; Le client pourra alors sélectionner la taille et la couleur de sa chemise au moment de la commander, et à sa facture seront ajoutés 1 ou 2 euros ou enlevés 1.5 euros selon la taille choisie. Cependant, ces déclinaisons ne sont considé- rées que comme un seul et même produit, et il est notamment impossible de gérer des stocks séparés de cette manière. Un autre défaut de cette méthode réside dans le fait qu?un utili- sateur peut choisir indépendamment la valeur des différents attributs : si une couleur de che- mise n?existe que certaines tailles, rien n?em- pêche l?utilisateur de passer une commande Listing 2. Première partie du processus de paiement $array['order']['date'] = date('d/m/Y H:i'); $array['order']['currency'] = '978'; // PRIVATE DATA (optional) $privateData = array(); $privateData['key'] = 'order_id'; $privateData['value'] = $db->f("order_id"); $payline->setPrivate($privateData); // TRANSACTION OPTIONS // L?url du fichier qui recevra la notification de payline. $array['notificationURL'] = SECUREURL .'administrator/components/ com_virtuemart/notify_payline.php'; // L?url vers laquelle le client sera redirigé si le paiement // est réussi $array['returnURL'] = $mosConfig_live_site. '/index.php?page=account.index&option=com_virtuemart'; // L?url vers laquelle le client sera redirigé si le paiement // est annulé $array['cancelURL'] = $mosConfig_live_site.'/index.php?page= account.index&option=com_virtuemart'; $array['languageCode'] = 'fre/fra'; $array['securityMode'] = 'SSL'; $array['customPaymentPageCode'] = ''; // EXECUTE $result = $payline->do_webpayment($array); // RESPONSE if(isset($result) && $result['result']['code'] == '00000') { if ($page == "checkout.thankyou") { header("location:".$result['redirectURL']); exit(); } else { echo '<a href="'.$result['redirectURL'].'">Cliquez ici pour procéder au paiement de cette commande</a>'; } } ?> <?php global $mosConfig_absolute_path; // Inclusion de l?API Payline include $mosConfig_absolute_path."/administrator/components/ com_virtuemart/classes/payment/libpayline/paylineSDK.php"; $array = array(); $payline = new paylineSDK(); // PAYMENT $array['payment']['amount'] = $db->f("order_total")*100; // 978 est le code correspondent à un paiement en euros. // Si la boutique permet l?utilisation de différentes devises, // on pourra au choix remplacer les codes textuels de chaque // devise directement dans VirtueMart pour entrer les codes // numériques utilisés par Payline, ou utiliser une table // de conversion. $array['payment']['currency'] = '978'; // 101 correspond à un paiement réel. 100 correspond à une // demande d?autorisation, qui va poser chez la banque du client // une option valable 7 jours. $array['payment']['action'] = '101'; // CPT correspond à un paiement au comptant. Payline accepte DIF // pour un paiement différé, ou NX pour un paiement en N fois. $array['payment']['mode'] = 'CPT'; $array['payment']['differedActionDate'] = ''; // S?il y a plusieurs numéros de contrat, on prend le premier $array['payment']['contractNumber'] = (strpos( PAYLINE_CONTRACTNUMBER, ';')===false) ? PAYLINE_CONTRACTNUMBER : substr(PAYLINE_CONTRACTNUMBER, 0, strpos(PAYLINE_CONTRACTNUMBER, ';')); // CONTRACT NUMBERS // Chaque numéro de contrat représente un moyen de paiement // qui sera propose au client par Payline. $array['contracts'] = split(";", PAYLINE_CONTRACTNUMBER); // ORDER $array['order']['ref'] = $db->f("order_id"); $array['order']['amount'] = $db->f("order_total")*100; xxxxxxxxxxxxxxxxxxxx www.phpsolmag.org 5 ?????????? d?une combinaison taille/couleur inexistante. Pour une gestion un peu plus poussée des dé- clinaisons de produits, il faut utiliser les attri- buts avancés. Pour créer un attribut avancé, il faut utiliser l?icône Ajouter un attribut accessible lorsque l?on se trouve sur la fiche du produit, ou passer par le menu Produits>Produits en cours>Ajouter un attribut. Une fois que le produit possède tous les at- tributs voulus, l?icône ou le menu ajouter un élément permettent de créer des déclinaisons du produit. La création d?un élément se présente sous la même forme que la fiche produit. Seuls la réfé- rence et le nom sont obligatoires (le nom pou- vant être identique à celui du produit de base), les autres caractéristiques comme le prix ou la description étant automatiquement hérités du produit parent s?ils ne sont pas renseignés. Dans l?onglet Statut de l?élément, en plus des paramètres se trouvant sur la fiche produit, se trouve en bas de page un champ pour chacun des attributs, à remplir avec les valeurs de l?élé- ment en cours. Un élément sera ainsi créé pour chaque combinaison de valeurs. Contrairement aux attributs simples de l?onglet Statut du pro- duit, seules les combinaisons effectivement exis- tantes apparaîtront sur le site : si une couleur de chemise n?existe que dans certaines tailles, on ne crée des éléments que pour celles-ci. Un autre avantage de cette méthode est la possibilité de redéfinir toutes les caractéristiques du produit Listing 3. Code du fichier notify_payline.php } /*** END of Joomla config ***/ /*** VirtueMart part ***/ require_once($mosConfig_absolute_path. '/administrator/components/com_virtuemart/ virtuemart.cfg.php'); require_once( CLASSPATH. 'ps_main.php'); require_once( CLASSPATH. "language.class.php" ); require_once( CLASSPATH."Log/Log.php"); $vmLoggerConf = array('buffering' => true); /** * This Log Object will help us log messages and errors * See http://pear.php.net/package/Log * @global Log vmLogger */ $vmLogger = &vmLog::singleton('display', '', '', $vmLoggerConf, PEAR_LOG_TIP); $GLOBALS['vmLogger'] =& $vmLogger; require_once( CLASSPATH . 'phpmailer/class.phpmailer.php'); $mail = new vmPHPMailer(); $mail->PluginDir = CLASSPATH . 'phpmailer/'; $mail->SetLanguage("en", CLASSPATH . 'phpmailer/language/'); /* load the VirtueMart Language File */ if (file_exists( ADMINPATH. 'languages/'.$mosConfig_lang. '.php' )) require_once( ADMINPATH. 'languages/'. $mosConfig_lang.'.php' ); else require_once( ADMINPATH. 'languages/english.php' ); /* Load the Payline Configuration File */ require_once( CLASSPATH. 'payment/ps_payline.cfg.php' ); /* Load the VirtueMart database class */ require_once( CLASSPATH. 'ps_database.php' ); // restart session require_once( CLASSPATH."ps_session.php"); // Constructor initializes the session! $sess = new ps_session(); // Include globals; for this, $db is needed, as is htmlTools.class.php $db = new ps_DB; require_once( CLASSPATH. 'htmlTools.class.php' ); require_once( ADMINPATH. 'global.php' ); /*** END VirtueMart part ***/ // Inclusion de l?API Payline include $mosConfig_absolute_path."/administrator/ components/com_virtuemart/classes/payment/ libpayline/paylineSDK.php"; $payline = new paylineSDK(); $response = $payline->get_webPaymentDetails($token); <?php if(isset($_REQUEST['token'])) { $token = $_REQUEST['token']; define('_VALID_MOS', '1'); /*** access Joomla's configuration file ***/ $my_path = dirname(__FILE__); if( file_exists($my_path."/../../../configuration.php")) { require_once($my_path."/../../../configuration.php"); } elseif( file_exists($my_path."/../../configuration.php")) { require_once($my_path."/../../configuration.php"); } elseif( file_exists($my_path."/configuration.php")) { require_once( $my_path."/configuration.php" ); } else die( "Joomla Configuration File not found!" ); include_once( $my_path.'/compat.joomla1.5.php' ); if( class_exists( 'jconfig')) { define( '_JEXEC', 1 ); define('JPATH_BASE', $mosConfig_absolute_path ); require_once ( JPATH_BASE .'/includes/defines.php' ); require_once ( JPATH_BASE .'/includes/application.php' ); require_once ( JPATH_BASE. '/includes/database.php'); // create the mainframe object $mainframe = new JSite(); // set the configuration $mainframe->setConfiguration(JPATH_CONFIGURATION . DS . 'configuration.php'); // load system plugin group JPluginHelper::importPlugin( 'system' ); // trigger the onStart events $mainframe->triggerEvent( 'onBeforeStart' ); // create the session $mainframe->setSession( $mainframe->getCfg( 'live_site').$mainframe->getClientId() ); $database =& JFactory::getDBO(); } else { require_once($mosConfig_absolute_path. '/includes/ database.php'); $database = new database( $mosConfig_host, $mosConfig_user, $mosConfig_password, $mosConfig_db, $mosConfig_dbprefix ); } // load Joomla Language File if (file_exists( $mosConfig_absolute_path. '/language/' .$mosConfig_lang.'.php' )) { require_once( $mosConfig_absolute_path. '/language/'. $mosConfig_lang.'.php' ); } elseif (file_exists( $mosConfig_absolute_path. '/language/english.php' )) { require_once( $mosConfig_absolute_path. '/language/english.php' ); 2/2008 Dossier 6 ?????????? dans la fiche de chaque élément : on pourra ain- si avoir des descriptions, prix, images et stocks indépendants pour chaque combinaison de va- leurs d?attributs. Par la suite, les différentes déclinaisons d?un produit sont accessibles en bas de l?onglet Sta- tut de la fiche produit, ou directement depuis le lien Informations de l?élément se trouvant à côté du nom du produit. Les types de produits Les types de produits permettent de définir des paramètres communs à tous les produits de ce type, chaque paramètre ayant une valeur spécifique pour chaque produit. La gestion des types de produits est accessible depuis le menu Produit>Type produit. Sil?onprendl?exempled?uneboutiquedemu- sique, on va créer un type de produit CD Audio. À ce type produit, on va associer les paramètres Artiste, Année, Genre et Nombre de pistes. Par la suite, à chaque fois que l?on va définir le type à un produit, un onglet supplémentaire intitulé CD Audio sera accessible sur sa fiche, dans lequel il sera possible d?entrer une valeur pour chacun de ces paramètres. Les types et les paramètres sont principale- ment utiles pour définir les caractéristiques techniques d?un produit. Configuration des principes d'expédition VirtueMart gère l?expédition sous forme de modules, permettant ainsi de définir des règles d?expédition adaptées au site. Plusieurs modu- les sont inclus dans l?installation standard de VirtueMart. Le module standard Le module le plus intéressant est le module stan- dard, qui permet d?utiliser des transporteurs et taux d?expédition saisis dans VirtueMart. Le menu Expéditions donne accès à la gestion des expéditeurs et des taux d?expédition. Au moins un expéditeur est requis pour pouvoir créer des taux d?expédition. Un taux sera applicable à une commande en fonction d?une fourchette de poids et de la destination (par pays et code postal) de la com- mande. Si plusieurs taux sont applicables à une commande donnée, l?utilisateur se verra propo- ser le choix entre les différents taux. La souplesse de ce module en fait la solution adaptée à la plupart des sites d?e-commerce. Les modules simples Trois modules permettent de gérer facilement les tarifs d?expédition plus simplement que le modulestandard:LemoduleFlexpermetdedé- finiruntarifminimaldelivraisonvalablejusqu?à uncertainmontant,àpartirduquelonajouteun pourcentage du total de la commande. Shipvalue permet de configurer des taux fixes fonctionnant par tranche du total de la commande. Enfin, le module Zone Shipping permet de configurer des taux par zones géo- graphiques, qui peuvent correspondre à un ou plusieurs pays. Les modules spécifiques Les autres modules correspondent à des trans- porteurs spécifiques. Par exemple le module UPS, une fois configuré avec les identifiants d?un compte UPS, ira chercher sur le webservice d?UPS le tarif en fonction des caractéristiques (poids, volume, destination) de la commande. Intégrer des évolutions L'un des points clés dans l'intégration de solu- tions Open Source réside dans la capacité de pa- ramétrer, adapter ou créer des extensions et des modules qui viennent compléter l'offre fonc- tionnelle de Joomla et donc de VirtueMart. Intégration d'un système de paiement comme payline VirtueMart gère le paiement via un système de modules, un peu semblables à ceux utilisés pour l?expédition. La gestion des modules de paiement se trouve dans le menu Boutique. Un module de paiement doit faire partie de l?un des cinq types suivants : ? Carte de Crédit permet d?enregistrer les coordonnées de carte de crédit du client en vue d?un traitement manuel extérieur, ? Terminal de paiement permet au client de saisir ses coordonnées bancaires sur le site, qui fera appel à un terminal de paiement avant que la commande ne soit placée, ? Virement bancaire demande au client ses coordonnées bancaires, en vue d?un traite- ment manuel, ? Adresse Seulement / Paiement à la livraison est utilisé dans le cas d?un traitement en- tièrement manuel du paiement, dans le- quel VirtueMart n?intervient pas, ? Paypal ou assimilés effectue une redirection de l?utilisateur vers un serveur de paiement après le placement de la commande. Des modules sont disponibles pour quelques systèmes de paiement, mais s?il n?en existe pas pour votre système il va souvent falloir en déve- lopper un nouveau. Nous vous expliquons dans les lignes qui suivent comment créer un modu- le spécifique à votre terminal de paiement. Création d'un module de type Paypal ou assimilé Le but d?un module de ce type est de rediriger le client vers une page appartenant au prestataire de votre méthode de paiement, afin que le site Listing 3. Code du fichier notify_payline.php - suite if (isset($response)) { foreach($response['privateDataList'] as $privateData) { if ($privateData['key'] == 'order_id') $order_id = $privateData['value']; } // TRANSACTION EFFECTUEE if ($response['result']['code']=='00000') { $q = "UPDATE #__{vm}_orders "; $q .= "SET order_status='C', mdate='".time()."' "; $q .= "WHERE order_id='".$order_id."'"; $db->setQuery($q); $db->query(); $q = "UPDATE #__{vm}_order_payment "; $q .= "SET order_payment_log = CONCAT(order_payment_log, '".date(' d/m/Y H:i:s').' - Paiement effectué<br />Identifiant de transaction: '.$response['transaction']['id']."<br /><br />') "; $q .= "WHERE order_id='".$order_id."'"; $db->setQuery($q); $db->query(); } // ANNULATION else { $q = "UPDATE #__{vm}_orders "; $q .= "SET order_status='X', mdate='".time()."' "; $q .= "WHERE order_id='".$order_id."'"; $db->setQuery($q); $db->query(); } } } xxxxxxxxxxxxxxxxxxxx www.phpsolmag.org 7 ?????????? Listing 4. Code du fichier ps_payline.php if (PL_VERIFIED_STATUS == $order_status_code[$i]) echo "\" selected=\"selected\">"; else echo "\">"; echo $order_status_name[$i] . "</option>\n"; }?> </select> </td> <td>Sélectionnez le statut auquel la transaction sera initialisée si le paiment est effectué avec succès. </td> </tr> <tr><td><strong>Cryptogramme</strong></td> <td> <input type="checkbox" name="PL_CHECK_CARD_CODE" value="YES" size="50" <?php echo ( PL_CHECK_CARD_CODE)?'checked="checked"':''; ?> /> </td> <td>Cocher si le client doit entrer le cryptogramme visuel situé au dos de sa carte bancaire</td> </tr> <tr><td><strong>Production</strong></td> <td> <input type="checkbox" name="PRODUCTION" value="1" size="50" <?php echo (PRODUCTION)?'checked= "checked"':''; ?> /> </td> <td>Décocher pour les phases de test, cocher lors de la mise en production</td> </tr> </table> <?php } function has_configuration() { return true; } function configfile_writeable() { return is_writeable( CLASSPATH."payment/". $this->classname.".cfg.php" ); } function configfile_readable() { return is_readable( CLASSPATH."payment/". $this->classname.".cfg.php" ); } function write_configuration( &$d ) { $my_config_array = array( "MERCHANT_ID" => $d['MERCHANT_ID'], "ACCESS_KEY" => $d['ACCESS_KEY'], "PAYLINE_CONTRACTNUMBER" => $d[ 'PAYLINE_CONTRACTNUMBER'], "PRODUCTION" => $d['PRODUCTION'], "PL_VERIFIED_STATUS" => $d['PL_VERIFIED_STATUS'], "PL_CHECK_CARD_CODE" => $d['PL_CHECK_CARD_CODE'] ); $config = "<?php\n"; $config .= "defined('_VALID_MOS') or die('Direct Access to this location is not allowed.'); \n\n"; foreach( $my_config_array as $key => $value ) { $config .= "define ('$key', '$value');\n"; } <?php defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' ); class ps_payline { var $classname = "ps_payline"; var $payment_code = "PL"; /** * Show all configuration parameters for this payment method * @returns boolean False when the Payment method has no * configration */ function show_configuration() { $db =& new ps_DB; /** Read current Configuration ***/ include_once(CLASSPATH ."payment/". $this->classname.".cfg.php"); ?> <table class="adminform"> <tr><td><strong>Payline Merchant ID</strong></td> <td> <input type="text" name="MERCHANT_ID" value="<?php echo MERCHANT_ID; ?>" /> </td> <td>L'identifiant commercant fournis par PAYLINE</td> </tr> <tr><td><strong>Payline Access Key</strong></td> <td> <input type="text" name="ACCESS_KEY" value="<?php echo ACCESS_KEY; ?>" /> </td> <td>La clef d'acces fournis par PAYLINE</td> </tr> <tr><td><strong>Payline Contract Number</strong></td> <td> <input type="text" name="PAYLINE_CONTRACTNUMBER" value="<?php echo PAYLINE_CONTRACTNUMBER; ?>" /> </td> <td>Le code ou numéro de contrat représentant le moyen de paiement utilisé</td> </tr> <tr><td><strong>Statut de la commande en cas de transaction réussie</strong></td> <td> <select name="PL_VERIFIED_STATUS"> <?php $q = "SELECT order_status_name,order_status_code FROM #__{vm}_order_status ORDER BY list_order"; $db->query($q); $order_status_code = Array(); $order_status_name = Array(); while ($db->next_record()) { $order_status_code[] = $db->f( "order_status_code"); $order_status_name[] = $db->f( "order_status_name"); } for ($i = 0; $i < sizeof($order_status_code); $i++) { echo "<option value=\"" . $order_status_code[$i]; 2/2008 Dossier 8 ?????????? n?ait jamais à gérer les coordonnées bancaires du client. Dès que la commande est validée, le site redirige le client vers une page de paiement externe. Une fois le paiement effectué, il est re- dirigéverslesiteetleserveurdusystèmedepaie- ment contacte une page spécifique du site qui se chargera de mettre à jour l?état de la commande. Pour notre exemple, nous allons développer un module destiné au système de paiement Payline. Le développement de ce module va nécessiter la création de deux fichiers php dans le dossier administrator/components/com_ virtuemart/classes/payment/ : ? ps_payline.php contiendra la classe princi- pale du module. C?est dans ce fichier que sont gérées les paramètres de configura- tion spécifiques à cette solution de paie- ment, mais pas le processus de paiement en lui-même, ? ps_payline.cfg.php contiendra les paramè- tres de configuration. Il doit exister, mais son contenu sera généré automatiquement à partir de VirtueMart. Ce fichier contiendra quatre paramètres né- cessaires à Payline : ? MERCHANT _ ID : l?identifiant du compte Payline, ? ACCESS _ KEY : la clef d?accès au compte Payline, ? PAYLINE _ CONTRACTNUMBER : le numéro de contrat associé au compte Payline, ? PRODUCTION : cette constante est utilisée par l?API de Payline pour déterminer si'il faut utiliser le webservice de paiement réel ou le webservice de test. Le fichier ps_payline.php comprend une clas- se ps _ payline qui comprend deux attributs : $classname contient le nom de la classe, et $payment _ code un code unique à ce modu- le de paiement. La classe ps_payline doit posséder les mé- thodes suivantes : ? show _ configuration() : Cette méthode affiche le formulaire de configuration du module qui apparaîtra en haut de l?onglet Configuration du module de paiement. On inclus le fichier de configuration pour pouvoir préremplir les champs, ? has _ configuration() : Cette méthode re- tourne true si le module peut être configu- ré, ce qui est le cas, ? configfile _ writeable() : Vérifie si le fi- chier de configuration est accessible en écriture, ? configfile _ readable() : Vérifie si le fi- chier de configuration est accessible en lec- ture, ? write _ configuration() : Ecrit le fichier de configuration, ? process _ payment($order _ number, $order _ total, &$d) : Cette méthode est effectue le paiement dans le cadre d?un module utilisant un terminal de paie- ment, et retourne true si le paiement s?est bien passé, false sinon. Dans notre cas, on retourne simplement true. Regardez le Listing 1. Le processus de paiement en lui-même sera di- visé en deux parties : ? la première partie se chargera de préparer le paiement, en contactant le webservice de Payline qui retournera l?url vers laquel- le devra être redirigé le client. Ce code sera placé directement dans le champ Payment Extra Info de l?onglet Configuration du mo- dule, ? la seconde partie est le fichier qui sera ap- pelé par Payline pour notifier l?exécution d?un paiement. Il s?agit du fichier notify_ payline.php placé dans le dossier racine de VirtueMart. Payline fournit une API basée sur SOAP dont nous n?allons pas détailler le fonction- nement. Cette API se trouve dans le fichier Listing 4. Code du fichier ps_payline.php - suite $config .= "?".">"; if ($fp = fopen(CLASSPATH ."payment/".$this->classname.".cfg.php", "w")) { fputs($fp, $config, strlen($config)); fclose ($fp); return true; } else return false; } function process_payment($order_number, $order_total, &$d) { include_once(CLASSPATH ."payment/".$this->classname.".cfg.php"); global $mosConfig_absolute_path, $mosConfig_live_site; include $mosConfig_absolute_path."/administrator/components/com_virtuemart/ classes/payment/libpayline/paylineSDK.php"; $array = array(); $payline = new paylineSDK(); // PAYMENT $array['payment']['amount'] = $order_total*100; $array['payment']['currency'] = '978'; $array['payment']['action'] = '101'; $array['payment']['mode'] = 'CPT'; $array['payment']['differedActionDate'] = ''; $array['payment']['contractNumber'] = PAYLINE_CONTRACTNUMBER; //CARD $array['card']['number'] = $_SESSION['ccdata']['order_payment_number']; $array['card']['type'] = (in_array($_SESSION['ccdata']['creditcard_code'], array('VISA', 'MC')))? 'CB' : $_SESSION['ccdata']['creditcard_code']; $array['card']['expirationDate'] = $_SESSION['ccdata'][ 'order_payment_expire_month'].substr($_SESSION['ccdata'][ 'order_payment_expire_year'],2,2); $array['card']['cvx'] = $_SESSION['ccdata']['credit_card_code']; // ORDER $array['order']['ref'] = $order_number; $array['order']['amount'] = $order_total*100; $array['order']['date'] = date('d/m/Y H:i'); $array['order']['currency'] = '978'; // EXECUTE $result = $payline->do_authorization($array); // RESPONSE if(isset($result) && $result['result']['code'] == '00000') { return true; } else{ print_r($result);die; return false; } } } ?> xxxxxxxxxxxxxxxxxxxx www.phpsolmag.org 9 ?????????? paylineSDK.php que nous avons placé dans le dossier administrator/components/com_ virtuemart/classes/payment/libpayline/. Dans ce fichier, nous avons simplement modifié deux ligne dans le constructeur de la classe payli- neSDK pour prendre en compte les constan- tes initialisées dans le fichier de configuration du module : $this->header_soap['login'] = $this->login = MERCHANT_ID; $this->header_soap['password'] = $this-> password = ACCESS_KEY; L?objet $db nous permet d?accéder directe- ment aux informations de la commande, via la méthode f(). Par exemple, $db->f("order _ id") représente l?identifiant de la commande. On prépare un tableau $array contenant les informationsàenvoyerauwebservice,etl?onré- cupère la réponse dans un tableau $result via la ligne $payline->do_webpayment($array) ;. Deux données importantes sont : ? $array['notificationURL'], qui contient l?url à laquelle le serveur de payline devra se connecter pour informer la boutique de l?exécution du paiement, ? $privateData contient l?identifiant de la commande. Ce paramètre nous sera re- tourné lors de la notification, et servira à identifier la commande correspondant au paiement concerné. Le webservice de Payline retourne un code 00000 si le paiement est prêt à être effectué : si ce n?est pas le cas, on prendra soin de notifier un message d?erreur à l?utilisateur. Avant de rediriger l?utilisateur, on regarde sur quelle page on se trouve : en effet, si un paiement s?est mal passé, ce code sera exécuté a nouveau lorsque l?utilisateur consultera sa commande. Dans ce cas, on affiche un lien au lieu de faire une redirection automatique (Listing 2). Le fichier notify_payline.php représente la fin du processus de paiement. Une fois que le paiement a été effectué ou annulé par le client, ce fichier est appelé par le serveur de Payline avec un paramètre token que l?on récupère via $_REQUEST['token']. Ce token est associé à une transaction de paiement, et sera utilisé passé en paramètre de la fonction get_webPaymentDetails(), qui va demander au webservice de Payline les détails de la transaction. La première partie du fichier correspond à l?initialisation de l?environnement de Joomla! et VirtueMart. Le point qui nous intéresse plus particulièrement est l?accès à la base de données. On commence par récupérer l?identifiant de la commande dans les privateData retournées par le webservice de Payline. Si le webservice re- tourne un code 00000, alors le paiement a bien été effectué. Dans ce cas, on passe le statut de la commande à C (Confirmée) et on met à jour le log de paiement. Si ce n?est pas le cas, on considère que le paie- ment a été annulé, et on passe le statut de la commande à X (Annulée). On aurait également pu ne faire ce traite- ment que si le message de retour correspondait effectivement à une annulation, et laisser la commande au statut P (En attente) dans le cas d?un problème technique, pour permettre au client de réessayer plus tard (Listing 3). Création d'un module de type Terminal de Paiement Le processus associé à un module de type Termi- nal de paiement est moins complexe que le pré- cédent : ici, VirtueMart va demander au client ses informations de carte bancaire, et le module va les utiliser pour effectuer le paiement direc- tement sur le webservice de Payline. Le processus de paiement se déroule cette fois entièrement dans la fonction process_ payment() de la classe ps_payline. Le champ Payment extra info de l?onglet de configuration du module restera donc vide. Cette fonction accepte trois paramètres : ? $order _ number est un hash qui servira à identifier de manière unique la comman- de. Le paiement par terminal se déroulant avant le placement de la commande, l?id de la commande n?est pas encore détermi- né. C?est donc cette valeur que nous allons envoyer à Payline en tant que numéro de commande, ? $order _ total est le montant total de la commande, ? $d est une variable de type tableau utili- sée par VirtueMart pour stocker un cer- tain nombre d?information concernant l?utilisateur, la session et la page en cours. Ici, la seule information susceptible nous intéressant est le montant de la comman- de, mais puisque nous l?avons déjà dans $order _ total, nous ne l?utiliserons pas. Les informations de carte bancaire de l?utilisa- teur se trouvent en session, plus précisément dans $ _ SESSION['ccdata']. Le webservice de Payline représentant les cartes Visa et MasterCard de la même maniè- re avec le code CB, nous remplaçons les codes VISA et MC par celui-ci. Une autre solution aurait été de créer dans VirtueMart un type de carte Visa ? MasterCard, et de sélectionner ce type dans la configuration du module à la place de ceux existants. La date d?expiration de la carte est envoyée à Payline sous le format mmyy, c?est pourquoi nous utilisons la fonction substr() pour récu- pérer les deux derniers chiffres de l?année. Nous renvoyons true si le webservice renvoie un code 00000 signifiant que le paiement s?est bien déroulé, false sinon. (voir Listing 4). Nous avons ajouté deux champs au formu- laire de configuration du module : ? une case à cocher PL _ CHECK _ CARD _ CODE : Le nom de cette constante doit obli- gatoirement être préfixé à la valeur de l?at- tribut $payment _ code de la classe, suivi de _ CHECK _ CARD _ CODE et _ VERIFIED _ STATUS. PL _ CHECK _ CARD _ CODE doit être initialisée à YES pour que VirtueMart af- fiche le champ demandant à l?utilisateur d?entrer le code de sécurité se trouvant au dos de sa carte bancaire, qui est nécessaire pour que le webservice de Payline accepte le paiement. Ce paramètre étant destiné à n?être jamais désactivé, nous aurions pu choisir un champ de type hidden à la place de la case à cocher, ? un menu déroulant PL _ VERIFIED _ STATUS : PL _ VERIFIED _ STATUS corres- pond au statut auquel VirtueMart initiali- sera la commande si la fonction process _ payment() renvoie true, donc si le paie- ment s?est bien déroulé. Dans la plupart des cas, il s?agira du statut C (Confirmée). Conclusion Nous vous avons fait découvrir ici quelques as- tuces de fonctionnement de VirtueMart. Ces informations ne peuvent bien sûr être exhaus- tives, et nous vous recommandons de vous ap- puyer sur le large travail de pédagogie mené par la communauté vous proposant des tutoriels, des forums et des outils de paramétrage. Les solutions Joomla et VirtueMart ne ces- sent également d'évoluer, portées par la com- munauté, et vos questions qui ne trouveraient pas aujourd'hui de réponse autrement que parmi les outils de la communauté peuvent ra- pidement être résolues. RONAN LEROY Expert PHP au sein de la société Core-Techs, l'auteur intervient régulièrement auprès de nombreux clients pour des missions de développement de sites Internet, de plate-forme d'ecommerce ou de solu- tions de Gestion de la Relation Client. Il utilise quo- tidiennement les solutions Joomla, eZpublish, Dru- pal et SugarCRM. Sur Internet ? www.joomla.org ? Le site officiel de Joomla, ? www.joomlafrance.org ? Le site officiel de Joomla France, ? www.joomlafacile.org ? La sourca d'un nombre important d'informations sur l'utilisation de Joomla destinées à vous fournir le support nécessaire à sa mise en oeuvre facile.

PARTAGER SUR

Envoyer le lien par email
2163
READS
47
DOWN
8
FOLLOW
2
EMBED
DOCUMENT # TAGS
#joomla  #virtuemart  #e-commerce 

CC BY-ND


DOCUMENT # INDEX
e-commerce 
img

Partagé par  lucio

 Suivre

Auteur:phpsolutions
Source:Non communiquée