La version 1.7 de prestashop introduit des changements dans la création des modules de paiement.
De mon point de vue cela simplifie vraiment la création de modules de paiement qui deviennent faciles et rapides à coder 🙂
C’est parti pour voir cela en détails et en exemple via la création d’un module de paiement hhPayment.
use PrestaShop\PrestaShop\Core\Payment\PaymentOption; if (!defined('_PS_VERSION_')) { exit; } class HhPayment extends PaymentModule { public function __construct() { $this->author = 'hhennes'; $this->name = 'hhpayment'; $this->tab = 'payment_gateways'; $this->version = '0.1.0'; $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('HH Payment'); $this->description = $this->l('HH sample Payment for PS 1.7'); } public function install() { if (!parent::install() || !$this->registerHook('paymentOptions') || !$this->registerHook('paymentReturn') ) { return false; } return true; } } |
Comme vous pouvez le voir ci-dessus, le module doit toujours étendre la classe PaymentModule mais vous noterez également l’utilisation de la classe PaymentOption.
Ansi que du nouveau hook paymentOptions.
C’est dans celui-ci que se situe toute la nouveauté !
La classe PaymentOption vous permets de gérer facilement l’affichage et les actions de votre module en quelques lignes.
Le tunnel de commande a été entièrement revu dans cette version 1.7 de prestashop ( inpiré de magento 1 au passage ^^ ) , c’est plus cadré et plus propre
Voici un aperçu de l’affichage d’une méthode, ainsi que des différentes zones dans le template par défaut.
Le template utilisé étant situé dans /themes/classic/checkout/_partials/steps/payment.tpl
Voici la liste des méthodes utiles sur cette classe et leur utilisation
- setCallToActionText : Défini le texte de la méthode de paiement (1) / Obligatoire
- setAdditionalInformation : Défini les informations additionnelles de la méthode (3) / Optionnel
- setLogo : Défini le logo de la méthode (2) / Optionnel
- setAction : Défini le controller à appeler pour valider le paiement (Non visible ) / Obligatoire sauf si utilisation de setForm
- setInputs : Permets d’ajouter des champs de formulaires, idéalement de type hidden (4) / Optionnel
- setForm : Permets d’utiliser un formulaire spécifique au module, si utilisé , les fonctions setInputs et setAction n’ont aucun effet ( ) / Optionnel
- setModuleName : Nom du module ( Non visible ) / Obligatoire
- setBinary : Défini si le module utilise un binaire pour générer le formulaire, c’est le cas pour atos par exemple, dans ce cas il faut également greffer votre module sur le hook displayPaymentByBinaries / Optionnel
Exemples :
voici comment créer une option de paiement de type « Chèque »
$standardPayment = new PaymentOption(); //Inputs supplémentaires (utilisé idéalement pour des champs cachés ) $inputs = [ [ 'name' => 'custom_hidden_value', 'type' => 'hidden', 'value' => '30' ], [ 'name' => 'id_customer', 'type' => 'hidden', 'value' => $this->context->customer->id, ], ]; $standardPayment->setModuleName($this->name) //Logo de paiement ->setLogo($this->context->link->getBaseLink().'/modules/hhpayment/views/img/logo.png') ->setInputs($inputs) //->setBinary() Utilisé si une éxécution de binaire est nécessaires ( module atos par ex ) //Texte de description ->setCallToActionText($this->l('Payment in x days')) ->setAction($this->context->link->getModuleLink($this->name, 'validation', array(), true)) //Texte informatif supplémentaire ->setAdditionalInformation($this->fetch('module:hhpayment/views/templates/hook/displayPayment.tpl')); |
Avec le contenu suivant dans le tpl par exemple
<div class="row"> <div class="col-xs-12 col-md-12"> <p class="payment-module-description"> {l s='Your order will be automaticaly payed with your account.' mod='hhpayment'} </p> </div> </div> |
Un autre exemple de type « CB » qui renvoie l’utilisateur vers une api externe.
//Variables pour paiement API //Variables pour paiement API $this->smarty->assign( [ 'payment_url' => Configuration::get('PAYMENT_API_URL'), 'success_url' => Configuration::get('PAYMENT_API_URL_SUCESS'), 'error_url' => Configuration::get('PAYMENT_API_URL_ERROR'), 'id_cart' => $this->context->cart->id, 'cart_total' => $this->context->cart->getOrderTotal(true, Cart::BOTH), 'id_customer' => $this->context->cart->id_customer, ] ); $apiPayement = new PaymentOption(); $apiPayement->setModuleName($this->name) ->setCallToActionText($this->l('HH Sample payement module (like CB )')) //Définition d'un formulaire personnalisé ->setForm($this->fetch('module:hhpayment/views/templates/hook/payment_api_form.tpl')) ->setAdditionalInformation($this->fetch('module:hhpayment/views/templates/hook/displayPayment.tpl')); |
Avec le contenu suivant pour le formulaire :
<form method="post" action="{$payment_url}"> <div class="form-group"> {* choix du mode de carte *} {l s='please choose your card type' mod='hhpayment'} <div class="radio"> <label> <input type="radio" name="cb_type" value="mastercard" id="cb_type1" checked="checked" /> Mastercard </label> </div> <div class="radio"> <label> <input type="radio" name="cb_type" id="cb_type2" value="visa"/> Visa </label> </div> <div class="radio"> <label> <input type="radio" name="cb_type" id="cb_type3" value="cb"/> CB </label> </div> </div> {* Informations pour l'api *} <input type="hidden" name="success_url" value="{$success_url}" /> <input type="hidden" name="error_url" value="{$error_url}" /> <input type="hidden" name="id_cart" value="{$id_cart}" /> <input type="hidden" name="cart_total" value="{$cart_total}" /> <input type="hidden" name="id_customer" value="{$id_customer}" /> </form> |
L’affichage du message de retour reste toujours géré via le hook paymentReturn.
/** * Affichage du message de confirmation de la commande * @param type $params * @return type */ public function hookDisplayPaymentReturn($params) { if (!$this->active) { return; } $this->smarty->assign( $this->getTemplateVars() ); return $this->fetch('module:hhpayment/views/templates/hook/payment_return.tpl'); } |
Pour voir le code de démo complet vous pouvez télécharger mon module de démo, qui inclue les différents tps ainsi qu’une configuration basique dans l’administration.
Nous avons à présent fait le tour du fonctionnement des modules de paiement sur Prestashop 1.7 🙂
novembre 8th, 2017
tres bon tuto !!! un tuto sur le paiement avec api externe via un liens serais la bien venu
janvier 17th, 2018
Bonjour j’utilise le tuto pour créer un module de payement API externe
quand je parametre l’url return succes de payement ça marche sur mon API mais ça ne valide pas la commande dans la zone admin
janvier 17th, 2018
Bonjour,
Est-ce que vous changez bien le statut de la commande en « paiement effectué » dans la page de retour ?
Cordialement,
Hervé
janvier 21st, 2018
OUI
dans la configuration
je suis en local actuelement pour les test
mais j’attaque un api en ligne
Payment api url :
http://www.djepay.com/web/lienpayement
Payment api success url:
http://www.djepay.com/web/lienpayementeffect
Payment api error url
http://www.djepay.com/web/lienpayementERREUR
janvier 21st, 2018
le statut « paiement effectué » ce change ou????
janvier 21st, 2018
Vous pouvez le voir dans le fichier controller/front/api.php de l’archive du module.
La fonction validateOrder permet de définir le statut et les informations de la commande.
Les détails de la fonction sont visibles ici : https://github.com/PrestaShop/PrestaShop/blob/develop/classes/PaymentModule.php#L196
janvier 21st, 2018
Bjr est-ce que je peux avoir la procedure d’utilisation de l’archive du module
j’ai vu controller/front/api.php
mais je vois pas PayementModule.php dans le module
voila la fonction validator dans le controlleur api.php
validateOrder((int)$cart->id, Configuration::get(‘PS_OS_PAYMENT’), $total, $this->module->displayName, null, array(), (int)$currency->id, false, $customer->secure_key);
===Comment le modifier====
pour le « payement en x days » j’ai la confirmation dans la zone admin
mais le payement a distance xa marche toujours pas
Besoin d’aide
janvier 22nd, 2018
Bonjour,
Pour plus de clarté J’ai regroupé vos différents commentaires.
Le code fourni ne se charge que de mettre à jour le statut de la commande dans prestashop.
Concernant la remontée de l’information et son renvoi depuis son api, tout dépends de celle-ci. Je ne peux donc malheureusement pas vous fournir plus d’informations.
Cordialement,
Hervé
janvier 23rd, 2018
ok merci
très bon tuto!
marci pour l’astus je m’y mais c’est sur que ça va marcher
janvier 24th, 2018
Bonjour ça marche bien le module!!!!!
j’ai appelé le controller Validation du module depuis mon Api comme ceux-ci
http://www…….ci/fr/module/hhpayment/validation
Merci encore pour tous
avril 24th, 2018
Bonjour, bonsoir Comment puis-je changer l’email qui est envoyé quand le paiement est effectué?, C’est-à-dire, quand j’effectue le paiement, j’envoie le paiement accepté, je veux le changer pour l’email en attente
avril 24th, 2018
Bonjour,
Il faudrait changer le statut par défaut le commande lors de l’appel de la fonction validateOrder
Ou sinon changer le wording de vos emails.
Cordialement,
Hervé
juillet 18th, 2018
Bonjour, j’ai suivi votre tuto et c’est cool.
j’ai un soucis. le API externe que j’ai de ma banque demande l’envoie des informations en XML.
cela m’amène à modifier le formulaire pour prendre receuillir les données de la CB du client et envoyer.
Je suis bloqué. comment renseigner ces informations en XML et l’envoyer POST au paiement_Api_Url?
Merci de me donner des pistes.
juillet 20th, 2018
Bonjour Victor,
C’est dans le controlleur de votre module de paiement, ( celui défini via la méthode setAction() ) qu’il faudra implémenter cette logique.
En soi elle n’a rien à voir de particulier avec prestashop, vous pouvez tester la solution suivante pour l’envoyer
https://stackoverflow.com/questions/15679090/send-an-xml-post-request-to-a-web-server-with-curl
Cordialement,
Hervé
juillet 20th, 2018
Bonjour Hervé,
Merci pour cet article qui m’a mis le pied à l’étrier. J’ai réalisé un module de paiement administratif. J’ai écrit un article sur le sujet en vous citant sur un de mes blogs (http://codaholic.sillo.org) et je fournis le module pour ceux que ça intéresse.
juillet 20th, 2018
Bonjour Maurice,
Merci pour la citation, j’ai lu votre article qui est bien plus détaillé que celui-ci effectivement.
Je ne suis pas allé aussi loin que vous dans mes explications.
Cordialement,
Hervé
juillet 25th, 2018
Merci pour votre réponse. En prenant pour model votre module de paiement j’ai pas retrouvé setAction(). Je ne maitrice pas trop tous les fichiers prestashop. Pouvez vous m’orienter SVP?
Merci
juillet 26th, 2018
Téléchargez l’archive avec les exemples et essayez de l’adapter.
Ceci devrait vous donner une base pour votre développement.
octobre 13th, 2018
bonjour
je trouve très utile et intéressant comme script j’ai installer le module et sa marche top !
mais je tente de faire une modification de proposer seulement le paiement par carte de crédit et d’envoyer la commande vers la platforme VAD de ma banque (banque et carte algérienne)
comment faire? disons que
la page de paiement de la banque: http://www.bdl.dz
et le nom de la carte CIB bleu et CIB gold
merci d’avance
octobre 13th, 2018
bonjour
j’ai reussi a opté seulement pour le paiement en CB
j’ai meme modifier le nom des carte en CIB BLEU ET GOLD sur le fichier :
payment_api_form
voir exemple :
{l s=’veuillez choisir votre type de carte de crédit’ mod=’hhpayment’}
CIB BLEU
CIB GOLD
mais sur la page de paiement sur prestashop , j’ai toujours un message en anglai:
Your will be redirected to payment api to confirm your order
et les carte reste 3:
visa, mastercard et cb
alors que je désire proposer que deux carte cib bleu et cib gold
que faire cher Monsieur
merci d’avance 😉
octobre 18th, 2018
Bonjour,
Le script fourni n’est pas clé en main et sers uniquement d’exemple.
En fonction de votre banque et de ses contraintes il sera certainement nécessaire de modifier le formulaire pour envoyer les informations nécessaires vers une url que la banque vous aura fourni.
Cordialement,
novembre 13th, 2018
Bonjour Hervé,
J’utilise votre exemple de module de paiement. Ma question est de savoir quelle url dois-je retourner depuis ma gateway à mon site marchand pour lui confirmer que le paiement a été effectué ?
novembre 15th, 2018
Bonjour Will,
Si vous regardez dans le zip fourni en fin d’article il y’a un controller Api qui traite cette problèmatique.
Il faut donc renvoyer votre plateforme de paiement vers celui-ci.
novembre 16th, 2018
Merci pour votre réponse. Je renvoie donc un lien absolu vers le controller ?
Ex: localhost/prestashop/modules/nom_du_module/controller/api.php
novembre 16th, 2018
J’ai trouvé la solution. Merci beaucoup à vous Hervé the big boss 😉
novembre 16th, 2018
Je réponds tout de même au cas ou d’autres se posent la question 😉
Le plus simple pour construire le lien est d’utiliser la classe Link pour récupérer le lien du controller du module
Dans le contexte de votre module de paiement vous pouvez fournir le lien de retour caché comme un paramètre de formulaire.
VIa un code du type
$mylink = $this->context->link->getModuleLink('hhpayment',api');
novembre 28th, 2018
Bonjour,
J’essaye de faire deux méthodes de paiement, paiement cache, ou simuler un crédit bancaire.
Je n’arrive pas a adapter votre module dans mon cas.
Le code de simulation est prêt, mais j’arrive a l’intégrer.
Cordialement
février 14th, 2019
Bonjour, j’aime bien votre API.
Je veux l’adapter au paiement mobile. j’ai un API de l’opérateur. Dans le guide de l’opérateur il est dit que le format de transmission est JSON.
Comment fournir les informations à l’API dans ce cas?
Merci
février 18th, 2019
Bonjour,
Dans ce cas envoyez l’information à votre api via Curl
Voici un exemple : https://lornajane.net/posts/2011/posting-json-data-with-php-curl
Cordialement,
Hervé
février 18th, 2019
Merci pour l’info. SVP dans quel fichier dois faire les modifications? pouvez vous me donner un coup de pouce?
Merci
février 27th, 2019
Bonjour, je voudrais utiliser votre api pour realiser un paiement mobile : le mobile money.
J’ai le code fourni par l’operateur de telephonie; seulement je ne sais pas où l’integrer.
J’ai généré un module de paiement que j’edite en consulte le votre.Quand je remplace le formulaire contenu dans le fichier hhpaiement.tpl par celui fourni par l’opérateur. le module ne s’affiche comme moyen de paiement au moment de la validation.
Mais lorsque j’integre le votre module, il s’installe normalement et propose les trois paiements decrits ci-dessus.
MErci
février 27th, 2019
Bonjour,
Cet article et ce module expliquent les mécaniques générales de fonctionnement d’un module de paiement.
Cependant il n’est en aucun cas fonctionnel pour une implémentation spécifique.
Dans un premier temps il est donc important de comprendre la logique Prestashop, avant de l’appliquer au code fourni par votre solution de paiement.
Cordialement,
Hervé
février 27th, 2019
Bonjour
Merci pour votre module. il s’installe correctement. **
Cependant, les moyens de paiement ne sont pas adéquats. *je voudrais ajouter le paiement mobile. Mobile Money
L’operateur de telephonie fournit le code suivant :
Le module que je suis en train de développer s’affiche dans le Gestionnaire de modules mais ne s’affiche pas au moment de réaliser le paiement contrairement à hhpaiement.
Merci de m’avoir lu
avril 23rd, 2019
bonjour Merci pour ce tuto
je suis debutant en prestashop, j’ai pu integré et modifier votre module en fonction de mon besoin, mais mon probleme est moi jai un seul Api, apres apres appeler l’APi et lui envoyé les informations comment revenir valider la commande
avril 23rd, 2019
Bonjour,
Cela dépends de l’api de paiement que vous utilisez, je donc pas vous dire exactement.
En règle générale il est possible de fournir une adresse de retour dans celle-ci ( via une configuration dans leur backoffice ou via l’envoi des informations dans les paramètres )
Cordialement,
Hervé
avril 23rd, 2019
L’API de paiement retourne un resultat json, je ne sais pas comment traiter pour valider la commande, svp veuillez m’aider Merci
avril 26th, 2019
bonjour
svp, mon api retourne juste un resultat json, comment je peux revenir pour valider la commande svp aidez moi
avril 29th, 2019
Bonjour,
Une fois la réponse de votre webservice parsée ( via un json_decode )
Vous pouvez rediriger vers un controller comme le fichier « validation.php » de l’archive hhpayement et ainsi changer le statut de la commande vers son statut final.
Cordialement,
mai 2nd, 2019
Ok. Merci, c’est bon
septembre 19th, 2019
please comment integrer l’appel d’un api avec curl dans prestashop? ou exactement injecter le code curl dans hhpayment merci
voici un exemple de code que je voudrais intergrer dans hhpayment
quand je mets tout simplement url dans le back office ca me demande l’authentification d’ou j’ai besoin d’utiliser curl
mais please je ne sais pas comment l’intergrer
merci
$url = ‘https://android.googleapis.com/gcm/send’;
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array(‘Content-Type: text/xml’));
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, « here » );
$result = curl_exec($ch);
curl_close($ch);
septembre 19th, 2019
Bonjour,
En partant du principe que vous avez téléchargé l’archive présente dans cet article.
Vous pouvez utiliser le controller front api.php du fichier controllers/front/api.php
Dans celui-ci avant le contenu déjà présent dans la fonction postprocess, vous pouvez effectuer votre appel à l’api et lui envoyer les éléments qui ont été définis dans le formulaire.
Je ne connais pas du tout le fonctionnement de votre api, mais si ensuite l’appel curl suffit à récupérer une réponse de l’acceptation du paiement ou non, vous pouvez ensuite en fonction appliquer la réponse ok ou ko pour procéder à la validation de la commande.
Cet article est assez basique car il donne uniquement une trame, chaque implémentation dépendra ensuite de l’api qui est en face.
Cordialement,
Hervé
septembre 19th, 2019
grand merci pour le temps que tu prends pour repondre
j’ai crée un formulaire dans le fichier payment_api_form.tpl
pour pouvoir recuperer le numero entrer par l’utilisateur et l’operateur choisi . j’ai place le function callApi dans le fichier api.php
stp ou est ce que je peux ensuite l’appeler ?
quand je vais dams le cote admin et que j’insere l’url ca me dit authentification failed
donc j’ai besoin d’appeler l’url avec le header , boody et l’identification
voici le code ajoute dans le fichier api comme recomende merci
<?php
class hhpaymentapiModuleFrontController extends ModuleFrontController {
/**
* call api
*/
function ApiCall(){
$accountNumber = $_POST[‘accountNumber’]; //j’essaye de recuperer cette variable de payment_a[i_form.tpl
$operator = $_POST[‘operator’];
$paymentType = « succes »;
$amount = $total = (float)$cart->getOrderTotal(true, Cart::BOTH);
$array = array(
‘accountNumber’ => $accountNumber,
‘amount’ => $amount,
‘operator’ => $operator,
« paymentType » => $paymentType
);
try {
//code…
$body = json_encode($array);
} catch (\Throwable $th) {
throw $th;
}
//The URL of the resource that is protected by Basic HTTP Authentication.
$url = ‘https://XXXXXXXXXXXXXXXXX/api/processPayment’;
//Your username.
$username = ‘klaus’;
//Your password.
$password = ‘3421’;
//Initiate cURL.
$ch = curl_init($url);
//Specify the username and password using the CURLOPT_USERPWD option.
curl_setopt($ch, CURLOPT_USERPWD, $username . « : » . $password);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
‘Content-Type: application/json’,
‘Content-Length: ‘ . strlen($body))
);
//Tell cURL to return the output as a string instead
//of dumping it to the browser.
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Execute the cURL request.
$response = curl_exec($ch);
//Check for errors.
if (curl_errno($ch)) {
//If an error occured, throw an Exception.
throw new Exception(curl_error($ch));
}
curl_close($ch);
//Print out the response.
return $response;
}
/**
* Retours de l’api de paiement
*/
public function postProcess()
{
//Contenu du controller initial
}
}
septembre 19th, 2019
voici l’erreur que j’obtiens je ne pense pas que l’execution arrive
jusqu’a la page api.php
il execute juste l’url inserer a partir du back office
« status »:401, »displayMessage »: »AUTHENTICATION_REQUIRED », »detailledMessage »: »AUTHENTICATION_REQUIRED », »exceptionId »: »4863fc0f-185b-46b7-a44b-4c318421bc04″}
STP pouvez vous regarder le code que j’ai inserer dans le fichier api.php et me dire si c’est correct et si oui comment le faire executer.
merci
septembre 19th, 2019
stp j’ai inserer le code dans api.php comme vous m’avez conseille mais seulement je ne sais pas comment l’appeler ou le faire executer je l’ai mise dans une function callApi()
ou exactement appeler cette function? toujours dans api.php ou alors je dois l’appeler dans un autre fichier ?
septembre 20th, 2019
Bonjour,
Comme précisé dans ma précédente réponse, votre code d’appel à l’api est à mettre DANS le contenu de la fonction postProcess.
Car c’est la fonction qui est appellée pour le traitement des variables posts dans les controllers prestashop.
Cordialement,
Hervé
septembre 20th, 2019
bonjour
je l’ai inserer mais elle ne s’execute pas.
comment l’executer ? quand je mets le code dans postProcces et ne met aucun lien dans le chanp Payment api url du back office rien ne se passe
et lorsque je mets un un lien dans le champ Payment api url du back office c’est ce lien qui est appeler
alors comment appeler le code inserer dans api.php lorsque je clique sur le bottons commande
merci et encore grand merci pour le temps que vous prenez pour me repondre Mr herve