Module (re) captcha pour le formulaire de contact prestashop

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Les formulaire de contacts sont de plus en plus soumis aux spams, ce qui devient assez agaçant…, malheureusement le formulaire de contact de prestashop ne fait pas exeption à la règle.

Voici donc un module qui vous permettra d’ajouter l’excellent « Recaptcha » de google à votre formulaire de contact prestashop.

captcha prestashop formulaire de contact

Pour commencer, ouvrez le fichier « contact-form.tpl » de votre dossier thème et saissez le code suivant :

1
2
3
4
5
6
{if $captcha }
<p>
<label for="captcha">{l s='Captcha'}</label>
<div style="float:left;margin-left: 0.7em;">{$captcha}</div>
</p>
{/if}

après les lignes suivantes :
( Je l’ai inséré après le champ message, mais c’est à adapter en fonction de l’endroit souhaité )

1
2
3
4
<p>
<label for="message">{l s='Message'}</label>
<textarea id="message" name="message" rows="15" cols="20" style="width:340px;height:220px">{if isset($message)}{$message|escape:'htmlall':'UTF-8'|stripslashes}{/if}</textarea>
</p>

Vous pouvez ensuite télécharger et installer le module.
Une fois le module installé, il sera nécessaire de récupérer des clés publiques et privées sur le site de recaptcha pour activer le module
http://www.google.com/recaptcha/whyrecaptcha

Vous pourrez télécharger ce module et consulter ses dernières mise à jour depuis la page Module (re)Captcha pour le formulaire de contact prestashop

