web-dev-qa-db-fra.com

Recaptcha ne vérifie pas avec file_get_contents

Vous ne savez pas pourquoi cela ne fonctionne pas. Lorsque le formulaire est envoyé, j'obtiens le message d'erreur, ce qui signifie que ma vérification de recaptcha a échoué.

De ma forme:

<div class="g-recaptcha" data-sitekey="(site-key)"></div>

PHP:

if(isset($_POST['g-recaptcha-response'])){
      $captcha=$_POST['g-recaptcha-response'];
    }

$secretKey = "(secret-key)";
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$captcha);
$responseKeys = json_decode($response,true);
if(intval($responseKeys["success"]) === true) {
    echo '<h3>Thanks for your message!</h3>';
} else {
    echo '<h3>Error</h3>';
    }
11
Claire

La documentation reCaptcha en particulier spécifie que les paramètres de la demande à https://www.google.com/recaptcha/api/siteverify doit être envoyé via POST. Vous pouvez utiliser CURL pour cela.

$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => [
        'secret' => $secretKey,
        'response' => $captcha,
        'remoteip' => $_SERVER['REMOTE_ADDR']
    ],
    CURLOPT_RETURNTRANSFER => true
]);

$output = curl_exec($ch);
curl_close($ch);

$json = json_decode($output);

// check response...
26
Yemiez

N'utilisez pas file_get_contents. Google suggère d'utiliser POST requêtes. Vous pouvez utiliser quelque chose dans les lignes de ce qui suit

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => array(
        'secret' => $secretKey,
        'response' => $captcha
    )
));
$response = curl_exec($curl);
curl_close($curl);

if(strpos($response, '"success": true') !== FALSE) {
    echo '<h3>Thanks for your message!</h3>';
} else {
    echo "<h3>Error</h3>";
}

MODIFIER

La réponse de Yemiez (qui vient de me mettre au coin) est meilleure pour gérer la partie réponse, en utilisant le json_decode fonction.

MODIFIER vient de corriger une faute de frappe

8
Orestis Samaras
if(isset($_POST['g-recaptcha-response'])){  
    $captcha=$_POST['g-recaptcha-response'];  
}  
$recaptcha_secret = '(secret-key)';  
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$captcha);  
$response = json_decode($response, true);  
if(!empty($response["success"]))  
{  
    echo 'Thanks for your message!';  
} else {  
    echo 'Error';  
}  
1
Deeraj T

L'utilisation de file_get_contents Fonctionne toujours actuellement pour confirmer le reCaptcha; bien que non recommandé. Je crois que le problème avec votre code réside dans le code à:

if(intval($responseKeys["success"]) === true) {
    echo '<h3>Thanks for your message!</h3>';
} else {
    echo '<h3>Error</h3>';
}

Supprimez la intval() car cela n'est pas nécessaire et transforme votre valeur booléenne en entier. Le === Compare également le type de sorte que la réponse sera toujours convertie en entier et bien sûr false par rapport au booléen true. Soit cela, soit changez true en 1. Il devrait donc être:

if($responseKeys["success"] === true) {
    echo '<h3>Thanks for your message!</h3>';
} else {
    echo '<h3>Error</h3>';
}
0
Dawson Irvine