Bonjour,

Je ne comprends pas comment mettre le script de la réponse reCaptcha dans ma page de formulaire PHP.

1) J'ai mis le code <script src='https://www.google.com/recaptcha/api.js'></script> avant la balise </head>
2) J'ai mis le code <div class="g-recaptcha" data-sitekey="ma clé publique"></div> à l'emplacement ou je veux voir le captcha à l'intérieur de la balise <form>
=> le captcha fonctionne.

Je reçois le mail même si je n'ai pas coché la case du captcha (c'est normal).

Pourriez-vous m'expliquer comment mettre le code réponse dans mon fichier (et lequel) car je ne comprends pas comment faire pour que le mail ne soit envoyé que si le captcha à été validé (https://translate.google.fr/translate?sl=en&tl=fr&js=y&prev=_t&hl=fr&ie=UTF-8&u=https%3A%2F%2Fdevelopers.google.com%2Frecaptcha%2Fdocs%2Fverify&edit-text=&act=url%29 ?)

Attention, j'ai deux fichier pour mon formulaire, 1 pour le formulaire lui-même et un pour celui qui exécute l'envoi (avec adresse destinataire et contenu du mail envoyé).

Mil merci pour votre aide...
Modifié par valttt (26 Apr 2017 - 09:06)
salut,

as tu vu cette doc ? https://developers.google.com/recaptcha/docs/verify

résumé de la doc :
tu as dans le formulaire un élément caché g-recaptcha-response qui contient un jeton pour avoir la réponse.

je prend un backend php pour le traitement du formulaire
à la validation du formulaire il y aura $_POST['g-recaptcha-response'] qui va contenir un jeton.
un appel HTTP avec la méthode POST sur le service de vérification (https://www.google.com/recaptcha/api/siteverify) fournit du JSON pour indiquer si la validation est OK ou pas.

en fonction de la réponse envoi ou pas de l'email

tu auras besoin de
curl
json_decode

@+
Modifié par moogliBZH (26 Apr 2017 - 13:09)
Merci beaucoup moogliBZH, pour ton aide.
J'ai effectivement lu les données fournis par google (ton lien), qui n'est autre que le même que le mien hormis que ce dernier était traduit... LOL
Ce n'est pas le principe du jeton que je ne comprends pas, c'est comment mettre (car débutant presque néophyte) le code (que je ne connais pas) dans mon fichier php.
J'ai suivi la première partie sans soucis (faire apparaitre le captcha), mais pour le reste, c'est un peu de l’hébreu pour moi...
Mon site web à été créé par un ami webaster aujourd'hui décédé. Je dois donc me débrouillé tout seul au fin fond de ma campagne pour pouvoir le faire évoluer (suite à un spam).

Encore merci
il faut commencer par savoir valider un formulaire html coté serveur.

par exemple : http://www.lephpfacile.com/cours/8-recuperer-les-donnees-des-formulaires

donc sur le fichier cible du formulaire
<?php
var_dump($_POST);


doit fournir le contenu du tableau $_POST dont une ligne avec g-recaptcha-response en index.
voici un exemple avec du code http://www.codexworld.com/new-google-recaptcha-with-php/
A priori l'api est accessible aussi en GET ce qui te simplifie la vie.

La même chose avec une méthode POST : https://www.kaplankomputing.com/blog/tutorials/recaptcha-php-demo-tutorial/

tu as tout ce qu'il te fout pour réaliser ta vérification Smiley cligne

@+
Merci beaucoup moogliBZH Smiley smile
Je vais regarder ça d'un œil attentif et vous tiens au courant si j'ai réussi ou pas...
Bonne après midi..
Merci pour votre aide.
J'ai suivi les indications des sites web indiqués, mais cela ne fonctionne pas.
Un message apparait toujours comme envoyé, même s'il ne l'est pas et de plus même si le captcha n'est pas coché.

Voici mon code d'origine (sans recaptcha):
<?php

	if(empty($_POST['name'])  		||
	   empty($_POST['email']) 		||
	   empty($_POST['message'])		||
	   empty($_POST['phone'])		||
	   empty($_POST['sex'])			||
	   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
	   {
		echo "Pas de données envoyées!";
		return false;
	   }
		
	$name = $_POST['name'];
	$sex = $_POST['sex'];
	$phone = $_POST['phone'];
	$email_address = $_POST['email'];
	$message = $_POST['message'];
		
	$to = 'mon adresse mail';
	$email_subject = "Envoi depuis le site";
	$email_body = "Site web.\n\n$sex $name\n\nEmail: $email_address\n\nTéléphone: $phone\n\nMessage:\n$message";
	$headers = "From: robot@adresse de mon site web\n";
	mail($to,$email_subject,$email_body,$headers);
	
	return true;
?>


Voici le code auquel j'ai apporter modifications:

<?php

	if(empty($_POST['name'])  		||
	   empty($_POST['email']) 		||
	   empty($_POST['message'])		||
	   empty($_POST['phone'])		||
	   empty($_POST['sex'])			||
	   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
	   {
		echo "Pas de données envoyées!";
		return false;
	   }
	
//Vérification du Captcha
if(isset($_POST['submit']) && !empty($_POST['submit'])):
    if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])):
        //your site secret key
        $secret = 'ma clé secrète';
        //get verify response data
        $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
        $responseData = json_decode($verifyResponse);
        if($responseData->success):
		
			//contact form submission code
			$name = $_POST['name'];
			$sex = $_POST['sex'];
			$phone = $_POST['phone'];
			$email_address = $_POST['email'];
			$message = $_POST['message'];
		
			$to = 'mon adresse mail';
			$email_subject = "Envoi depuis le site";
			$email_body = "Site web.\n\n$sex $name\n\nEmail: $email_address\n\nTéléphone: $phone\n\nMessage:\n$message";
			$headers = "From: robot@adresse de mon site web\n";
			mail($to,$email_subject,$email_body,$headers);
	
			return true;
			
		else:
            $errMsg = 'Erreur de vérification, veuillez réessayer.';
        endif;
    else:
        $errMsg = 'Merci de cocher la case.';
    endif;
else:
    $errMsg = '';
    $succMsg = '';
endif;

?>


Auriez-vous une idée sur les erreurs rencontrés (pas d'envoi (alors qu'un message me dit qu'il l'est, même si le captcha n'est pas coché) ?

Mil merci pour votre aide...
Modifié par valttt (28 Apr 2017 - 22:00)
J'ai aussi essayer avec un autre code, mais le message est bien envoyer sans avoir coché le Captcha, donc cela ne fonctionne pas.

<?php

	if(empty($_POST['name'])  		||
	   empty($_POST['email']) 		||
	   empty($_POST['message'])		||
	   empty($_POST['phone'])		||
	   empty($_POST['sex'])			||
	   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
	   {
		echo "Pas de données envoyées!";
		return false;
	   }
	
	// Vérification du Captcha
	$response = $_POST["g-recaptcha-response"];
	$url = 'https://www.google.com/recaptcha/api/siteverify';
	$data = array(
		'secret' => 'ma clé secrète',
		'response' => $_POST["g-recaptcha-response"]
	);
	$options = array(
		'http' => array (
			'method' => 'POST',
			'content' => http_build_query($data)
		)
	);
	$context  = stream_context_create($options);
	$verify = file_get_contents($url, false, $context);
	$captcha_success=json_decode($verify);
	if ($captcha_success->success==false) {
		echo "<p>Merci de valider le Test</p>";
	} else if ($captcha_success->success==true) {
		echo "<p>Le Test est validé</p>";
	}
		
			//contact form submission code
			$name = $_POST['name'];
			$sex = $_POST['sex'];
			$phone = $_POST['phone'];
			$email_address = $_POST['email'];
			$message = $_POST['message'];
		
			$to = 'mon adresse mail';
			$email_subject = "Envoi depuis le site";
			$email_body = "Site web.\n\n$sex $name\n\nEmail: $email_address\n\nTéléphone: $phone\n\nMessage:\n$message";
			$headers = "From: robot@adresse de mon site web\n";
			mail($to,$email_subject,$email_body,$headers);
	
			return true;
			
?>
Modérateur
Bonjour,

Normal que ton message soit envoyé malgré la réponse du Captcha. Dans ton code, tu conditionne le retour de $captcha_success sans y inclure l'envoi du mail.

Quelque soit la réponse de cette variable, ton mail prendra le chemin de sa destination.

Je verrais plus quelque-chose comme ceci pour que ça fonctionne

<?php

	if(empty($_POST['name'])  		||
	   empty($_POST['email']) 		||
	   empty($_POST['message'])		||
	   empty($_POST['phone'])		||
	   empty($_POST['sex'])			||
	   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
	   {
		echo "Pas de données envoyées!";
		return false;
	   }
	
	// Vérification du Captcha
	$response = $_POST["g-recaptcha-response"];
	$url = 'https://www.google.com/recaptcha/api/siteverify';
	$data = array(
		'secret' => 'ma clé secrète',
		'response' => $_POST["g-recaptcha-response"]
	);
	$options = array(
		'http' => array (
			'method' => 'POST',
			'content' => http_build_query($data)
		)
	);
	$context  = stream_context_create($options);
	$verify = file_get_contents($url, false, $context);
	$captcha_success=json_decode($verify);
/*




  Jusqu'ici tout va bien (c'est perfectible mais disons ça comme ça pour l'instant),
  Mais c'est la suite qui pêche


*/
	if ($captcha_success->success==false) {
		echo "<p>Merci de valider le Test</p>";
	} else if ($captcha_success->success==true) {
		echo "<p>Le Test est validé</p>";
/*	}  <= CETTE ACCOLADE EST A PLACER PLUS BAS DANS LE CODE */
		
			//contact form submission code
			$name = $_POST['name'];
			$sex = $_POST['sex'];
			$phone = $_POST['phone'];
			$email_address = $_POST['email'];
			$message = $_POST['message'];
		
			$to = 'mon adresse mail';
			$email_subject = "Envoi depuis le site";
			$email_body = "Site web.\n\n$sex $name\n\nEmail: $email_address\n\nTéléphone: $phone\n\nMessage:\n$message";
			$headers = "From: robot@adresse de mon site web\n";
			mail($to,$email_subject,$email_body,$headers);
	
			return true;
			
?>


	if(empty($_POST['name'])  		||
	   empty($_POST['email']) 		||
	   empty($_POST['message'])		||
	   empty($_POST['phone'])		||
	   empty($_POST['sex'])			||
	   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
	   {
		echo "Pas de données envoyées!";
		return false;
	   }
	
	// Vérification du Captcha
	$response = $_POST["g-recaptcha-response"];
	$url = 'https://www.google.com/recaptcha/api/siteverify';
	$data = array(
		'secret' =&gt; 'ma clé secrète',
		'response' =&gt; $_POST["g-recaptcha-response"]
	);
	$options = array(
		'http' =&gt; array (
			'method' =&gt; 'POST',
			'content' =&gt; http_build_query($data)
		)
	);
	$context  = stream_context_create($options);
	$verify = file_get_contents($url, false, $context);
	$captcha_success=json_decode($verify);
	if ($captcha_success-&gt;success==false) {
		echo "&lt;p&gt;Merci de valider le Test&lt;/p&gt;";
	} else if ($captcha_success-&gt;success==true) {
		echo "&lt;p&gt;Le Test est validé&lt;/p&gt;";
	}
		
			//contact form submission code
			$name = $_POST['name'];
			$sex = $_POST['sex'];
			$phone = $_POST['phone'];
			$email_address = $_POST['email'];
			$message = $_POST['message'];
		
			$to = 'mon adresse mail';
			$email_subject = "Envoi depuis le site";
			$email_body = "Site web.\n\n$sex $name\n\nEmail: $email_address\n\nTéléphone: $phone\n\nMessage:\n$message";
			$headers = "From: robot@adresse de mon site web\n";
			mail($to,$email_subject,$email_body,$headers);
	} /* L'ACCOLADE EST A PLACER AU MOINS ICI */
			return true; /* Nous sommes dans une fonction là pour que tu demandes à retourner true ? */
			
?>

C'est perfectible, pour ne pas dire bordélique, mais ça devrait marcher.
Smiley eek Bordélique, quoi ? Bordélique ? Smiley eek
C'est pas faux !!! Smiley lol

A force de faire des bidouille pour que cela fonctionne, c'est pas étonnant venant d'un mec comme moi qui n'y connais rien.... Smiley biggol

Je vais essayer...
Merci pour ton aide
Modérateur
Si ça peut aider, voici ce que je te propose pour structurer ton code. Néanmoins je ne sais pas comment tu intègre ce bout de code, si c'est un fichier de traitement indépendant, une fonction ou in fine dans la page du formulaire.

1) Récupère les variables envoyée par le navigateur une à une (if(!empty))
- Pour chaque variable indispensable tu teste son existence, tu la sécurise et tu vérifie que la donnée reçue correspond au format requis (est-ce une adresse mail, un nombre, des caractères alphabétiques etc ?)*
- Pour chacune d'elle, si le format correspond, tu charge une variable interne ($_POST['machin'] devient $machin) sinon tu sors du script et renvoi un message d'erreur**
- Ensuite tu t'occupe des variables non indispensables : Faille-t-il réellement que le sexe soit renseigné pour envoyer le mail ?

* Au vu de son importance, je te conseille de commencer par le captcha.
** il est possible de charger les erreurs dans un tableau pour renvoyer un compte rendu de toutes les erreurs observées à la fin du traitement mais avant l'envoi de mail.

2) Supprime les données envoyées par le navigateur

3) Prépare le mail à envoyer

4) Exécute la fonction d'envoi
- Si envoi ok => RAS TVB
- Si envoi nok => envoi d'un message d'erreur (retour utilisateur ET webmestre)


Là encore ça reste perfectible et je dois t'avouer qu'à titre personnel s'ajoutent encore quelques étapes mais ceci constitue une bonne base.

C'est à peu de choses près le même schéma pour tout code : vérif des données, préparation des tâches, exécution, affichage du résultat.
Merci pour votre aide, je reviendrai vers vous dès que j'aurai pu effectuer les tests... Smiley cligne
Modifié par valttt (04 May 2017 - 19:16)