Diferencia entre revisiones de «Ejemplo de reCAPTCHA en KumbiaPHP v2»
Línea 26: | Línea 26: | ||
<source lang=php > | <source lang=php > | ||
<?php | <?php | ||
− | // Incluimos el fichero con la | + | // Incluimos el fichero con la librería |
require_once APP_PATH. '/libs/recaptchalib.php'; | require_once APP_PATH. '/libs/recaptchalib.php'; | ||
− | + | /** | |
+ | * Clase para consumir el servicio anti-spam reCaptcha | ||
+ | * @author Soukron | ||
+ | */ | ||
class reCaptcha | class reCaptcha | ||
{ | { | ||
− | + | /** | |
− | + | * Clave Publica reCaptcha | |
− | + | * @var string | |
− | + | */ | |
− | + | private static $_publicKey = 'TU_CLAVE_PUBLICA'; | |
− | + | /** | |
− | + | * Clave Privada reCaptcha | |
+ | */ | ||
+ | private static $_privateKey = 'TU_CLAVE_PRIVADA'; | ||
− | + | /** | |
− | + | * Genera el HTML con el código reCaptcha | |
− | + | * | |
− | + | * @param $error | |
− | + | * @return string | |
− | + | */ | |
+ | public static function html($error = NULL) | ||
+ | { | ||
+ | return recaptcha_get_html(self::$_publicKey, $error); | ||
+ | } | ||
+ | /** | ||
+ | * Valida que el código colocado sea el correcto | ||
+ | * @return Response | ||
+ | */ | ||
+ | public static function validate() | ||
+ | { | ||
+ | $ret = recaptcha_check_answer (self::$_privateKey, | ||
+ | $_SERVER['REMOTE_ADDR'], | ||
+ | $_POST['recaptcha_challenge_field'], | ||
+ | $_POST['recaptcha_response_field']); | ||
− | + | return $ret; | |
− | + | } | |
} | } | ||
</source> | </source> |
Revisión del 18:40 21 jun 2010
Este Artículo esta siendo revisado por los Kumbieros. Puedes tomar la información que aqui se encuentra pero no nos hacemos responsable | {{{imageright}}} |
Sumario
Aviso
Este tutorial esta publicado tal cual. En el momento de la publicación, puedo decir que el código puesto funciona 100% ya que lo he validado yo mismo.
Si durante la vida del artículo sufre modificaciones que impiden su correcto funcionamiento, no puedo hacerme responsable. Digo esto porque en algún otro tutorial hecho, he visto cambios que han hecho que dejara de funcionar.
Pasos previos
Este ejemplo es la evolución del anterior tutorial sobre reCaptcha. Recomiendo encarecidamente leer primero el otro para entender el funcionamiento y posteriormente leer este.
Cosas que vamos a encontrar distintas:
- Se ha creado una librería para abstraer las funciones de generar un captcha y para comprobar una contestación. Asi podremos usarla desde otros controladores.
- Se ha creado una segunda vista, en lugar de dejar un simple echo como hice en el tutorial anterior.
Pasos
En el anterior tutorial sobre reCaptcha hacíamos toda la logica del reCaptcha en el controlador, lo cual, si solo era un único controlador no pasaba nada, pero de necesitarlo en más controladores, teníamos problemas.
Esta vez vamos a crear una librería que se encargue de todo: almacenar las keys, generar el HTML y validar la entrada del usuario. Dicho de otra forma, hemos creado una segunda capa de abstracción entre nuestra aplicación y reCaptcha: la primera es el propio API de reCaptcha y la segunda nuestra librería.
Creamos la libreria, app/libs/recaptcha.php:
<?php
// Incluimos el fichero con la librería
require_once APP_PATH. '/libs/recaptchalib.php';
/**
* Clase para consumir el servicio anti-spam reCaptcha
* @author Soukron
*/
class reCaptcha
{
/**
* Clave Publica reCaptcha
* @var string
*/
private static $_publicKey = 'TU_CLAVE_PUBLICA';
/**
* Clave Privada reCaptcha
*/
private static $_privateKey = 'TU_CLAVE_PRIVADA';
/**
* Genera el HTML con el código reCaptcha
*
* @param $error
* @return string
*/
public static function html($error = NULL)
{
return recaptcha_get_html(self::$_publicKey, $error);
}
/**
* Valida que el código colocado sea el correcto
* @return Response
*/
public static function validate()
{
$ret = recaptcha_check_answer (self::$_privateKey,
$_SERVER['REMOTE_ADDR'],
$_POST['recaptcha_challenge_field'],
$_POST['recaptcha_response_field']);
return $ret;
}
}
Con lo que nuestro controlador se simplifica de la siguiente forma app/controllers/captcha_controller.php:
<?php
Load::Lib("recaptcha");
class CaptchaController extends ApplicationController
{
public function index()
{
// Si vienen datos de formulario, los enviamos a la vista de nuevo
if ($this->has_post('Datos')) $this->Datos = $this->post('Datos');
// Comprobamos que se haya rellenado el reCAPTCHA
if ($this->has_post("recaptcha_response_field"))
{
// Realizamos la comprobacion
$ret = reCaptcha::validate();
if ($ret->is_valid) {
$this->Datos = $this->post('Datos');
$this->render("validado");
}
// Enviamos el error a la vista
$this->previousError = $ret->error;
}
}
}
En la vista, usaremos el otro método de la librería. La vista queda como sigue, app/views/captcha/index.phtml:
<strong>Rellena el cuadro con tu nombre: </strong>
<?php
echo form_tag('captcha/');
echo input_field_tag('Datos.nombre');
// Cargamos la librería y le pedimos un código html
Load::Lib("recaptcha");
echo reCaptcha::html($previousError);
echo submit_tag('Enviar datos');
?>
Y por último, para de paso mostrar el método render de KumbiaPHP, creamos la vista que se mostrará en cuanto validemos correctamente el captcha.
La vista es app/views/captcha/validado.phtml:
<strong>Hola <?php echo $Datos['nombre']; ?>, tu formulario ha sido enviado!</strong>
Prueba
Ya esta! Como en el anterior tutorial, puedes visitar la URL de tu controlador en http://<tuhost>/captcha y probarlo.
Espero que esté claro! Si no, podeis escribirme o localizarme en el IRC.
Saludos,
Soukron