3. Vérifier la solution CAPTCHA
✅ Un exemple complet de backend fonctionnel se trouve au bas de cette page.
- Vérification côté serveur
- Exemple de Curl
- Réponse de l'API
- Résumé de la réponse à la requête POST
- Exemples complets de backend (PHP, Python, Node...)
La vérification de la solution (jeton) fonctionne de la même manière qu'avec Google reCAPTCHA et hCaptcha. Seule la réponse de l'API est légèrement différente et contient plus d'informations. Vous pouvez également vérifier les adresses électroniques dans le même appel API.
Vérification côté serveur
Souvenez-vous de la clef secrète
qui a été automatiquement générée avec la sitekey
. Cette clef secrète
est nécessaire pour vérifier la solution CAPTCHA avec l'API afin de s'assurer qu'elle est bien réelle et valide.
Pour vérifier la solution CAPTCHA, faites une demande POST à
https://www.zencaptcha.com/captcha/siteverify
avec les paramètres suivants :
Post paramètre | Description |
---|---|
response | La solution (zenc-captcha-solution ) du CAPTCHA. |
secret | Votre clé secrète (qui correspond à la sitekey du widget) |
Optionnel: Adresse email de l'utilisateur. - Alternativement, vous pouvez simplement fournir le nom de domaine de l'email (pour un maximum de confidentialité : example.com). |
N'utilisez pas de requête GET pour appeler /siteverify (ou cela échouera).
Exemple Curl
Modifiez CAPTCHA-SOLUTION et VOTRE-CLÉ-SECRÈTE avec vos valeurs :
curl https://www.zencaptcha.com/captcha/siteverify
-X POST
-H "Content-Type: application/x-www-form-urlencoded"
-d 'response=CAPTCHA-SOLUTION&secret=VOTRE-CLÉ-SECRÈTE'
Pour vérifier le jeton zenc-captcha-solution
envoyé depuis votre HTML frontend vers votre backend, le point de terminaison requiert une requête POST avec deux paramètres - votre clé secrète
et le jeton zenc-captcha-solution
. Vous pouvez optionnellement inclure l'adresse email de l'utilisateur &email=xxx@example.com
pour vérifier si l'utilisateur utilise une adresse email jetable ou invalide. Cette option n'est disponible que pour les plans payants.
Réponse de l'API
La réponse de vérification
La réponse à la requête POST indique si la solution CAPTCHA (jeton) est valide.
- La réponse est un objet JSON.
La réponse vous donnera également le code pays de l'utilisateur (codes ISO 3166-1 alpha-2), la validité de l'adresse électronique de l'utilisateur et un score de fraude de 0 à 99 pour chaque utilisateur. Les scores compris entre 0 et 55 sont acceptables, tandis que les scores compris entre 55 et 99 indiquent que l'utilisateur peut être frauduleux. Ne vous fiez pas au score, il doit seulement vous aider à identifier les utilisateurs potentiellement frauduleux sur la base de leur activité sur votre site.
{
"success":true|false, //true si la validation est réussie
"message":"XXX", //"valid" ou un autre message d'erreur
"fraudscore":XXX, //nombre entre 0 et 99
"countrycode":"XXX", //code pays à deux lettres ex. "FR", "DE"
"emailvalid":"XXX" //`none`, `valid_email`, `invalid_email`, `disposable_email` ou `upgrade_plan`
}
//"success":true et "message":"valid" Cela signifie que la solution est correcte => accepter l'utilisateur
Les solutions ne peuvent être validées qu'une seule fois et seront ensuite marquées comme invalides ou dupliquées. Les solutions ne sont également valides que pendant 5 minutes, après quoi elles seront marquées comme invalides. Si vous avez besoin d'une nouvelle solution, vous devez réinitialiser le captcha (zencap.reset()) et le relancer (zencap.start()).
Résumé de la réponse à la requête POST
Clé de réponse | Description |
---|---|
success | Si true , la solution était correcte, il n'est pas nécessaire de vérifier le champ message. Si false , la solution était invalide, dupliquée ou a expiré plus d'infos dans "message" . |
message | Si "valid" , alors la solution était correcte. Si "timeout_or_duplicate" , alors la solution a déjà été validée ou a dépassé le temps imparti. Si "invalid_solution" , alors la solution n'est pas valide. D'autres codes d'erreur sont possibles. |
fraudscore | Une valeur de 0-55 est acceptable, 55-99 signifie que l'utilisateur pourrait être un spammeur sur la base d'une activité frauduleuse potentielle. Cependant, une valeur de 0-55 ne signifie pas que l'utilisateur n'est pas un spammeur. A utiliser à vos risques et périls. |
countrycode | Codes pays à deux lettres des utilisateurs définis dans ISO 3166-1 - (ISO 3166-1 alpha-2 codes) . Par exemple, l'Allemagne "DE", la France "FR", etc |
emailvalid | "valid_email" est parfait, "invalid_email" ou "disposable_email" n'est pas bon. "disposable_email" signifie que l'utilisateur a essayé d'utiliser une adresse email jetable (100% sûr). "none" signifie que vous n'avez peut-être pas fourni d'adresse e-mail. "upgrade_plan" signifie que vous devez mettre à jour votre plan |
Exemples complets de backend
- PHP
- Node
- Python
- Ruby
$email = $_POST['email'];
$password = $_POST['password'];
$captcharesponse = $_POST['zenc-captcha-solution'];
$secret = "VOTRE-CLÉ-SECRÈTE"; //ne jamais partager votre clé secrète
$data = array(
"response" => $captcharesponse,
"secret" => $secret,
"email" => $email,
);
$options = array(
"http" => array(
"header" => "Content-type: application/x-www-form-urlencoded",
"method" => "POST",
"content" => http_build_query($data),
),
);
$context = stream_context_create($options);
$verify = file_get_contents("https://www.zencaptcha.com/captcha/siteverify", false, $context);
$captcha_success = json_decode($verify);
if ($captcha_success->success==false) {
//mauvaise solution - ne pas continuer
exit();
}
else{
//solution correcte - continuez avec votre code
//$captcha_success->fraudscore (obtenir le score)
//$captcha_success->countrycode (obtenir le code pays des utilisateurs)
//$captcha_success->emailvalid (vérifier l'adresse e-mail des utilisateurs)
}
const https = require('https');
const querystring = require('querystring');
const postData = querystring.stringify({
'response': 'zenc-captcha-solution', //response of the captcha - the solution
'secret': 'VOTRE-CLÉ-SECRÈTE', //ne jamais partager votre clé secrète
'email': 'USER-EMAIL-ADDRESS' //email address of the user
});
const options = {
hostname: 'www.zencaptcha.com',
path: '/captcha/siteverify',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': postData.length
}
};
const req = https.request(options, (res) => {
console.log(`statusCode: ${res.statusCode}`);
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
const result = JSON.parse(data);
if (result.success) {
console.log('Verification successful! '+ result.message);
//solution correcte - continuez avec votre code
//result.fraudscore (obtenir le score)
//result.countrycode obtenir le code pays des utilisateurs
//result.emailvalid (vérifier l'adresse e-mail des utilisateurs)
} else {
console.log('Verification failed. '+ result.message);
return;
//mauvaise solution - ne pas continuer
}
});
});
req.on('error', (error) => {
console.error(error);
});
req.write(postData);
req.end();
import requests
import json
email = request.getParameter("email")
password = request.getParameter("password")
captcharesponse = request.getParameter("zenc-captcha-solution")
secret = "VOTRE-CLÉ-SECRÈTE" #ne jamais partager votre clé secrète
data = {
"response": captcharesponse,
"secret": secret,
"email": email
}
url = "https://www.zencaptcha.com/captcha/siteverify"
response = requests.post(url, data=data)
verify = response.text
captcha_success = json.loads(verify)
if not captcha_success["success"]:
#mauvaise solution - ne pas continuer
return
else:
#solution correcte - continuez avec votre code
#captcha_success["fraudscore"] #(obtenir le score)
#captcha_success["countrycode"] #obtenir le code pays des utilisateurs
#captcha_success["emailvalid"] #vérifier l'adresse e-mail des utilisateurs
require 'net/http'
require 'json'
email = get_parameter("email")
password = get_parameter("password")
captcharesponse = get_parameter("zenc-captcha-solution")
secret = "VOTRE-CLÉ-SECRÈTE" #ne jamais partager votre clé secrète
data = {
"response" => captcharesponse,
"secret" => secret,
"email" => email
}
url = URI("https://www.zencaptcha.com/captcha/siteverify")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/x-www-form-urlencoded"
request.body = URI.encode_www_form(data)
response = http.request(request)
verify = response.read_body
captcha_success = JSON.parse(verify)
if not captcha_success["success"]
#mauvaise solution - ne pas continuer
return
else
#solution correcte - continuez avec votre code
#captcha_success["fraudscore"] #(obtenir le score)
#captcha_success["countrycode"] #obtenir le code pays des utilisateurs
#captcha_success["emailvalid"] #vérifier l'adresse e-mail des utilisateurs
end