(Note : 05/05/2014 : Ce fonctionnement n’est plus d’actualité , la vérification est fait en ajax )
Le fonctionnement du module en lui même est relativement simple, toute la logique étant dans la fonction « hookHeader ».
Les vérifications du captcha utilisent la librairie fournie par google.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
       public function hookHeader($params) {
 
            //Récupération de la page//controller courant
            $contact_form_controller = false;
            $page_name = false;
 
            //Version 1.5
            if (_PS_VERSION_ > '1.5') {
                if ( $this->context->controller instanceof ContactController )
                    $contact_form_controller = true;
            }
            //Versions 1.4
            else {
                /* Version >= 1.4.9 */
                if ( version_compare(_PS_VERSION_, '1.4.9.0', '>=') )
                    $page_name = $this->context->smarty->getTemplateVars('page_name');
                else      
                /* Version > 1.4.9*/
                $page_name = $this->context->smarty->get_template_vars('page_name');
            }
 
            if ( $page_name == 'contact-form' || $contact_form_controller ) {
 
                //Génération du template
                require_once(dirname(__FILE__).'/lib/recaptchalib.php');
                $publickey = Configuration::get('CAPTCHA_PUBLIC_KEY');
 
                //Si soumission du formulaire :                
                if (Tools::isSubmit('submitMessage')){
 
                    $captcha_check = recaptcha_check_answer(Configuration::get('CAPTCHA_PRIVATE_KEY'), $_SERVER["REMOTE_ADDR"], Tools::getValue('recaptcha_challenge_field'), Tools::getValue('recaptcha_response_field'));                        
                    if ($captcha_check->is_valid != 1)
                    {
                        Tools::redirect('contact-form.php?recaptchaError=1');
                    }
                }
 
                //Assignation du code recaptcha
                $this->context->smarty->assign('captcha',recaptcha_get_html($publickey));
 
                //Si message d'erreur
                if ( Tools::getValue('recaptchaError') == 1) {
 
                    //Assignation de l'erreur au template
                    $this->context->smarty->assign('errors',array($this->l('the captcha code is wrong')));
                    $errorBlock = trim(preg_replace("#\n#","",$this->context->smarty->fetch(_PS_THEME_DIR_.'errors.tpl')));
 
                    //Placement du block dans la page
                    return '<script type="text/javascript">
                    $(document).ready(function(){
                        $("form.std").before(\''.$errorBlock.'\');
                    });
                    </script>';
                }
 
            }
        }

Nouvelle version du module avec vérification ajax du code du captcha disponible : plus de détails

28 réflexions sur “Module (re) captcha pour le formulaire de contact prestashop”

  1. bonjour.
    merci pour ce module.
    j’ai pu l’installer et le configurer avec les cles sans soucis, mais la page contact ne s’affiche plus, firebug m’indique qu’il y a une erreur serveur !
    si je supprime le bloc de code a inserer dans contact-form.tpl, la page réaparait.
    je suis en prestashop 1.4.6.
    Pouvez vous m’aider ?
    merci d’avance

  2. Fonctionne sur un presta 1.5.x, le seul soucis est que si je n’entre pas le bon code de sécurité, tout le formulaire se vide… ce qui est plutôt embêtant si le message du client est long… à coup sur il ne ressaisit pas son message et passe son chemin.

  3. Ping : Module (re) captcha pour le formulaire de contact prestashop nouvelle version - Hervé Hennes – Blog

  4. merci pour cette astuce, toutefois sur une 1.5.6.1 avec le module 0.1.1 mon formulaire s’efface si le code est faux…donc problème toujours existant. suis je le seul?

    1. Bonjour,

      De mon côté cela fonctionne bien sur ma version de test (v 1.5.6.1 également ):
      http://web.h-hennes.fr/prestashop15/index.php?controller=contact
      Dans un premier temps pouvez-vous télécharger le fichier http://www.h-hennes.fr/blog/wp-content/uploads/2013/12/ei-captcha-0.1.1.rar et mettre à jour vos fichiers.

      Si le problème persiste, oouvez-vous vérifier si firebug ne vous renvoie pas une erreur javascript ?
      Votre erreur laisse à penser que le traitement ajax n’est pas pris en compte.

    1. A priori si le dossier n’est pas visible c’est que le module n’a pas été mis en place.
      Avant toute chose il faut décompresser l’archive, puis envoyer le dossier « eicaptcha » par ftp dans le dossier « modules » de votre hébergement.
      Le module sera ensuite bien listé. ( Pour le trouver plus facilement utiliser le moteur de recherche dans les modules )

  5. bonjour
    j’ai chargé le fichier dans le ftp
    puis je les installé
    jusque la pas de problème
    j’ai mie le code dans le fichier contact-from

    mais quand je vais sur la page de contact
    il y a écrit : captcha mais il ni a pas les image ni le module visible
    il y a écrit seulement captcha sous le message

    pouvez vous m’aidé

    cordialement

  6. bonjour,

    mon problème est que le formulaire sera envoyé meme si le code captcha est incorrect ou le champ de code captcha vide,
    j’utilise prestashop 1.5.4.0
    merci de m’aider

  7. Bonjour,

    Très bon module pour protéger le formulaire de contact de Prestashop.
    Avez-vous essayé d’étendre cette fonctionnalité au module « Envoyer à un ami » qui lui aussi est très sujet aux spams ??

    De mon côté, j’ai essayé en enlevant la condition à la ligne 131 dans le fichier eicaptcha.php. Ainsi, le formulaire captcha s’affiche bien dans « envoyer à un ami », mais par contre il ne fonctionne pas…certainement une histoire de controller…

    Si vous avez une idée, je suis preneur 😉

    1. Bonjour,
      Merci de votre retour sur ce module.
      Excellente idée de le mettre en place sur le module envoyer à un ami !
      Je vais voir pour intégrer cette fonctionnalité dans une nouvelle version du module.
      Pour votre adaptation, j’aurais tendance à penser que c’est plutôt le JavaScript qui pose problème car il est spécifique au formulaire de contact.

      Cordialement,

  8. Hi,

    I have added your module to my website. Great module! You can see the captcha in the contactform. However after I submit I get the error below.
    You also can check my website:
    https://staging.hqdrones.com/contact-us

    Do you know what the issue is?

    Fatal error: Uncaught Error: Class ‘ReCaptcha\ReCaptcha’ not found in /var/www/clients/client2/web2/web/modules/eicaptcha/eicaptcha.php:400 Stack trace: #0 /var/www/clients/client2/web2/web/classes/Hook.php(591): EiCaptcha->hookContactFormAccess(Array) #1 /var/www/clients/client2/web2/web/classes/Hook.php(546): HookCore::coreCallHook(Object(EiCaptcha), ‘hookcontactForm…’, Array) #2 /var/www/clients/client2/web2/web/override/controllers/front/ContactController.php(9): HookCore::exec(‘contactFormAcce…’) #3 /var/www/clients/client2/web2/web/classes/controller/Controller.php(171): ContactController->checkAccess() #4 /var/www/clients/client2/web2/web/classes/Dispatcher.php(367): ControllerCore->run() #5 /var/www/clients/client2/web2/web/index.php(28): DispatcherCore->dispatch() #6 {main} thrown in /var/www/clients/client2/web2/web/modules/eicaptcha/eicaptcha.php on line 400

  9. Bonjour,

    Attention il est possible de contourner le captcha (testé jusqu’en version 0.4.9, version 0.4.10 non testée sur mon prestashop 1.6.1.13) dont le contrôle ne semble pas être opérationnel côté serveur (hook hookContactFormAccess non appelé ou non opérationnel).

    Pour reproduire, supprimer le bouton formulaire directement dans le DOM et le recréer (les évènements de contrôle JS ne seront plus attachés)

    1. Bonjour,

      Merci de votre précision, de manière générale il est préférable de mettre à jour vers la dernière version.
      Si le hook est mal implémenté, il faudrait réinitialiser le module (ceci impliquera de saisir à nouveau toutes les informations )

      Cordialement,
      Hervé

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *