Во-первых, я большой энтузиаст, но ни в коем случае не профессионал, поэтому я получил некоторые базовые знания в области кодирования. Я пытаюсь интегрировать reCaptcha V3 в мою существующую контактную форму. Но я не знаю, правильно ли это сделано. Я гуглил как сумасшедший, но все "Как это сделать" все делают по-другому. Я добавил его вчера, используя этот пример: https://code.tutsplus.com/tutorials/example-of-how-to-add-google-recaptcha-v3-to-a-php-form--cms-33752 и получил некоторые результаты 0,9 в аналитике, но я все еще не совсем уверен, что он работает правильно.
Я проверил свой результат с помощью этого https://recaptcha -demo.appspot.com / recaptcha-v3-request-scores.php , результатом которого является 0,9. Я пытался изменить необходимый балл до 1,0 на своем собственном веб-сайте, но отправка все равно прошла.
Это то, что я добавил для загрузки reCaptcha:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<link rel="stylesheet" href="styles/contact.css">
<link rel="stylesheet" href="styles/layout.css">
<link rel="stylesheet" href="validate/css/style.css">
<!----- SITE KEY REPCAPTCHA ----->
<script src="https://www.google.com/recaptcha/api.js?render=*****"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('******', {action: 'contact'}).then(function(token) {
$('#contact').prepend('<input type="hidden" name="token" value="' + token + '">');
$('#contact').prepend('<input type="hidden" name="action" value="contact">');
$('#contact').unbind('submit').submit();
});
});
</script>
Часть $ ('# contact') выдает ошибку в консоли Firefox: ReferenceError: $ не определено. Но я нашел другие фрагменты кода, где это также используется, так что я думаю, что это просто работает?
Это моя полная контактная форма:
<h1></h1>
<br />
<h2></h2>
<h2></h2>
<?php
//init variables
$cf = array();
$sr = false;
if(isset($_SESSION['cf_returndata'])){
$cf = $_SESSION['cf_returndata'];
$sr = true;
}
?>
<ul id="errors" class="<?php echo ($sr && !$cf['form_ok']) ? 'visible' : ''; ?>">
<li id="info">Er zijn wat problemen met je bericht:</li>
<?php
if(isset($cf['errors']) && count($cf['errors']) > 0) :
foreach($cf['errors'] as $error) :
?>
<li><?php echo $error ?></li>
<?php
endforeach;
endif;
?>
</ul>
<p id="success" class="<?php echo ($sr && $cf['form_ok']) ? 'visible' : ''; ?>">Bedankt voor je bericht!<br />Je hoort zo snel mogelijk van ons!</p>
<form id="contact" method="post" action="validate/process.php">
<label for="name">Naam: <span class="required">*</span></label>
<input type="text" id="name" name="name" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['name'] : '' ?>" placeholder="naam" />
<label for="email">Email: <span class="required">*</span></label>
<input type="email" id="email" name="email" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['email'] : '' ?>" placeholder="naam@voorbeeld.nl" />
<label for="telephone">Telefoon:</label>
<input type="tel" id="telephone" name="telephone" placeholder="0612345678" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['telephone'] : '' ?>" />
<label for="enquiry">Onderwerp: <span class="required">*</span></label>
<select required id="enquiry" name="enquiry">
<option value="" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Maak keuze') ? "selected='selected'" : '' ?>>Maak een keuze..</option>
<option value="steppen" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Steppen') ? "selected='selected'" : '' ?>>Steppen</option>
<option value="walks" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Walks') ? "selected='selected'" : '' ?>>Walks</option>
<option value="sessions" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Privatewalks') ? "selected='selected'" : '' ?>>Persoonlijke begeleiding (Private walks)</option>
<option value="sessions" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Events') ? "selected='selected'" : '' ?>>Events</option>
<option value="foto" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Foto') ? "selected='selected'" : '' ?>>Foto's opvragen</option>
<option value="website" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Website') ? "selected='selected'" : '' ?>>Website</option>
<option value="overig" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Overig...') ? "selected='selected'" : '' ?>>Overig...</option>
</select>
<label for="message">Bericht: <span class="required">*</span></label>
<textarea id="message" name="message" placeholder="Minimaal 20 karakters"><?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['message'] : '' ?></textarea>
<input type="submit" value="Versturen" id="submit-button" />
<p id="req-field-desc">Velden met een <span class="required">*</span> zijn verplicht.</p>
<br />
</form>
<?php unset($_SESSION['cf_returndata']); ?>
</div>
И это мой файл проверки формы:
if( isset($_POST) ){
//form validation vars
$formok = true;
$errors = array();
//sumbission data
$ipaddress = $_SERVER['REMOTE_ADDR'];
$date = date('d/m/Y');
$time = date('H:i:s');
//form data
$name = $_POST['name'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];
$enquiry = $_POST['enquiry'];
$message = $_POST['message'];
//validate form data
//validate name is not empty
if(empty($name)){
$formok = false;
$errors[] = "U heeft geen naam ingevuld";
} elseif(!preg_match("/^[a-zA-Z ]*$/",$name)) {
$formok = false;
$errors[] = "Uw naam mag alleen letters en/of spaties bevatten";
}
//validate email address is not empty
if(empty($email)){
$formok = false;
$errors[] = "U heeft geen email adres ingevuld";
//validate email address is valid
} elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$formok = false;
$errors[] = "U heeft geen geldig email adres ingevuld";
}
//validate message is not empty
if(empty($message)){
$formok = false;
$errors[] = "U heeft geen bericht ingevuld";
}
//validate message is greater than 20 charcters
elseif(strlen($message) < 20){
$formok = false;
$errors[] = "Uw bericht moet minimaal 20 karakters bevatten";
}
// reCaptcha V3 stuff
define("RECAPTCHA_V3_SECRET_KEY", '*****');
$token = $_POST['token'];
$action = $_POST['action'];
// call curl to POST request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('secret' => RECAPTCHA_V3_SECRET_KEY, 'response' => $token)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$arrResponse = json_decode($response, true);
// verify the response
if($arrResponse["success"] == '1' && $arrResponse["action"] == $action && $arrResponse["score"] >= 0.5) {
// valid submission
// go ahead and do necessary stuff
} else {
$errors[] = "reCaptcha you are a bot";
// spam submission
// show error message
}
//send email if all is ok
if($formok){
$headers = "From: $email" . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$emailbody = "";
mail("",'',$emailbody,$headers);
}
//what we need to return back to our form
$returndata = array(
'posted_form_data' => array(
'name' => $name,
'email' => $email,
'telephone' => $telephone,
'enquiry' => $enquiry,
'message' => $message
),
'form_ok' => $formok,
'errors' => $errors
);
//if this is not an ajax request
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest'){
//set session variables
session_start();
$_SESSION['cf_returndata'] = $returndata;
//redirect back to form
header('location: ' . $_SERVER['HTTP_REFERER']);
}
}
Я попытался добавить $ formok = false;в разделе проверки ответа:
if($arrResponse["success"] == '1' && $arrResponse["action"] == $action && $arrResponse["score"] >= 0.5) {
// valid submission
// go ahead and do necessary stuff
} else {
---------> $formok = false;
$errors[] = "reCaptcha you are a bot";
// spam submission
// show error message
}
Но это приводит к постоянной ошибке при отправке.
Я надеюсь, что кто-то может пролить некоторый свет на то, как у меня дела. Это так, должно ли это работать? или я сделал какую-то ошибку?
Заранее спасибо!