Google reCAPTCHA - keep getting `incorrect-captcha-sol`

41,522

Solution 1

I have solved this, it is one of the most unusual things I have come across, my syntax was previously:

<table>
  <form>
    <tr><td></td></tr>
  </form>
</table>

I changed it to this:

<form>
  <table>
    <tr><td></td></tr>
  </table>
</form>

Because of this switch, suddenly the recaptcha_response_field and recaptcha_challenge_field are posting values back to the form.

I cannot think why this because all MY form variables got posted back before the switch.

Thanks all for the pointers.

Solution 2

Are You doing this from Your Localhost?

I solve this problem by adding localhost to the allowed domain for doing a verification in google reCaptcha settings

Domain reCaptcha Settings

Solution 3

if you are posting the check twice - eg once from javascript and once via php the second one will fail as the API only allows a solution to return valid once.

Hope that helps, Josh

Solution 4

That's because the form cannot be on the outside of the tr.....it has to be on the outisde of table.....form cannot be inserted into table, it can be inserted into the td though.

Solution 5

In my case, the error was to set the form without specifying:

method="POST"

Cheers!

Share:
41,522
Anriëtte Myburgh
Author by

Anriëtte Myburgh

I am a full-time PHP front-end developer and am proficient in HTML, jQuery, PHP &amp; Joomla and develop templates and components using mainly the Bootstrap CSS framework to enable rapid responsiveness.

Updated on July 09, 2022

Comments

  • Anriëtte Myburgh
    Anriëtte Myburgh almost 2 years

    I am trying to add a reCAPTCHA to my site, but keep getting incorrect-captcha-sol error when I submit the answer.

    Can anyone tell me if I am correct in doing the following?

    I have a generic index.php, which includes contact.php. In contact.php I have inserted the following code:

    require_once('recaptchalib.php');
    $publickey = "XXXX";
    $privatekey = "XXXX";
    
    //the response from reCAPTCHA
    $resp = null;
    //the error code from reCAPTCHA, if any
    $error = null;
    
    if ($_POST['submit']) {
        $message = $_POST['message_txt'];
        $name = $_POST['name_txt'];
        $email = $_POST['email_txt'];
        
        $emailBody = $message;
        $to = 'xx';
        $from = $name.' <'.$email.'>';
        $subject = 'XX Website Enquiry';
        $headers = 'From: '.$from;  
            
        $resp = recaptcha_check_answer($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
        
        if ($resp->is_valid) {
            echo 'captcha correct';
            if (mail($to,$subject,$emailBody,$headers)) {
                //echo 'mail sent';
                $confirmation = 'sent';
            }
            else {
                //echo 'mail not sent';
                $confirmation = 'error';
            }
        } else {
            # set the error code so that we can display it. You could also use
            # die ("reCAPTCHA failed"), but using the error message is
            # more user friendly
            
            $error = $resp->error;
            
            echo $error;
        }
    }
    

    In my html I inserted the CAPTCHA like this:

    <form name="contactForm" method="post" action="index.php?id=contact&action=submit#contact">
        <tr><td>Name</td><td><div align="right">
            <input type="text" name="name_txt" class="input">
            </div></td></tr>
        <tr><td>Email</td><td><div align="right">
            <input type="text" name="email_txt" class="input">
        </div></td></tr>
        <tr><td height="10"></td></tr>
        <tr><td colspan="2">Message</td></tr>
        <tr><td colspan="2"><textarea name="message_txt" class="textarea" style="width:200px; height:100px"></textarea></td></tr>
        <tr><td colspan="2"><?php echo recaptcha_get_html($publickey, $error); ?></td></tr>
        <tr><td colspan="2" style="padding-top:10px;"><input type="image" src="images/header_06.gif" name="submit" value="submit"></td></tr>
    </form>
    

    I cannot see that I am doing anything wrong, but would appreciate any help.