J'ai un formulaire de contact sur mon site Web sur Laravel et j'aimerais placer un ReCaptcha v3 mais pour l'instant, le résultat que j'ai obtenu de la vérification est l'erreur "timeout-or-duplicate".
Pouvez-vous m'aider moi de A à Z? Je ne sais pas où aller ...
Ma tête:
{ "success": true, "score" : x, "error-codes": '', }
Le formulaire de contact:
{ "success": false, "error-codes": [ "timeout-or-duplicate" ] }
4 Réponses :
Chaque fois que la page se recharge, vous recevez un nouveau jeton de Google. Vous ne pouvez utiliser ce jeton qu'une seule fois. D'une manière ou d'une autre, si vous utilisez ce jeton plus d'une fois pour obtenir la réponse de Google Api, vous obtiendrez cette erreur. Vérifiez cette référence d'erreur https://developers.google.com/recaptcha/docs/ vérifier? hl = fr
J'ai reçu ceci de personnes qui cliquent deux fois sur le bouton d'envoi du formulaire.
Comme indiqué dans la documentation , cette erreur est due à:
Ma résolution pour 1, définissez un intervalle qui appelle la fonction de jeton set, donc elle est actualisée toutes les 2 minutes.
$(document).ready(function() { SetCaptchaToken(); setInterval(function () { SetCaptchaToken(); }, 2 * 60 * 1000); });
Résolution pour 2, correction votre code :)
SetCaptchaToken ?? où est-ce défini?
c'est ma fonction personnalisée qui définit le jeton
Le problème est ce morceau de code:
<script src="https://www.google.com/recaptcha/api.js?render=My_Site_Key"></script> <script> grecaptcha.ready(function() { document.getElementById('contact-form').addEventListener("submit", function(event) { event.preventDefault(); grecaptcha.execute('My_Site_Key', {action: 'contact'}).then(function(token) { document.getElementById("recaptchaResponse").value= token; document.getElementById('contact-form').submit(); }); }, false); }); </script>
Le jeton n'est valide que pendant 2 minutes après que vous exécutez
est appelé comme indiqué dans le docs :
Remarque: les jetons reCAPTCHA expirent au bout de deux minutes. Si vous protégez une action avec reCAPTCHA, assurez-vous d'appeler execute lorsque l'utilisateur effectue l'action.
Ainsi, si vous passez plus de 2 minutes sur le formulaire de contact, vous obtenez l'erreur de temporisation. C'est pourquoi il est recommandé dans la documentation d'appeler uniquement execute
si l'utilisateur soumet réellement votre formulaire / prend des mesures. Dans vanilla JS, cela ressemblerait à ceci:
<script src="https://www.google.com/recaptcha/api.js?render=My_Site_Key"></script> <script> grecaptcha.ready(function () { grecaptcha.execute('My_Site_Key', { action: 'contact' }).then(function (token) { var recaptchaResponse = document.getElementById('recaptchaResponse'); recaptchaResponse.value = token; }); }); </script>