В настоящее время я делаю персональный сайт с нуля, используя веб-сервер под управлением Apache и PHP 5.6.Я сделал каркас, несколько страниц и немного CSS.В настоящее время у меня возникают проблемы при интеграции Google ReCaptcha v2 в мою контактную форму.Я смог интегрировать ее в форму через HTML, и мой AJAX-скрипт работает правильно, но я не могу понять, как правильно интегрировать проверку капчи в мой PHP-скрипт.Я хочу полюбить PHP, и мне придется больше его использовать, но пытаться заставить это работать очень разочаровывает.
Эта форма отлично работает без интеграции с catcha, но когда я представляюИзменения в PHP-скрипте, он не завершается и сообщения формы не отправляются.Я выследил точную проблему, но не могу понять это.Я хотел бы использовать JS alert () для заглушки различных частей скрипта, но так как это PHP, я не могу этого сделать: c Я также использовал несколько валидаторов, чтобы убедиться, что синтаксис PHP правильный.В моей IDE нет ошибок.
Кто-нибудь может увидеть какие-либо абсурдные проблемы со следующим скриптом формы PHP?
PHP
<?php
// Only process POST reqeusts.
if ( $_SERVER[ "REQUEST_METHOD" ] == "POST" ) {
// Get the form fields and remove whitespace.
$firstname = strip_tags( trim( $_POST[ "firstname" ] ) );
$firstname = str_replace( array( "\r", "\n" ), array( " ", " " ), $firstname );
$lastname = strip_tags( trim( $_POST[ "lastname" ] ) );
$lastname = str_replace( array( "\r", "\n" ), array( " ", " " ), $lastname );
$email = filter_var( trim( $_POST[ "email" ] ), FILTER_SANITIZE_EMAIL );
$phone = filter_var( trim( $_POST[ "phone" ] ), FILTER_SANITIZE_NUMBER_INT );
$message = trim( $_POST[ "message" ] );
$validation = false;
function buildCaptchaUrl() {
$captcha = $_POST[ 'g-recaptcha-response' ];
$secret = 'SECRET';
return "https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=" . $captcha . "&remoteip=" . $_SERVER[ 'REMOTE_ADDR' ];
}
function fileGetContentsCurl( $url ) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
$data = curl_exec( $ch );
curl_close( $ch );
return $data;
}
function sendCaptchaResponse() {
$response = json_decode( file_get_contents_curl( buildCaptchaUrl() ), true );
if ( $response[ 'success' ] == false ) {
return false;
}
return true;
}
//The problematic chain of events is caused by this
$validation = sendCaptchaResponse();
if ( $validation == false ) {
//captcha failed
http_response_code( 403 );
echo "Please verify your humanity by using the captcha.";
exit;
} else if ( $validation == true ) {
//captcha passed
// Check that data was sent to the mailer.
if ( empty( $firstname )OR empty( $message )OR!filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
// Set a 400 (bad request) response code and exit.
http_response_code( 400 );
echo "Some form fields must have been empty. Please complete the form and submit again.";
exit;
}
// Set the recipient email address.
// FIXME: Update this to your desired email address.
$recipient = "chris@chillstice.com";
// Set the email subject.
$subject = "Form Submission by $firstname $lastname";
// Build the email content.
$email_content = "Name: $firstname $lastname\n";
$email_content .= "Email: $email\n";
$email_content .= "Phone: $phone\n\n";
$email_content .= "Message:\n$message\n";
// Build the email headers.
$email_headers = "From: $firstname $lastname <$email>";
// Send the email.
if ( mail( $recipient, $subject, $email_content, $email_headers ) ) {
// Set a 200 (okay) response code.
http_response_code( 200 );
echo "Your message has been sent and I will be in contact soon.";
} else {
// Set a 500 (internal server error) response code.
http_response_code( 500 );
echo "Something went wrong and we couldn't send your message.";
}
}
} else {
// Not a POST request, set a 403 (forbidden) response code.
http_response_code( 403 );
echo "There was a problem with your submission, please try again.";
}
?>
HTML
<form id="form" class="item needs-validation" method="POST" action="contact-form.php" novalidate>
<div class="form-row">
<div class="form-group col-md-6">
<label for="firstname">First name *</label>
<input id="firstname" name="firstname" class="form-control" placeholder="John" type="text" required maxlength="100">
<div class="valid-feedback">What a lovely name!</div>
<div class="invalid-feedback">That's no name.</div>
</div>
<div class="form-group col-md-6">
<label for="lastname">Last name *</label>
<input id="lastname" name="lastname" class="form-control" placeholder="Doe" type="text" required maxlength="100">
<div class="valid-feedback">Looks good!</div>
<div class="invalid-feedback">That's not a real name.</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label for="email"><i class="far fa-envelope mr-2"></i>Email *</label>
<input id="email" name="email" class="form-control" placeholder="someone@domain.com" type="email" required maxlength="100">
<div class="valid-feedback">Valid</div>
<div class="invalid-feedback">That's not a real email...</div>
</div>
<div class="form-group col-md-6">
<label for="phone"><i class="fas fa-mobile-alt mr-2"></i>Phone</label>
<input id="phone" name="phone" class="form-control" placeholder="1234567890" type="tel" maxlength="20">
<div class="valid-feedback">Not required.</div>
<div class="invalid-feedback">That's not a real phone number.</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-12">
<label for="message"><i class="fa fa-comment-alt mr-2"></i>Message *</label>
<textarea id="message" name="message" class="form-control" placeholder="" maxlength="100000"></textarea>
<div class="valid-feedback">Nice message.</div>
<div class="invalid-feedback">I have no idea what you did, but that's not valid.</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<div class="g-recaptcha" data-sitekey="6LdOqVsUAAAAAN25grBs05Ip8JmjGQNqURivfH0y"></div>
</div>
<div class="form-group col-md-6">
<button id="submit" name="submit" type="submit" class="btn btn-primary btn-lg" style="float: right;">
Submit
</button>
</div>
</div>
</form>
JS AJAX
$(function() {
"use strict";
// Get the form.
var form = $('#form');
// Set up an event listener for the contact form.
$(form).submit(function(e) {
// Stop the browser from submitting the form.
e.preventDefault();
// Serialize the form data.
var formData = $(form).serialize();
// Submit the form using AJAX.
$.ajax({
type: 'POST',
url: $(form).attr('action'),
data: formData
})
.done(function(response) {
// Set the message text.
$('#alert-form-success-text').text(response);
$('#alert-form-success').css({
"visibility": "visible",
"opacity": "1"
});
$('#alert-form-fail').css({
"visibility": "hidden",
"opacity": "0"
});
})
.fail(function(data) {
$('#alert-form-fail').css({
"visibility": "visible",
"opacity": "1"
});
$('#alert-form-success').css({
"visibility": "hidden",
"opacity": "0"
});
// Set the message text.
if (data.responseText !== '') {
$('#alert-form-fail-text').text(data.responseText);
} else {
$('#alert-form-fail-text').text('An internal error occured and your message could not be sent.');
}
});
});
});
Проблема связана только с интеграцией reCaptcha, возможностью сценариев получать информацию POST и электронная почта.Я думаю, что проблема локализована в цепочке методов, начатой
$validation = sendCaptchaResponse();
Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.Вот страница с формой: https://chillstice.com/contact