Laravel=でお問い合わせフォームを受け取りました。ReCaptchav3を配置したいのですが、今のところ、確認から得られた結果は「timeout-or-duplicate」というエラーです。
AからZまで私を助けてくれますか?どこに行くかわからない….
私の頭 :
<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>
お問い合わせフォーム:
<form action="{{ route('contact.post') }}" id="contact-form" method="post" name="contactForm">
<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
<fieldset>
<div class="col-sm-12">
<input id="name" name="name" placeholder="Nom*" type="text">
</div>
<div class="col-sm-12">
<input id="email" name="email" placeholder="Email*" type="text">
</div>
<div class="col-sm-12">
<input id="object" name="object" placeholder="Objet*" type="text" autocomplete="off">
</div>
<div class="col-xs-12">
<textarea cols="5" id="message" name="message" placeholder="Votre message...*"></textarea>
</div>
<div class="col-xs-12">
<button class="submit active" id="contact-submit">ENVOYER</button>
</div>
<div class="error col-xs-12">
<h3></h3>
</div>
<div class="success col-xs-12">
<h3>Merci ! Votre message a été envoyé !</h3>
</div>
</fieldset>
</form>
ルート:
Route::post('/contact', array('as' => 'contact.post', 'uses' => 'ContactController@send'));
接触コントローラー:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Mail;
class ContactController extends Controller
{
public function send() {
$info = array(
'name' => Input::get('name'),
'email' => Input::get('email'),
'object' => Input::get('object'),
'message' => Input::get('message')
);
if($info['name'] == "" || $info['email'] == "" || $info['object'] == "" || $info['message'] == "") {
return json_encode(['response' => 'Tous les champs doivent être remplis !']);
}
if(!filter_var($info['email'], FILTER_VALIDATE_EMAIL)) {
return json_encode(['response' => 'Vous devez rentrer une adresse e-mail valide !']);
}
$ip = Request()->ip();
// Build POST request:
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = 'My_Secret_Key';
$recaptcha_response = $_POST['recaptcha_response'];
// Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
// Take action based on the score returned:
if ($recaptcha->score < 0.5) {
return json_encode(['response' => 'Vous êtes considéré comme Bot/Spammer !', 'score' => $recaptcha->score]);
}
Mail::send(['email.html.contact', 'email.text.contact'], ['info' => $info, 'ip' => $ip], function($message) use ($info) {
$message->to('[email protected]')->subject('Bryan Gossuin | Formulaire de contact');
$message->replyTo($info['email'], $info['name']);
});
return json_encode(['response' => 'success','']);
}
}
最後にJavaScriptを
$('#contact-form').on('submit', function(e) {
e.preventDefault();
swal({
title: "Souhaitez-vous vraiment envoyer ce mail ?",
icon: "warning",
buttons: {
cancel: {
text: "Annuler",
value: false,
visible: true,
closeModal: true,
},
confirm: "Envoyer",
}
})
.then((value) => {
if (value) {
$.ajax({
method: "POST",
url: "contact",
cache: false,
data: $(this).serialize(),
dataType: 'json',
success: function(json) {
console.log(json.score);
if (json.response == 'success') {
$('#contact-form').trigger("reset");
swal("E-mail envoyé", "Merci de votre demande !", "success");
} else {
swal("Erreur !", json.response, "error");
}
}
}
)
}
});
});
私がグーグルから得た出力は
{
"success": false,
"error-codes": [
"timeout-or-duplicate"
]
}
そして私はそれが
{
"success": true,
"score" : x,
"error-codes": '',
}
問題は、「メソッドの投稿」が2回使用されているためだと思います。APIGoogleで直接チェックしてユーザートークンを確認すると、コードが表示されますが、ページを更新した直後に「タイムアウトまたは重複」が表示されます"これを修正する方法がわかりません
documentation に記載されているように、このエラーは次の原因で発生します。
1の私の解決策は、トークンの設定関数を呼び出す間隔を設定して、2分ごとに更新されるようにすることです。
$(document).ready(function() {
SetCaptchaToken();
setInterval(function () { SetCaptchaToken(); }, 2 * 60 * 1000);
});
2の解決策、コードを修正してください:)
ページがリロードされるたびに、Googleから新しいトークンを取得します。このトークンは1回しか使用できません。どういうわけか、そのトークンを複数回使用してgoogle Apiからの応答を取得すると、そのエラーが発生します。このエラーリファレンスを確認してください https://developers.google.com/recaptcha/docs/verify?hl=ja
これは、フォームの送信ボタンをダブルクリックした人から入手したものです。
問題は次のコードです。
<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>
docs に記載されているように、execute
が呼び出された後、トークンは2分間のみ有効です。
注:reCAPTCHAトークンは2分後に期限切れになります。 reCAPTCHAでアクションを保護している場合は、ユーザーがアクションを実行したときに必ずexecuteを呼び出してください。
したがって、連絡フォームに2分以上費やすと、タイムアウトエラーが発生します。そのため、ユーザーが実際にフォームを送信したりアクションを実行したりする場合にのみexecute
を呼び出すことがドキュメントで推奨されています。バニラJSでは、次のようになります。
<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>