Para entrar en materia quiesiera mencionar que Prestashop a día de hoy (versión 1.6) carece de un módulo gratuito que integre un captcha bien para dicha versión (SlideCaptcha a mí por lo menos no me dejaba configurarlo una vez instalado manualmente además) y los módulos que no son gratuitos tienen un precio que los programadores como yo nos negamos a pagar cuando puede hacerlo uno mismo.
No hace falta decir que hoy en día un formulario sin un captcha es “una diana de 20m” para los ataques masivos de mails, con lo que se me hace imprescindible implementar un captcha en la tienda online. Y la forma más rápida es utilizando el captcha de Google: reCaptcha, que está al servicio del usuario.

Pues bien, me he liado tanto pensado que era más dificil que no me he dado cuenta de que en realidad  es más sencillo de lo que parecía, mucho más sencillo. Empecemos con el ejemplo del formulario de contacto, aunque se puede utilizar también en el resto de formularios (de registro, de login, etc…).

1º. Vamos a la página de reCaptcha y ponemos una etiqueta que equivale a un título e introducimos el dominio del captcha, en el caso de querer hacerlo para esta web sería: ivanros.com

2º Seguimos los pasos de Google para implementarlo.  Copiamos este código en el archivo header.tpl que encontrarás en la carpeta raíz del servidor:
<script src='https://www.google.com/recaptcha/api.js'></script>
Y copiamos este código en /themes/[TU TEMA ACTIVO*]/contact-form.tpl (que es el archivo que muestra el html del formulario de contacto)
<div class="g-recaptcha" data-sitekey="[aquí la clave del sitio que te facilita Google]"></div>
*El tema activo por defecto es: default-bootstrap.

Hasta aquí tenemos la parte que Google te deja bien clarito, pero ahora los que como yo todavía nos queda mucho por aprender nos quedamos atascados hasta que de repente nos viene la inspiración y entre eso y algunos comentarios de soluciones en anteriores versiones de Prestashop damos con la solución.

3º Para terminar tenemos que ir a /controllers/front/ContactController.php (que es el archivo que realiza las comprobaciones del formulario de contacto) y donde pone

Añadimos esto antes del último else:

Lo que hacemos con esto es recoger en $gcaptcha el valor de g-recaptcha-response que es el resultado que envía Google de la operación del captcha y si no tiene valor añadimos al error que muestre “Captcha no verificado”.

Quedando el código así:

Puedes comprobar ahora a realizar rellenar el formulario de contacto que si no escribes el captcha te saldrá “Captcha no verificado” y si lo rellenas todo correctamente se enviará el correo sin problemas.

Y eso es todo. Fácil, ¿no?. Pues me ha llevado mucho más tiempo pensarlo que escribirlo. Por lo que os lo facilito al resto de comunidad internauta, puesto que seguro no seré ni el primero ni el último con este dilema.

Un saludo!
Iván Ros

 

EDITO: lo mejor es ponerlo en un override. Creamos un archivo llamado ContactController.php dentro de /override/controllers/front/ con este código:


Lo que conseguimos con esto, además de tenerlo en un override, si os dais cuenta, he quitado los elseif por if solo para que, como en el registro, muestre todos los errores de una vez, y no pare por cada error. Mucho más útil.