PHP и AJAX форма с reCaptcha v2 не может запустить скрипт PHP - PullRequest
0 голосов
/ 27 мая 2018

В настоящее время я делаю персональный сайт с нуля, используя веб-сервер под управлением 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

1 Ответ

0 голосов
/ 27 мая 2018

Функция fileGetContentsCurl () в файле PHP выполнялась как 'file_get_contents_curl ()'

Исправление этой опечатки и приведение методов в соответствие с единым именем решило эту проблему.Я уверен, что моя IDE или инструменты отладки помогли бы мне исправить эту (1) опечатку, но это PHP для вас.

Я хотел бы поблагодарить Карло Коккака за указание на опечатку.

После внесения изменений весь сценарий работает как задумано.

...