{"id":1612,"date":"2017-10-02T20:45:41","date_gmt":"2017-10-02T18:45:41","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1612"},"modified":"2018-11-22T18:10:44","modified_gmt":"2018-11-22T16:10:44","slug":"prestashop-1-7-creer-un-module-de-paiement","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2017\/10\/02\/prestashop-1-7-creer-un-module-de-paiement\/","title":{"rendered":"Prestashop 1.7 : Cr\u00e9er un module de paiement"},"content":{"rendered":"<p>La version 1.7 de prestashop introduit des changements dans la cr\u00e9ation des modules de paiement.<br \/>\nDe mon point de vue cela simplifie vraiment la cr\u00e9ation de modules de paiement qui deviennent faciles et rapides \u00e0 coder \ud83d\ude42<\/p>\n<p>C&rsquo;est parti pour voir cela en d\u00e9tails et en exemple\u00a0 via la cr\u00e9ation d&rsquo;un module de paiement hhPayment.<\/p>\n<pre lang=\"php\" escaped=\"true\">use PrestaShop\\PrestaShop\\Core\\Payment\\PaymentOption;\r\n\r\nif (!defined('_PS_VERSION_')) {\r\n    exit;\r\n}\r\n\r\nclass HhPayment extends PaymentModule\r\n{\r\n\r\n    public function __construct()\r\n    {\r\n        $this-&gt;author    = 'hhennes';\r\n        $this-&gt;name      = 'hhpayment';\r\n        $this-&gt;tab       = 'payment_gateways';\r\n        $this-&gt;version   = '0.1.0';\r\n        $this-&gt;bootstrap = true;\r\n        parent::__construct();\r\n\r\n        $this-&gt;displayName = $this-&gt;l('HH Payment');\r\n        $this-&gt;description = $this-&gt;l('HH sample Payment for PS 1.7');\r\n    }\r\n\r\n    public function install()\r\n    {\r\n        if (!parent::install() \r\n            || !$this-&gt;registerHook('paymentOptions')\r\n            || !$this-&gt;registerHook('paymentReturn')\r\n            ) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n}\r\n<\/pre>\n<p>Comme vous pouvez le voir ci-dessus, le module doit toujours \u00e9tendre la classe <em>PaymentModule<\/em> mais vous noterez \u00e9galement l&rsquo;utilisation de la classe <strong><em>PaymentOption<\/em><\/strong>.<br \/>\nAnsi que du nouveau <em><strong>hook <\/strong><strong>paymentOptions<\/strong>.<\/em><br \/>\nC&rsquo;est dans celui-ci que se situe toute la nouveaut\u00e9 !<\/p>\n<p>La classe <em>PaymentOption<\/em> vous permets de g\u00e9rer facilement l&rsquo;affichage et les actions de votre module en quelques lignes.<br \/>\nLe tunnel de commande a \u00e9t\u00e9 enti\u00e8rement revu dans cette version 1.7 de prestashop ( inpir\u00e9 de magento 1 au passage ^^ ) , c&rsquo;est plus cadr\u00e9 et plus propre<\/p>\n<p>Voici un aper\u00e7u de l&rsquo;affichage d&rsquo;une m\u00e9thode, ainsi que des diff\u00e9rentes zones dans le template par d\u00e9faut.<br \/>\nLe template utilis\u00e9 \u00e9tant situ\u00e9 dans \/themes\/classic\/checkout\/_partials\/steps\/payment.tpl<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1619\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/10\/prestashop-paiement.jpg\" alt=\"Prestashop paiement\" width=\"504\" height=\"219\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/10\/prestashop-paiement.jpg 504w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/10\/prestashop-paiement-300x130.jpg 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Voici la liste des m\u00e9thodes utiles sur cette classe et leur utilisation<\/p>\n<ul>\n<li><strong>setCallToActionText<\/strong> : D\u00e9fini le texte de la m\u00e9thode de paiement (1) \/ Obligatoire<\/li>\n<li><strong>setAdditionalInformation<\/strong> : D\u00e9fini les informations additionnelles de la m\u00e9thode (3) \/ Optionnel<\/li>\n<li><strong>setLogo<\/strong> : D\u00e9fini le logo de la m\u00e9thode\u00a0(2) \/ Optionnel<\/li>\n<li><strong>setAction<\/strong> : D\u00e9fini le controller \u00e0 appeler pour valider le paiement (Non visible ) \/ Obligatoire sauf si utilisation de setForm<\/li>\n<li><strong>setInputs<\/strong> : Permets d&rsquo;ajouter des champs de formulaires, id\u00e9alement de type hidden (4)\u00a0 \/ Optionnel<\/li>\n<li><strong>setForm<\/strong> : Permets d&rsquo;utiliser un formulaire sp\u00e9cifique au module, si utilis\u00e9 , les fonctions setInputs et setAction n&rsquo;ont aucun effet ( ) \/ Optionnel<\/li>\n<li><strong>setModuleName<\/strong> : Nom\u00a0 du module ( Non visible ) \/ Obligatoire<\/li>\n<li><strong>setBinary<\/strong> : D\u00e9fini si le module utilise un binaire pour g\u00e9n\u00e9rer le formulaire, c&rsquo;est le cas pour atos par exemple, dans ce cas il faut \u00e9galement greffer votre module sur le hook <em>displayPaymentByBinaries<\/em> \/ Optionnel<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Exemples :<\/strong><\/span><\/p>\n<p>voici comment cr\u00e9er une option de paiement de type \u00ab\u00a0Ch\u00e8que\u00a0\u00bb<\/p>\n<pre lang=\"php\" escaped=\"true\">  $standardPayment = new PaymentOption();\r\n  \/\/Inputs suppl\u00e9mentaires (utilis\u00e9 id\u00e9alement pour des champs cach\u00e9s )\r\n        $inputs = [\r\n            [\r\n                'name' =&gt; 'custom_hidden_value',\r\n                'type' =&gt; 'hidden',\r\n                'value' =&gt; '30'\r\n            ],\r\n            [\r\n                'name' =&gt; 'id_customer',\r\n                'type' =&gt; 'hidden',\r\n                'value' =&gt; $this-&gt;context-&gt;customer-&gt;id,\r\n            ],\r\n        ];\r\n        $standardPayment-&gt;setModuleName($this-&gt;name)\r\n                \/\/Logo de paiement\r\n                -&gt;setLogo($this-&gt;context-&gt;link-&gt;getBaseLink().'\/modules\/hhpayment\/views\/img\/logo.png')\r\n                -&gt;setInputs($inputs)\r\n                \/\/-&gt;setBinary() Utilis\u00e9 si une \u00e9x\u00e9cution de binaire est n\u00e9cessaires ( module atos par ex )\r\n                \/\/Texte de description\r\n                -&gt;setCallToActionText($this-&gt;l('Payment in x days'))\r\n                -&gt;setAction($this-&gt;context-&gt;link-&gt;getModuleLink($this-&gt;name, 'validation', array(), true))\r\n                \/\/Texte informatif suppl\u00e9mentaire\r\n                -&gt;setAdditionalInformation($this-&gt;fetch('module:hhpayment\/views\/templates\/hook\/displayPayment.tpl'));\r\n<\/pre>\n<p>Avec le contenu suivant dans\u00a0 le tpl par exemple<\/p>\n<pre lang=\"php\" escaped=\"true\">  &lt;div class=\"row\"&gt;\r\n &lt;div class=\"col-xs-12 col-md-12\"&gt;\r\n &lt;p class=\"payment-module-description\"&gt;\r\n {l s='Your order will be automaticaly payed with your account.' mod='hhpayment'}\r\n &lt;\/p&gt;\r\n &lt;\/div&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>Un autre exemple de type \u00ab\u00a0CB\u00a0\u00bb qui renvoie l&rsquo;utilisateur vers une api externe.<\/p>\n<pre lang=\"php\" escaped=\"true\"> \/\/Variables pour paiement API\r\n        \/\/Variables pour paiement API\r\n        $this-&gt;smarty-&gt;assign(\r\n            [\r\n                'payment_url' =&gt; Configuration::get('PAYMENT_API_URL'),\r\n                'success_url' =&gt; Configuration::get('PAYMENT_API_URL_SUCESS'),\r\n                'error_url' =&gt; Configuration::get('PAYMENT_API_URL_ERROR'),\r\n                'id_cart' =&gt; $this-&gt;context-&gt;cart-&gt;id,\r\n                'cart_total' =&gt; $this-&gt;context-&gt;cart-&gt;getOrderTotal(true,\r\n                    Cart::BOTH),\r\n                'id_customer' =&gt; $this-&gt;context-&gt;cart-&gt;id_customer,\r\n            ]\r\n        );\r\n\r\n        $apiPayement = new PaymentOption();\r\n        $apiPayement-&gt;setModuleName($this-&gt;name)\r\n                -&gt;setCallToActionText($this-&gt;l('HH Sample payement module (like CB )'))\r\n                \/\/D\u00e9finition d'un formulaire personnalis\u00e9\r\n                -&gt;setForm($this-&gt;fetch('module:hhpayment\/views\/templates\/hook\/payment_api_form.tpl'))\r\n                -&gt;setAdditionalInformation($this-&gt;fetch('module:hhpayment\/views\/templates\/hook\/displayPayment.tpl'));\r\n<\/pre>\n<p>Avec le contenu suivant pour le formulaire :<\/p>\n<pre lang=\"html\" escaped=\"true\">&lt;form method=\"post\" action=\"{$payment_url}\"&gt;\r\n&lt;div class=\"form-group\"&gt;\r\n{* choix du mode de carte *}\r\n{l s='please choose your card type' mod='hhpayment'}\r\n&lt;div class=\"radio\"&gt;\r\n&lt;label&gt;\r\n&lt;input type=\"radio\" name=\"cb_type\" value=\"mastercard\" id=\"cb_type1\" checked=\"checked\" \/&gt; Mastercard\r\n&lt;\/label&gt;\r\n&lt;\/div&gt;\r\n&lt;div class=\"radio\"&gt;\r\n&lt;label&gt;\r\n&lt;input type=\"radio\" name=\"cb_type\" id=\"cb_type2\" value=\"visa\"\/&gt; Visa\r\n&lt;\/label&gt;\r\n&lt;\/div&gt;\r\n&lt;div class=\"radio\"&gt;\r\n&lt;label&gt;\r\n&lt;input type=\"radio\" name=\"cb_type\" id=\"cb_type3\" value=\"cb\"\/&gt; CB\r\n&lt;\/label&gt;\r\n&lt;\/div&gt;\r\n&lt;\/div&gt;\r\n{* Informations pour l'api *}\r\n&lt;input type=\"hidden\" name=\"success_url\" value=\"{$success_url}\" \/&gt;\r\n&lt;input type=\"hidden\" name=\"error_url\" value=\"{$error_url}\" \/&gt;\r\n&lt;input type=\"hidden\" name=\"id_cart\" value=\"{$id_cart}\" \/&gt;\r\n&lt;input type=\"hidden\" name=\"cart_total\" value=\"{$cart_total}\" \/&gt;\r\n&lt;input type=\"hidden\" name=\"id_customer\" value=\"{$id_customer}\" \/&gt;\r\n&lt;\/form&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>L&rsquo;affichage du message de retour reste toujours g\u00e9r\u00e9 via le hook paymentReturn.<\/p>\n<pre lang=\"php\" escaped=\"true\">\/**\r\n     * Affichage du message de confirmation de la commande\r\n     * @param type $params\r\n     * @return type\r\n     *\/\r\n    public function hookDisplayPaymentReturn($params) \r\n    {\r\n        if (!$this-&gt;active) {\r\n            return;\r\n        }\r\n        \r\n        $this-&gt;smarty-&gt;assign(\r\n            $this-&gt;getTemplateVars()\r\n            );\r\n        return $this-&gt;fetch('module:hhpayment\/views\/templates\/hook\/payment_return.tpl');\r\n    }\r\n<\/pre>\n<p>Pour voir le code de d\u00e9mo complet vous pouvez t\u00e9l\u00e9charger mon module de d\u00e9mo, qui inclue les diff\u00e9rents tps ainsi qu&rsquo;une configuration basique dans l&rsquo;administration.<\/p>\n<p><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/10\/hhpayment.zip\">hhpayment<\/a><\/p>\n<p>Nous avons \u00e0 pr\u00e9sent fait le tour du fonctionnement des modules de paiement sur Prestashop 1.7 \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La version 1.7 de prestashop introduit des changements dans la cr\u00e9ation des modules de paiement. De mon point de vue cela simplifie vraiment la cr\u00e9ation de modules de paiement qui deviennent faciles et rapides \u00e0 coder \ud83d\ude42 C&rsquo;est parti pour voir cela en d\u00e9tails et en exemple\u00a0 via la cr\u00e9ation d&rsquo;un module de paiement hhPayment. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245],"tags":[288,502,503,104,483],"class_list":["post-1612","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-module","tag-paiement","tag-paymentoption","tag-prestashop","tag-prestashop-1-7","prestashop-1-6","prestashop-1-7","prestashop-1-7-4","prestashop-1-7-5","prestashop-1-7-6","prestashop-1-7-7","prestashop-1-7-8","prestashop-8-0","prestashop-8-1"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1612"}],"version-history":[{"count":9,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1612\/revisions"}],"predecessor-version":[{"id":1623,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1612\/revisions\/1623"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}