2015-05-02 4 views
41

Sono riuscito a far funzionare ReCaptcha 2.0 nel mio sito web. Tuttavia, funziona solo quando non uso AJAX e lascio che il modulo venga inviato "naturalmente".ReCaptcha 2.0 con AJAX

Desidero inviare il modulo con il captcha e avvisare l'utente con una nota di successo senza aggiornare la pagina.

Ho provato il seguente codice, ma sembra che il server non ottiene la risposta degli utenti:

HTML:

<form class="form" action="javascript:void(0)" novalidate> 
    <!-- all the inputs... --> 

    <!-- captcha --> 
    <div class="input-group"> 
     <div class="g-recaptcha" data-sitekey="6LdOPgYTAAAAAE3ltWQGar80KUavaR-JblgPZjDI"></div> 
    </div> 

    <div class="errors" id="errors" style="display: none"></div> 

    <div class="input-group"> 
     <input type="button" value="Send" class="btn-default right" id="submit"> 
     <div class="clear"></div> 
    </div> 
</form> 

JS:

$('#submit').click(function(e) { 
    console.log('clicked submit'); // --> works 

    var $errors = $('#errors'), 
     $status = $('#status'), 

     name = $('#name').val().replace(/<|>/g, ""), // prevent xss 
     email = $('#email').val().replace(/<|>/g, ""), 
     msg = $('#message').val().replace(/<|>/g, ""); 

    if (name == '' || email == '' || msg == '') { 
     valid = false; 
     errors = "All fields are required."; 
    } 

    // pretty sure the problem is here 
    console.log('captcha response: ' + grecaptcha.getResponse()); // --> captcha response: 

    if (!errors) { 
     // hide the errors 
     $errors.slideUp(); 
     // ajax to the php file to send the mail 
     $.ajax({ 
      type: "POST", 
      url: "http://orenurbach.com/assets/sendmail.php", 
      data: "email=" + email + "&name=" + name + "&msg=" + msg + "&g-recaptcha-response=" + grecaptcha.getResponse() 
     }).done(function(status) { 
      if (status == "ok") { 
       // slide down the "ok" message to the user 
       $status.text('Thanks! Your message has been sent, and I will contact you soon.'); 
       $status.slideDown(); 
       // clear the form fields 
       $('#name').val(''); 
       $('#email').val(''); 
       $('#message').val(''); 
      } 
     }); 
    } else { 
     $errors.text(errors); 
     $errors.slideDown(); 
    } 
}); 

PHP:

<?php 
    // assemble the message from the POST fields 

    // getting the captcha 
    $captcha = ''; 
    if (isset($_POST['g-recaptcha-response'])) 
     $captcha = $_POST['g-recaptcha-response']; 
    echo 'captcha: '.$captcha; 

    if (!$captcha) 
     echo 'The captcha has not been checked.'; 
    // handling the captcha and checking if it's ok 
    $secret = 'MY_SECRET'; 
    $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true); 

    var_dump($response); 

    // if the captcha is cleared with google, send the mail and echo ok. 
    if ($response['success'] != false) { 
     // send the actual mail 
     @mail($email_to, $subject, $finalMsg); 

     // the echo goes back to the ajax, so the user can know if everything is ok 
     echo 'ok'; 
    } else { 
     echo 'not ok'; 
    } 
?> 

Il risultato nella pagina PHP:

captcha: The captcha has not been checked.array(2) { ["success"]=> bool(false) ["error-codes"]=> array(1) { [0]=> string(22) "missing-input-response" } } not ok 

Linea di fondo è, come posso ottenere la risposta di ingresso manualmente senza andando automaticamente con il resto dei dati POST?

+0

Cosa si ottiene per 'grecaptcha.getResponse()' nella console? vuoto? – Samurai

+0

@Samurai Yup. Ecco perché penso che il problema sia lì. – Gofilord

+1

Bene, a meno che non venga verificato, restituisce vuoto (non risponde o risponde erroneamente). Ma dopo la verifica dovresti ottenere una stringa abbastanza lunga. – Samurai

risposta

23

Ok, questo era abbastanza stupido.

Ho fatto un paio di cose sbagliate:

  • Nel file PHP, tutte le corde avevano apici su di loro, e che ha causato problemi.
  • Durante il test, ho aggiunto più stampe di cose nel file PHP, quindi il if (status == "ok") non funzionava mai. Ho ricevuto le e-mail ma non ho ottenuto alcuna conformazione che ho fatto e ora capisco perché.
  • Quando volevo controllare che cosa stava omettendo il file PHP, sono semplicemente andato al suo indirizzo nell'URL e ho sempre ricevuto un errore. Anche quando le mail sono state inviate. Ora capisco che non è il modo corretto di controllare i registri.

Grazie a @Samurai che ha aiutato a capire le cose.


codice PHP finale:

<?php 
    // assemble the message from the POST fields 

    // getting the captcha 
    $captcha = ""; 
    if (isset($_POST["g-recaptcha-response"])) 
     $captcha = $_POST["g-recaptcha-response"]; 

    if (!$captcha) 
     echo "not ok"; 
    // handling the captcha and checking if it's ok 
    $secret = "MY_SECRET"; 
    $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER["REMOTE_ADDR"]), true); 

    // if the captcha is cleared with google, send the mail and echo ok. 
    if ($response["success"] != false) { 
     // send the actual mail 
     @mail($email_to, $subject, $finalMsg); 

     // the echo goes back to the ajax, so the user can know if everything is ok 
     echo "ok"; 
    } else { 
     echo "not ok"; 
    } 
?> 
+2

Potresti fornire il codice/markup finale qui per completare la tua risposta? – elmimmo

+0

Appena loggato per ringraziarti amico! Btw, nel codice php, dopo il primo 'echo" non ok ";' all'interno dell'istruzione 'if' dovrai inserire un comando' exit; –

+0

@joao_pimentel Perché? – Gofilord

0

Cercavi di avere questi segni del dollaro in Javascript? Se sì, come mai?

var $errors = $('#errors'), 
$status = $('#status'), 
+0

Questo non fornisce una risposta alla domanda. Puoi [cercare domande simili] (// stackoverflow.com/search), o fare riferimento alle domande correlate e collegate sul lato destro della pagina per trovare una risposta. Se hai una domanda correlata ma diversa, [fai una nuova domanda] (// stackoverflow.com/questions/ask) e includi un collegamento a questo per aiutare a fornire il contesto. Vedi: [Fai domande, ottieni risposte, senza distrazioni] (// stackoverflow.com/tour) –

+0

'$ ('# status')' è un selettore per una libreria JavaScript chiamata [jQuery] (https://jquery.com /). Anche le variabili di denominazione con un simbolo del dollaro vanno bene, 'var $ errors' è pienamente valido e funziona in JavaScript nativo. –

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18877553) –