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

Prestashop paiement

 

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.

hhpayment

Nous avons à présent fait le tour du fonctionnement des modules de paiement sur Prestashop 1.7 🙂