He intentado durante la mayor parte del día que esto funcione, pero parece que no todos funcionan completamente con mi código. Tengo un script de sendmail que funciona perfectamente y solo quiero agregar el reCaptcha de Google. Hasta ahora, no enviará el formulario de contacto a menos que la casilla de verificación esté marcada, pero si no está marcada, mis validadores de campo no funcionan y no hay una alerta para decirle al usuario que verifique el reCaptcha. Pero si se completan todos los campos y se marca la casilla de verificación, se hace eco del mensaje de éxito.

Probé tantos trucos en Google y traté de seguir los documentos del desarrollador de Google, pero parece que no puedo decodificar mi respuesta correctamente y obtener las declaraciones if, else correctamente.

//Checking For reCAPTCHA
$captcha;
if (isset($_POST['g-recaptcha-response'])) {
$captcha = $_POST['g-recaptcha-response'];
}
// Checking For correct reCAPTCHA
$response = 
file_get_contents("https://www.google.com/recaptcha/api/siteverify? 
secret=SECRETKEY&response=" . $captcha . "&remoteip=" . 
$_SERVER['REMOTE_ADDR']);
if (!$captcha || $response.success == false) {
echo "Your CAPTCHA response was wrong.";
exit ;
} else {

session_cache_limiter( 'nocache' );
header( 'Expires: ' . gmdate( 'r', 0 ) );
header( 'Content-type: application/json' );
$to         = 'hi@shanemuirhead.co.uk';  // put your email here
$email_template = 'simple.html';
$subject    = strip_tags($_POST['vsubject']);
$email       = strip_tags($_POST['vemail']);
$name       = strip_tags($_POST['vname']);
$message    = nl2br( htmlspecialchars($_POST['vmessage'], ENT_QUOTES) );
$result     = array();

if(empty($name)){
    $result = array( 'response' => 'error', 'empty'=>'name', 'message'=>'<strong>Error!</strong>&nbsp; Name is empty.' );
    echo json_encode($result );
    die;
} 
if(empty($email)){
    $result = array( 'response' => 'error', 'empty'=>'email', 'message'=>'<strong>Error!</strong>&nbsp; Email is empty.' );
    echo json_encode($result );
    die;
} 
if(empty($message)){
     $result = array( 'response' => 'error', 'empty'=>'message', 'message'=>'<strong>Error!</strong>&nbsp; Message body is empty.' );
     echo json_encode($result );
     die;
}



$headers  = "From: " . $name . ' <' . $email . '>' . "\r\n";
$headers .= "Reply-To: ". $email . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$templateTags =  array(
    '{{subject}}' => $subject,
    '{{email}}'=>$email,
    '{{message}}'=>$message,
    '{{name}}'=>$name
    );
$templateContents = file_get_contents( dirname(__FILE__) . '/inc/'.$email_template);
$contents =  strtr($templateContents, $templateTags);
if ( mail( $to, $subject, $contents, $headers ) ) {
    $result = array( 'response' => 'success', 'message'=>'<strong>Thank You!</strong>&nbsp; Your email has been delivered.' );
} else {
    $result = array( 'response' => 'error', 'message'=>'<strong>Error!</strong>&nbsp; Cann\'t Send Mail.'  );
}
echo json_encode( $result );
die;
}

Solo quiero alertar al usuario si reCatpcha no está marcado y enviar si lo está, también sería bueno que todo mi sendmail.php funcione correctamente. es decir, si el nombre, el correo electrónico o el mensaje están vacíos, repita un mensaje, ¿parece que los están perdiendo?

0
Shane Muirhead 5 feb. 2019 a las 19:32

2 respuestas

La mejor respuesta
$response = 
file_get_contents("https://www.google.com/recaptcha/api/siteverify? 
secret=SECRETKEY&response=" . $captcha . "&remoteip=" . 
$_SERVER['REMOTE_ADDR']);
$s = json_decode($response);
if (!$captcha || $s.success == false) {
echo "Your CAPTCHA response was wrong.";
exit ;

Pruebe esto, es posible que acceder directamente a esta $ respuesta no funcione, ¿ha intentado registrar qué $ respuesta es del depurador?

0
Tenza 5 feb. 2019 a las 17:27
<?php

session_cache_limiter( 'nocache' );
header( 'Expires: ' . gmdate( 'r', 0 ) );
header( 'Content-type: application/json' );
$to         = 'hi@shanemuirhead.co.uk';  // put your email here
$email_template = 'simple.html';
$subject    = strip_tags($_POST['vsubject']);
$email       = strip_tags($_POST['vemail']);
$name       = strip_tags($_POST['vname']);
$message    = nl2br( htmlspecialchars($_POST['vmessage'], ENT_QUOTES) );
$result     = array();


    if(empty($email)){
        $result = array( 'response' => 'error', 'empty'=>'email', 'message'=>'<strong>Error!</strong>&nbsp; Email is empty.' );
        echo json_encode($result );
        die;
    } 
    if(empty($name)){
        $result = array( 'response' => 'error', 'empty'=>'name', 'message'=>'<strong>Error!</strong>&nbsp; Name is empty.' );
        echo json_encode($result );
        die;
    } 
    if(empty($message)){
         $result = array( 'response' => 'error', 'empty'=>'message', 'message'=>'<strong>Error!</strong>&nbsp; Message body is empty.' );
         echo json_encode($result );
         die;
    }
    if(empty($_POST['g-recaptcha-response']))  {
        $result = array( 'response' => 'error', 'empty'=>'message', 'message'=>'<strong>Error!</strong>&nbsp; Please complete the Captcha.' );
         echo json_encode($result );
         die;
    }

    if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])) {
        $secret = '6LeSSI0UAAAAAFnwmu5cj7bk4guiaoXXnlID5-C2';
        $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
        $responseData = json_decode($verifyResponse);
        if($responseData->success == true) {
    $headers  = "From: " . $name . ' <' . $email . '>' . "\r\n";
    $headers .= "Reply-To: ". $email . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    $templateTags =  array(
        '{{subject}}' => $subject,
        '{{email}}'=>$email,
        '{{message}}'=>$message,
        '{{name}}'=>$name
        );
    $templateContents = file_get_contents( dirname(__FILE__) . '/inc/'.$email_template);
    $contents =  strtr($templateContents, $templateTags);
    if ( mail( $to, $subject, $contents, $headers ) ) {
        $result = array( 'response' => 'success', 'message'=>'<strong>Thank You!</strong>&nbsp; Your email has been delivered.' );
    } else {
        $result = array( 'response' => 'error', 'message'=>'<strong>Error!</strong>&nbsp; Can\'t Send Mail.'  );
    }
    echo json_encode( $result );
    die;

        }
        else
        {
            echo "<p> Sorry verification valid</p>";
        }
   }
?>

Entonces, con un poco de juego y leyendo mi código para mí mismo, he podido hacer que todo funcione, ¡excepto que no estoy seguro de cómo restablecer el captcha!

Así que al final conseguí que todos los validadores de campo vacíos funcionen, después de que se cumplan las condiciones, alerta al usuario para que marque el captcha si aún no lo ha hecho y solo entonces enviará el envío del formulario y alertará al usuario del mensaje de éxito. El único problema ahora es restablecer el captcha.

0
Shane Muirhead 6 feb. 2019 a las 15:11