Bon alors je vous explique de ce que j'ai fait pour que ca marche chez moi. Je ne peut garantir que ca ne marche chez vous mais c'est du moins la ligne directrice à suivre vu qu'on avais tous le même problème. A noter que j'utilise un système pour le paiement qui est une redirection de formulaire vers l'espace sécurisé de la banque (je ne sais pas si ma méthode marche avec des iframes intégré au site ou autre)
Comme l'a dit ethernoendless le principe est de remplacer la gestion du retour de paiement qui se fait via un fichier annexe à l'intérieur du module par un FrontControllerModule afin de "contenairisé" le traitement.
Donc normalement à la racine de votre module de paiement qui se trouve dans le dossier "modules" de prestashop vous devez avoir un fichier .php (dans mon cas il s'appelle "validation.php") qui s'occupe du traitement de retour de la banque. Le principe va être de deplacer le code contenu dans ce fichier dans un ModuleFrontController à l'intérieur du module de paiement
1) Il faut créer tout d'abord ce ModuleFrontContainer nommé validation.php que l'on va placer dans le dossier "controllers/front"
une fois ce nouveau fichier créer il le remplir comme cela :
<?php /* * 2007-2015 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2015 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ /** * @since 1.5.0 */ class <Namepaymentmodule>ValidationModuleFrontController extends ModuleFrontController { /** * @see FrontController::postProcess() */ public function postProcess() { //ICI CODE du fichier racine validation.php à mettre } } ?>
A savoir qu'il faut remplacer <NamePaymentModule> par le nom de votre module de paiement auquel il faudra une majuscule à la première lettre. Dans mon cas le nom de mon module s'appelle "clicandpay". Par conséquent ma class s'appellera :
class ClicandpayValidationModuleFrontController extends ModuleFrontController
Le nom de votre module est normalement le nom du dossier racine de votre module de paiement contenu dans le dossier "modules" de prestashop. Sinon vous pouvez voir le nom de votre module dans le fichier à la racine ayant le meme nom que le dossier de votre module de paiement. Dans la méthode construct vous verrez cette ligne la :
$this->name = 'nommodule';
2) Une fois le controller créer il va falloir copier/coller le code du fichier "standalone" de retour de paiement à la racine de votre module à l'intérieur de celui-ci. Il faudra globalement tout copié sauf si vous avez en début de fichier ces lignes :
require_once dirname(dirname(dirname(__FILE__))).'/config/config.inc.php'; require_once dirname(__FILE__) . '/clicandpay.php';
Par contre les autre require du style "_PS_MODULE_DIR_" doivent être présent :
require_once _PS_MODULE_DIR_.'clicandpay/classes/ClicandpayResponse.php';
Pour vous aider je vous est mis en PJ du post mon fichier FrontController qui se nomme "validation.php" et l'ancien système de validation se nommant "validation-old.php"
3) Le Front controller est créé, il faut maintenant le déclarer dans le constructeur du module de paiement. C'est un fichier portant le meme nom que le nom de votre module et qui est à la racinne de votre module de paiment. Dans mon cas :
Dans ce fichier pour déclarer votre nouveau frontcontroller il faut l'ajouter dans la liste des controllers de la méthode "construct". Par exemple dans mon cas je suis passer de :
$this->controllers = array('redirect', 'submit', 'rest', 'iframe');
a :
$this->controllers = array('redirect', 'submit', 'rest', 'iframe', 'validation');
A noter que c'est le nom du fichier et nom la dénomination de la classe qu'il faut mettre.
4) Maintenant il va falloir permettre l'accès à ce controller par votre banque. Pour cela il faut connaitre l'url d'accès de votre nouveau frontcontroller. Le plus simple est de ne pas prendre la forme d'url rewritting mais de la prendre sous forme but.
Ainsi un front controller s'appelle de cette manière :
http://your-url.domain/index.php?fc=module&module=<name-of-your-module>&controller=<name-of-your-controller>
Dans mon cas je remplace :
<name-of-your-module> = clicandpay
<name-of-your-controller> = validation
5) Dernière étape il faut maintenant aller dans le back-office Marchand de votre banque affilié à votre boutique ou vous pouvez gérer les paiement/historique/etc...
Dans ce backoffice il faut que vous repériez la gestion des règle de notifications. Et dans cette page il faut éditer "l'url de notification à la fin du paiement" pour y mettre la nouvelle URL de votre FrontController.
Dans mon cas :
Comme vous le voyez j'ai un mode TEST et un mode PRODUCTION. Vous pouvez donc dans un premier temps uniquement modifier l'url en mode TEST, faire vos test et ensuite apres le répercuter sur le mode PRODUCTION.
De plus le nouveau FrontController que vous avez créer dans votre module de paiement doit avoir les bon droit d'accès pour que la banque puisse avoir accès à l'appel de celui-ci. Si mes souvenirs sont bon les fichier prestashop doivent avoir le droit d'écriture 644.
6) Et voilà normalement vous pouvez procéder à des paiement de test et ca devrait fonctionner comme ca fonctionne chez moi.
J'espère que j'ai été clair et n'hésitez pas à dire ce qui ne l'est pas.