токен reCAPTCHA должен быть проверен на стороне сервера. Прежде всего, прикрепите сгенерированный токен к вашей форме:
grecaptcha.ready(function() {
grecaptcha.execute('{{env('RECAPTCHA_V3_PUBLIC_KEY')}}', {action: 'contactform'}).then(function(token) {
$('<input>').attr({
type: 'hidden',
name: 'g-recaptcha-response',
value: token
}).prependTo('.contact-form')
});
});
Затем, когда вы фиксируете ввод на вашем контроллере, вы можете использовать пользовательский запрос формы:
<?php
namespace App\Http\Requests;
use App\Rules\RecaptchaV3;
use Illuminate\Foundation\Http\FormRequest;
class ContactFormRequest extends FormRequest
{
public function rules()
{
$rules = [
'name' => 'required',
'email' => 'required|email',
'message' => 'required',
'g-recaptcha-response' => ['required', new RecaptchaV3],
];
return $rules;
}
...
}
g-recaptcha-response
поле равно required
, поэтому, если пользователи отключат JS, они получат ошибку при проверке ввода формы.
Далее для g-recaptcha-response
мы применяем пользовательское правило проверки: RecaptchaV3.
Вот моя реализация:
<?php
namespace App\Rules;
use GuzzleHttp\Client;
use Illuminate\Contracts\Validation\Rule;
class RecaptchaV3 implements Rule
{
public function passes($attribute, $value)
{
$client = new Client();
$response = $client->post('https://www.google.com/recaptcha/api/siteverify', [
'form_params' => [
'secret' => env('RECAPTCHA_V3_PRIVATE_KEY'),
'response' => $value,
'remoteip' => $_SERVER['REMOTE_ADDR'],
]
]);
$decoded = json_decode($response->getBody());
return $decoded->success;
}
public function message()
{
return "You didn't pass reCAPTCHA challenge!";
}
}
Далее, в вашем контроллере используйте указанный выше запрос формы:
public function processContactForm(ContactFormRequest $request)
{
...
}
Надеюсь, это поможет.