2017-12-29 23 views
0

私はおそらくかなり基本的な質問ですが、誰かが私を助けてくれることを期待して、PHPとフォームの作成にかなり新しいです。Google Invisible reCaptcha成功後のフォームデータのサードパーティサーバーへの投稿方法

ハニーポット方式を採用しているにもかかわらず、サイトに1フィールドの電子メールフォームを継続的に提出しているため、GoogleのInvisible reCaptchaを使用して対処しています。

私はこの役に立つガイドの指示に従っています:https://www.pinnacleinternet.com/installing-invisible-recaptcha/しかし、私が立ち往生しているところは、結果が成功した後、フォームを介して提出されたメールアドレスを投稿して投稿したいと思いますサードパーティ製のサーバー(この場合はマーケティング自動化ツールPardot)に送信します。ここで

は、目に見えないのreCAPTCHAコードです:

フロントエンド

<script> 
function captchaSubmit(data) { 
document.getElementsByClassName("invisible-recaptcha").submit(); 
} 
</script> 

<form action="utils/recaptcha.php" method="post" class="pardot-email-form-handler invisible-recaptcha" novalidate>  
     <input class="one-field-pardot-form-handler" maxlength="80" name="email" size="20" type="email" placeholder="Enter Email Address" required="required" /> 
     <div style="position:absolute; left:-9999px; top: -9999px;"> 
      <label for="pardot_extra_field">Comments</label> 
      <input type="text" id="pardot_extra_field" name="pardot_extra_field"> 
     </div> 

     <button class="g-recaptcha" data-sitekey="anonymous" data-callback="captchaSubmit" type="submit" name="captchaSubmit">Submit</button> 
    </form> 

バックエンド:

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

    // Form info 
    $email = $_POST["email"]; 
    $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_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 "Success!"; 
    else 
     echo "Failure!"; 
?> 

私は以前に以下のコードを使用してPardotに投稿されたが、今では不明だいました最初の記事がPardotではなくGoogleにあるということをどのようにするか。 Invisible reCaptchaからの成功の確認後、私はPardotにどのように投稿しますか?

<div class="nav-email-form">  
<form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" method="post" class="pardot-email-form-handler" novalidate> 

<input class="one-field-pardot-form-handler" maxlength="80" name="email" size="20" type="email" placeholder="Enter Email Address" required="required" /> 
<div style="position:absolute; left:-9999px; top: -9999px;"> 
    <label for="pardot_extra_field">Comments</label> 
    <input type="text" id="pardot_extra_field" name="pardot_extra_field"> 
</div> 

<button type="submit" name="submit">Submit</button> 
</form> 

+0

ところ、GoogleのreCAPTCHAのコードはありますか? – RamRaider

+0

ガイドのreCaptchaコードを質問に追加しました。基本的には、バックエンドコードの「成功」部分の後にPardotに投稿したいと思っています。 – dpayne

+0

Pardotがメールアドレスを期待しているようです - どこから来たのですか? – RamRaider

答えて

0

以下は、私がバックエンドコードでやったことです。よりよい成功&エラー処理を必要とする、と私はローカル環境でそれを設定しましたが、それはテストされていますし、正常Pardotに投稿するので、私は唯一のfalseにSSL_VERIFYPEERを設定します。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>Results</title> 
</head> 
<body> 
    <p>Thank you for entering the form.</p> 

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

     // Form info 
     $email = $_POST["email"]; 
     $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 "Success!"; 

      $pardotPost ='email='. $_POST["email"]; 
      $curl_handle = curl_init(); 
      $url = "anonymous"; 
      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 "Failure!"; 
     } 
    ?> 
</body> 
</html> 
1

あなたはすでに、おそらくあなたがsuccess応答にPardotにカール使用してPOSTリクエストを行う必要がありますキャプチャを処理するために最初にcurlを使用していたよう。あなたはおそらくこのように試すことができます - テストされていないbtw

function curl($url=NULL, $options=NULL){ 
    /* 
     Download a copy of cacert.pem from 
     https://curl.haxx.se/docs/caextract.html 

     and then edit below as appropriate 
    */ 
    $cacert='c:/wwwroot/cacert.pem'; #<-------- edit to suit own environment 

    $res=array(
     'response' => NULL, 
     'info'  => array('http_code' => 100), 
     'headers' => NULL, 
     'errors' => NULL 
    ); 
    if(is_null($url)) return (object)$res; 
    /* Initialise curl request object */ 
    $curl=curl_init(); 
    if(parse_url($url,PHP_URL_SCHEME)=='https'){ 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 
     curl_setopt($curl, CURLOPT_CAINFO, $cacert); 
    } 
    /* Define standard options */ 
    curl_setopt($curl, CURLOPT_URL,trim($url)); 
    curl_setopt($curl, CURLOPT_AUTOREFERER, true); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($curl, CURLOPT_FAILONERROR, true); 
    curl_setopt($curl, CURLOPT_HEADER, false); 
    curl_setopt($curl, CURLINFO_HEADER_OUT, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'); 
    curl_setopt($curl, CURLOPT_ENCODING, ''); 
    /* Assign runtime parameters as options */ 
    if(isset($options) && is_array($options)){ 
     foreach($options as $param => $value) curl_setopt($curl, $param, $value); 
    } 
    /* Execute the request and store responses */ 
    $res=(object)array(
     'response' => curl_exec($curl), 
     'info'  => (object)curl_getinfo($curl), 
     'errors' => curl_error($curl) 
    ); 
    curl_close($curl); 
    return $res; 
} 

/* 
    stage 1: POST to Google 
    ----------------------- 
*/ 
$url='https://www.google.com/recaptcha/api/siteverify'; 
$params=array(
    'secret' => $secret, 
    'response' => $_POST['g-recaptcha-response'], 
    'remoteip' => $_SERVER['REMOTE_ADDR'] 
); 
$options=array(
    CURLOPT_POST  => true, 
    CURLOPT_POSTFIELDS => $params 
); 
$result=curl($url, $options); 
if($result->info->http_code==200){ 

    $json=json_decode($result->response); 
    $status=$json->success; 
    if($status){ 

     /* 
      stage 2: POST to PARDOT 
      ----------------------- 
     */ 

     $url='https://go.pardot.com/l/43312/2017-10-24/7dnr3n'; 

     /* fields within the PARDOT form */ 
     $_POST['pardot_extra_field']=''; 
     $_POST['submit']=''; 

     /* no need to send this field */ 
     unset($_POST['g-recaptcha-response']); 

     /* this needs a value - but from where? */ 
     #$_POST['email']='[email protected]'; 

     $options=array(
      CURLOPT_POST  => true, 
      CURLOPT_POSTFIELDS => $_POST 
     ); 
     $result=curl($url, $options); 
     if($result->info->http_code==200){ 
      /* all good */ 
      header('Location: ?mailsent=true'); 
     } else { 
      /* bogus */ 
     } 
    } else { 
     echo 'bogus'; 
    } 
} 
+0

ありがとう@RamRaider!あなたの提案ごとにCURLを使用しましたが、私の答えに反映されている上記とは異なる方法でやりました。 – dpayne

関連する問題