reCAPTCHA y PHP

Por qué un ejemplo
He visto notas de varios lugares donde se pide aviso o ayuda sobre cómo usar el plugin PHP de reCAPTCHA en un formato de contacto. El uso es sencillo si se han desarrollado proyectos en PHP anteriormente, pero si el uso de PHP es nuevo entonces la aplicación no es tan clara.

A continuación un ejemplo breve de cómo usar reCAPTCHA en un formato, manteniendo la información ingresada por el usuario y desplegando algún mensaje de error (en caso de error), o mostrar agradecimiento de ponerse en contacto.

No hay blog, no hay entradas para comentar.

P.D.: En la primera versión no incluí una manera de procesar los datos del mensaje. Corregido: incluir mail().

Nota: mail() sólo revisa si se ha preparado un mensaje de correo, no hay manera de saber si un mensaje fue enviado o no

El ejemplo

El código
<?php
require_once('recaptchalib.php');

/* Obtener llaves en http://recaptcha.net/api/getkey */
$publickey = '';
$privatekey = '';

/* Por si acaso */
$mensaje_error = '';
/* El cuerpo final del formato */
$formato = '';

/* Hay que tener presente que la primera vez que un visitante entra a la página
 * $_POST estará vacío
 */

/* Si existe $_POST["recaptcha_challenge_field"] entonces es necesario revisar
 * si los campos 'requeridos' han sido llenados
 */
if ($_POST['recaptcha_challenge_field'])
{
	if (!$_POST['su_nombre'])
		$mensaje_error .= 'Por favor escriba su nombre<br />';

	if (!$_POST['su_info'])
		$mensaje_error .= 'Por favor escriba alguna información<br />';

	if (!$_POST['recaptcha_response_field'])
		$mensaje_error .= 'Por favor resuelva nuevamente el reCAPTCHA<br />';

	/* recaptcha_check_answer() es llamada SÓLO si no hay errores */
	if (!$mensaje_error)
	{
		$resp = recaptcha_check_answer ($privatekey,
			$_SERVER['REMOTE_ADDR'],
			$_POST['recaptcha_challenge_field'],
			$_POST['recaptcha_response_field']);

		/* Si la respuesto no es válida */
		if (!$resp->is_valid)
		{
			/* $mensaje_error .= $resp->error . '<br />'; */
			$mensaje_error .= 'Por favor resuelva nuevamente el reCAPTCHA<br />';
		}
	}
}

/* Terminada la revisión de errores, ahora seleccionar qué hacer:
 * Si la respuesta es correcta: agradecimiento. En caso contrario: nuevo formato
 */
if ($resp->is_valid)
{
	$destinatario = 'destinatario@ejemplo.com';
	$asunto = 'Contacto solicitado por ' . $_POST['su_nombre'];
	$mensaje = $_POST['su_info'];

	if (mail($destinatario,$asunto,$mensaje))
		$formato = "<center>Su mensaje ha sido enviado.<br />Gracias</center>";
	else
		$formato = "<center>Su mensaje no pudo ser enviado.<br />Intente nuevamente</center>";
}
else
{
	$html_para_mostrar_recaptcha = recaptcha_get_html($publickey, $resp->$error);
	
	/* $mensaje_error y $html_para_mostrar_recaptcha serán expandidas en las cadenas de texto respectivas
	 *
	 * htmlspecialchars() para convertir caracteres reconocidos por HTML en sus entidades equivalentes
	 * 		Si es muy usada esta función, hay que considerar en declarar:
	 *		function hsc(txt) { return htmlspecialchars(txt); }
	 *
	 * nl2br() para convertir caracteres de nueva línea en <br> o <br/> y sean interpretados en HTML
	 */
	$formato = "$mensaje_error<form action='' method='post'>
    Nombre: <input type='text' name='su_nombre' value='" . htmlspecialchars($_POST['su_nombre']) . "'/><br/>
    Info: <textarea name='su_info'>" . nl2br(htmlspecialchars($_POST['su_info'])) . "</textarea>
    <br/>
    $html_para_mostrar_recaptcha
    <input type='submit' value='Enviar' />
    </form>";
}

/* Habiendo creado el cuerpo del formato, podemos desplegarlo sin alterar el resto de los
 * campos originales de la página, como Banner, Menú, pie de página.
 */
?>
<html>
	<body>
    	<?php echo $formato; ?>
	</body>
</html>
XHTML 1.0 Transicional Válido - W3C
CSS Válido - W3C
Inicio | Servicios | Contacto