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