Formulario de contacto con reCAPTCHA

Author: danielgara - Date: 2013-01-13 13:03:58
 
¿Que es el reCAPTCHA?
Es un sistema de implementación de seguridad para envió de datos el cual se utiliza para reconocer texto presente en imágenes.
reCAPTCHA se basa en el hecho de que para un ser humano puede ser simple determinar el texto presente en una imagen cuando para una máquina esta tarea resulta en ocasiones demasiado compleja (de ese modo se comprueba si el ente que esta completando el formulario es o no humano).

Agregando reCAPTCHA a nuestras aplicaciones:
  1. Creamos el CRUD de contacto, para que se puedan almacenar los datos que se recojan del formulario del contacto, para esto utilizamos el módulo de Preload DATA del CRUD
    Ingresamos al panel de admin a la ruta work/admin/creator.php y en la parte inferior izquierda, en el campo de Preload Data pegamos el siguiente código.
    Code:
    option=add&class_n=contacto&bd_engine=InnoDB&c_class=on&c_table=on&c_controller=on&c_template=on &c_edit=on&name%5B%5D=Id&id%5B%5D=id&type%5B%5D=int&tamano%5B%5D= &type_form%5B%5D=text&html%5B%5D=no&values%5B%5D=&required%5B%5D=not+null &autoincrement%5B%5D=yes&foreign_name%5B%5D=&foreign%5B%5D= &foreign_attr%5B%5D=&primary%5B%5D=yes&name%5B%5D=Nombre&id%5B%5D=nombre &type%5B%5D=string&tamano%5B%5D=100&type_form%5B%5D=text&html%5B%5D=no &values%5B%5D=&required%5B%5D=not+null&autoincrement%5B%5D=no &foreign_name%5B%5D=&foreign%5B%5D=&foreign_attr%5B%5D=&primary%5B%5D=no &name%5B%5D=Correo&id%5B%5D=correo&type%5B%5D=string&tamano%5B%5D=100 &type_form%5B%5D=text&html%5B%5D=no&values%5B%5D=&required%5B%5D=not+null &autoincrement%5B%5D=no&foreign_name%5B%5D=&foreign%5B%5D= &foreign_attr%5B%5D=&primary%5B%5D=no&name%5B%5D=Mensaje &id%5B%5D=mensaje&type%5B%5D=string&tamano%5B%5D=5000 &type_form%5B%5D=textarea&html%5B%5D=no&values%5B%5D= &required%5B%5D=not+null&autoincrement%5B%5D=no&foreign_name%5B%5D= &foreign%5B%5D=&foreign_attr%5B%5D=&primary%5B%5D=no&name%5B%5D=Fecha &id%5B%5D=fecha&type%5B%5D=timestamp&tamano%5B%5D=&type_form%5B%5D=text &html%5B%5D=no&values%5B%5D=&required%5B%5D=not+null&autoincrement%5B%5D=no &foreign_name%5B%5D=&foreign%5B%5D=&foreign_attr%5B%5D=&primary%5B%5D=no &name%5B%5D=&id%5B%5D=&type%5B%5D=string&tamano%5B%5D= &type_form%5B%5D=text&html%5B%5D=no&values%5B%5D=&required%5B%5D=not+null &autoincrement%5B%5D=no&foreign_name%5B%5D=&foreign%5B%5D= &foreign_attr%5B%5D=&primary%5B%5D=no&name%5B%5D=&id%5B%5D= &type%5B%5D=string&tamano%5B%5D=&type_form%5B%5D=text&html%5B%5D=no &values%5B%5D=&required%5B%5D=not+null&autoincrement%5B%5D=no &foreign_name%5B%5D=&foreign%5B%5D=&foreign_attr%5B%5D=&primary%5B%5D=no &name%5B%5D=&id%5B%5D=&type%5B%5D=string&tamano%5B%5D= &type_form%5B%5D=text&html%5B%5D=no&values%5B%5D=&required%5B%5D=not+null &autoincrement%5B%5D=no&foreign_name%5B%5D=&foreign%5B%5D= &foreign_attr%5B%5D=&primary%5B%5D=no
    Luego damos clic en preload data, y cuando aparezca lleno el formulario del Creator, damos clic en SEND.
    Nota: gracias al proceso anterior ya tenemos creado, la tabla de contacto, la clase, entre muchos otros archivos que crea el CRUD

  2. Entramos al sitio web de reCAPTCHA, y obtenemos uno para nuestro sitio web (previamente debemos usar una cuenta de google para poder obtener los códigos del reCAPTCHA)

  3. Modificamos el archivo work/configs/exceptions.php y le agregamos al final del archivo (antes de cerrar las etiquetas ?>) lo siguiente:
    //check captcha
    function check_captcha($response,$challenge)
    {
        
    $publickey "your_public_key_here";
        
    $privatekey "your_private_key_here";
        
    $resp NULL;
        
    $error NULL;
            
        if (
    $response)
        {
            
    $resp recaptcha_check_answer ($privatekey,$_SERVER["REMOTE_ADDR"],$challenge,
                                        
    $response);
            if (!
    $resp->is_valid
            {
                return 
    FALSE;
            }
        }
        else
        {
            return 
    FALSE;
        }
        
        return 
    TRUE;
    }
    Adicionalmente cambiamos las claves privadas y publicas por las obtenidas al registrarnos en reCAPTCHA

  4. Creamos la carpeta m_captcha dentro de la ruta work/modules/

  5. Descargamos el módulo de reCAPTCHA del siguiente link: https://www.dropbox.com/s/ggra61qc2hgn24u/modules.rar
    Luego descomprimimos la carpeta y movemos los archivos así:
    modules/m_captcha/recaptchalib.php a la ruta work/modules/m_captcha/recaptchalib.php

  6. Creamos el controlador contacto.php en la ruta work/contacto.php con lo siguiente:
    <?php

    require('configs/include.php');
    include_once(
    C_FULL_PATH."modules/m_captcha/recaptchalib.php");

    class 
    c_contacto extends super_controller {
            
        public function 
    send()
        {
            if(!
    check_captcha
            
    ($this->post->recaptcha_response_field,$this->post->recaptcha_challenge_field))
            {
    throw_exception("Error en el mensaje de seguridad");}
            
            
    $contacto = new contacto($this->post);
            
    $contacto->exceptions();

            
    $this->orm->connect();
            
    $this->orm->insert_data("normal",$contacto);
            
    $this->orm->close();
            
            
    $this->temp_aux 'message.tpl'
            
    $this->engine->assign('type_warning',"success");
            
    $this->engine->assign('msg_warning','Mensaje enviado correctamente');
            
            
    //$mail = 'your_email_here';
            //$headers = "From: ".$this->post->correo. "\n";
            //$asunto = 'Contacto FROM WEBSITE XXXXX - '.$this->post->correo;
            //$msj = 'Correo: '.$this->post->correo.'\nMensaje: '.$this->post->mensaje;
            //mail ($mail,$asunto,"Nombre:".$this->post->nombre."\n".stripcslashes($msj),$headers);
        
    }

        public function 
    display()
        {        
            
    $publickey "your_public_key_here";
            
    $error NULL;
            
            
    $captcha=recaptcha_get_html($publickey$error);
            
    $this->engine->assign('captcha',$captcha);
            
            
    $this->engine->assign('title','Contacto');
            
    $this->engine->display('header.tpl');
            
            if(
    $this->error==1)
            {
                
    $this->engine->assign('object',$this->post);
                
    $this->engine->assign('type_warning',$this->type_warning);
                
    $this->engine->assign('msg_warning',$this->msg_warning);
                
    $this->temp_aux 'message.tpl';
            }
            
            
    $this->engine->display($this->temp_aux);
            
    $this->engine->display('contacto.tpl');
            
    $this->engine->display('footer.tpl');
        }
        
        public function 
    run()
        {
            try {if (isset(
    $this->get->option)){$this->{$this->get->option}();}}
            catch (
    Exception $e) {$this->error=1$this->msg_warning=$e->getMessage();}    
            
    $this->display();
        }
    }

    $call = new c_contacto();
    $call->run();

    ?>
    Modificamos el public_key, y adicionalmente si queremos activar el envió de correos de contacto a nuestro email, entonces quitamos los comentarios de las últimas 5 lineas de la función send y colocamos donde dice mail el correo a donde queremos que lleguen los contactos.

  7. Creamos el template contacto.tpl en la ruta work/templates/t_dark/contacto.tpl con la siguiente información:
    <form class="well form-search" method="post" action="{$gvar.l_global}contacto.php?option=send">
    <legend>Contactenos</legend>
    <fieldset>
    <table cellspacing="2">
    <tr><td colspan="2">Ingresando la siguiente informaci&oacute;n se podr&aacute; colocar en contacto con alguno de nuestros asesores que le resolver&aacute; cualquier tipo de duda. Nuestra respuesta le deber&aacute; llegar en un plazo m&aacute;ximo de 3 d&iacute;as.<br /><br /></td></tr>
    <tr><td>Nombre: <input type="text" value="{$object->nombre}" name="nombre" /></td><td>Correo: <input type="text" value="{$object->correo}" name="correo" /></td></tr>
    <tr><td colspan="2">Mensaje: <textarea name="mensaje" style="width:400px; height:100px">{$object->mensaje}</textarea></td></tr>
    <tr><td colspan="2">{$captcha}<br /><input class="btn btn-primary" type="submit" value="Enviar" /></td></tr></table>
    </fieldset>
    </form>


  8. Finalmente accedemos desde el navegador a work/contacto.php y vemos el formulario funcionando.
    modulo_contacto51923.jpg

Comments

Alerts There are not comments, be the first
Alerts To post comments, you must be a registered