Опубликовать данные нескольких полей формы на стороннем сервере после успеха Google Invisible reCaptcha? - PullRequest
0 голосов
/ 18 января 2019

Так что я новичок в этом, поэтому, пожалуйста, извините, если мой вопрос не опубликован, как ожидалось. Любые предложения и советы будут любезно оценены.

Итак, у меня есть форма с несколькими полями, которая публикует файл PHP, который проверяет невидимую reCAPTCHA от Google, а затем переходит к публикации в Pardot (стороннее программное обеспечение, уведомляющее нашу команду по продажам)

После этого сообщения Как опубликовать данные формы на стороннем сервере после успешного завершения невидимого Google reCaptcha? Я могу успешно отправить поле формы электронной почты в Pardot, но не могу отправить другие поля и / или заменить поле электронной почты другим. Другими словами, у меня есть два поля name = "firstname" и name = "email", когда я отправляю поле электронной почты, которое оно публикует, но если я изменяю "email" на "firstname" в PHP, оно не запускается.

Исходя из того, что я прочитал, я относительно уверен, что мне нужно будет создать массив в разделе CURLOPT_POSTFIELDS моего PHP, который в настоящее время отправляет только одно значение ($ pardotPost), но перед тем, как попытаться отправить массив, я хотел проверить другие поля формы, чтобы увидеть, работает ли, как указано выше.

Вот моя разметка на стороне клиента:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Form</title>

    <style>
      input:required:invalid, input:focus:invalid {
        /* insert your own styles for invalid form input */
        -moz-box-shadow: none;
        color: red!important;
      }

      input:required:valid {
        /* insert your own styles for valid form input */
        color: green!important;
      }
    </style>

    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    <script>
      function onSubmit(token) {
        document.getElementById("pardot-form-full-width").submit();
      }
    </script>
</head>
<body>

  <div class="mn-call-form-wrapper">

    <form id="pardot-form-full-width"
          class="uk-form uk-grid-medium uk-form-horizontal invisible-recaptcha"
          action="reCAPTCHA.php"
          method="POST"
          enctype="multipart/form-data"
          uk-grid>

      <!-- First Name -->
      <div class="uk-width-1-2@s">
        <input placeholder="First Name *"
               class="mix-contact-form-item uk-input"
               type="text"
               id="firstname"
               name="firstname"
               required=”required”/>
      </div>
      <!-- END - First Name -->

      <!-- Email Address -->
      <div class="uk-width-1-2@s">
        <input placeholder="Email *"
               class="mix-contact-form-item uk-input"
               type="email"
               id="email"
               name="email"
               required="required"/>
      </div>
      <!-- END - Email Address -->

      <!-- Submit Button -->
      <div class="mix-signup-submit-button-wrapper">
        <button class="g-recaptcha"
                data-sitekey="myGrecaptchaKeyIsHere"
                data-callback="onSubmit"> Send <span uk-icon="arrow-right" class="uk-icon"></span>
        </button>
      </div>
      <!-- END - Submit Button -->

    </form>
  </div>
</body>
</html>

Вот моя разметка на стороне сервера (reCAPTCHA.php):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Results</title>
</head>
<body>

    <?php
        // reCaptcha info
        $secret = "mySecretKey";
        $remoteip = $_SERVER["REMOTE_ADDR"];
        $url = "https://www.google.com/recaptcha/api/siteverify";

        // Form info
        $firstname = $_POST["firstname"];
        $response = $_POST["g-recaptcha-response"];

        // Curl Request
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, array(
            'secret' => $secret,
            'response' => $response,
            'remoteip' => $remoteip
            ));
        $curlData = curl_exec($curl);
        curl_close($curl);

        // Parse data
        $recaptcha = json_decode($curlData, true);

        if ($recaptcha["success"]) {
            echo "Thank you, we will be in contact with you soon.";

            $pardotPost ='firstname='. $_POST["firstname"];
            $curl_handle = curl_init();
            $url = "http://pardot.com/our/url";
            curl_setopt ($curl_handle, CURLOPT_URL,$url);
            curl_setopt($curl_handle, CURLOPT_POST, true);
            curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt ($curl_handle, CURLOPT_POSTFIELDS, $pardotPost);
            curl_setopt( $curl_handle, CURLOPT_SSL_VERIFYPEER, false );
            $result = curl_exec ($curl_handle);
            curl_close ($curl_handle);
        }

        else {
            echo "Oh no, it seems something went wrong.";
        }
    ?>
</body>
</html>

В разделах PHP ниже, если я изменю значения с имени на электронное письмо, я могу подтвердить, что данные отправляются и принимаются Pardot

// Does not work
$firstname = $_POST["firstname"];
$pardotPost ='firstname='. $_POST["firstname"];

// Does work
$email = $_POST["email"];
$pardotPost ='email='. $_POST["email"];

Так что мой вопрос состоит из двух частей. Во-первых, почему форма отправляется, если используется значение электронной почты, и, во-вторых, как мне добавить несколько других полей формы и отправить их в Pardot после успешной (невидимой) проверки Google reCAPTCHA?

Заранее спасибо!

1 Ответ

0 голосов
/ 18 января 2019

Хорошо, похоже, это работает:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Results</title>
</head>
<body>

    <?php
        // reCaptcha info
        $secret = "key-goes-here";
        $remoteip = $_SERVER["REMOTE_ADDR"];
        $url = "https://www.google.com/recaptcha/api/siteverify";

        // Form info
        $email = $_POST["email"];
        $firstname = $_POST["firstname"];
        $lastname = $_POST["lastname"];
        $phone = $_POST["phone"];
        $querytype = $_POST["querytype"];
        $message = $_POST["message"];
        $termsconditionsfw = $_POST["termsconditionsfw"];
        $response = $_POST["g-recaptcha-response"];

        // Curl Request
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, array(
            'secret' => $secret,
            'response' => $response,
            'remoteip' => $remoteip
            ));
        $curlData = curl_exec($curl);
        curl_close($curl);

        // Parse data
        $recaptcha = json_decode($curlData, true);

        if ($recaptcha["success"]) {
            echo "Thank you, we will be in contact with you soon.";

            //extract data from the post
            //set POST variables
            $url = 'http://explore.mixtelematics.com/l/69882/2019-01-15/d3zr3d';
            $fields = array(
              'email' => urlencode($_POST['email']),
            	'firstname' => urlencode($_POST['firstname']),
            	'lastname' => urlencode($_POST['lastname']),
            	'phone' => urlencode($_POST['phone']),
            	'querytype' => urlencode($_POST['querytype']),
            	'message' => urlencode($_POST['message']),
            	'termsconditionsfw' => urlencode($_POST['termsconditionsfw']),
            );

            //url-ify the data for the POST
            foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
            rtrim($fields_string, '&');

            //open connection
            $ch = curl_init();

            //set the url, number of POST vars, POST data
            curl_setopt($ch,CURLOPT_URL, $url);
            curl_setopt($ch,CURLOPT_POST, count($fields));
            curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

            //execute post
            $result = curl_exec($ch);

            //close connection
            curl_close($ch);
        }

        else {
            echo "Oh no, it seems something went wrong.";
        }
    ?>
</body>
</html>

Когда я отправляю это, он отправляет информацию в Pardot:)

...