2015-05-02 10 views
41

Ich habe es geschafft, ReCaptcha 2.0 in meiner Website arbeiten zu lassen. Es funktioniert jedoch nur, wenn ich AJAX nicht verwende und ich das Formular "natürlich" einreichen lasse.ReCaptcha 2.0 Mit AJAX

Ich möchte das Formular mit dem Captcha senden und den Benutzer mit einer Erfolgsmeldung warnen, ohne die Seite zu aktualisieren.

Ich habe versucht, den folgenden Code, aber es scheint, als ob der Server die Benutzerantwort bekommt:

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'; 
    } 
?> 

Das Ergebnis in der PHP-Seite:

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

Unterm Strich ist, wie kann ich die Eingangsantwort manuell erhalten, ohne es automatisch mit dem Rest der POST-Daten gehen?

+0

Was bekommen Sie für 'grecaptcha.getResponse()' in der Konsole? leer? – Samurai

+0

@ Samurai Yup. Deshalb denke ich, dass das Problem da ist. – Gofilord

+1

Nun, wenn es nicht verifiziert ist, wird es leer zurückgegeben (nicht beantwortet oder falsch beantwortet). Aber nach der Überprüfung sollten Sie eine ziemlich lange Zeichenfolge erhalten. – Samurai

Antwort

23

Ok, das war ziemlich albern.

Ich habe ein paar Dinge falsch gemacht:

  • In der PHP-Datei, alle Saiten auf ihnen einfache Anführungszeichen hatte, und das verursacht Probleme.
  • Während der Tests, fügte ich mehrere Drucke von Dingen in der PHP-Datei, so dass die if (status == "ok") hat nie funktioniert. Ich habe die E-Mails bekommen, aber ich habe keine Bestätigung erhalten, und jetzt verstehe ich warum.
  • Als ich überprüfen wollte, was die PHP-Datei weggelassen hatte, ging ich einfach zu seiner Adresse in der URL und bekam immer einen Fehler. Auch wenn die Mails verschickt wurden. Jetzt verstehe ich, dass das nicht die richtige Art ist, die Protokolle zu überprüfen.

Dank @Samurai, die mir geholfen haben, die Dinge herauszufinden.


Finale PHP-Code:

<?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

Könnten Sie bitte den endgültigen Code/Markup hier angeben, um Ihre eigene Antwort zu ergänzen? – elmimmo

+0

Nur eingeloggt, um Ihnen zu danken, Alter! Btw, in der PHP-Code, nach dem ersten "echo" nicht ok ";" innerhalb der 'if' Anweisung sollten Sie einen' exit; 'Befehl setzen. –

+0

@joao_pimentel Warum? – Gofilord

0

Meinen Sie diese Dollar-Zeichen in Ihrem Javascript haben? Wenn ja, wie kommt es?

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

Dies liefert keine Antwort auf die Frage. Sie können [ähnliche Fragen suchen] (// stackoverflow.com/search) oder auf die verwandten und verknüpften Fragen auf der rechten Seite der Seite verweisen, um eine Antwort zu finden. Wenn Sie eine verwandte, aber andere Frage haben, [stellen Sie eine neue Frage] (// stackoverflow.com/questions/ask), und fügen Sie einen Link zu diesem ein, um den Kontext zu verdeutlichen. Siehe: [Stellen Sie Fragen, erhalten Sie Antworten, keine Ablenkungen] (// stackoverflow.com/tour) –

+0

'$ ('# status')' ist ein Selektor für eine JavaScript-Bibliothek namens [jQuery] (https://jquery.com /). Das Benennen von Variablen mit einem Dollarzeichen ist auch in Ordnung, 'var $ errors' ist vollständig gültig und funktioniert in nativem JavaScript. –

+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/18877553) –