1

Web サイトに Salesforce Web-to-Lead フォームがあります。すべて正常に動作しますが、recaptcha やスパムを防止する方法はありません。そこで、recaptcha をダウンロードし、すべての設定を行いました。また、こちらの手順に従って$_POST データを取得し、recaptcha が正しいことを確認してから、セールスフォースに送信しました。

私はその設定をすべて取得しましたが、フォームを送信すると、check-this-first.php (contactFormConfirm.php と呼びました) ページに移動し、空白になります。retURL にヒットしたり、実際にセールスフォースに送信したりしません。

私を助けるために流すことができるどんな光も素晴らしいでしょう. 前もって感謝します。

私が使用しているコードは次のとおりです。

Salesforce Web to Lead:

<form action="/contactFormConfirm.php" method="POST">
<input type=hidden name="oid" value="#############">
<input type=hidden name="retURL" value="http://www.google.com">
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="first_name" class="span3">First Name</label>
    <input  id="first_name" maxlength="40" name="first_name" size="20" type="text" class="span9" />
</div>
<div class="span6 pull-left">
    <label for="last_name" class="span3">Last Name</label>
    <input  id="last_name" maxlength="80" name="last_name" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="title" class="span3">Title</label>
    <input  id="title" maxlength="40" name="title" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="email" class="span3">Email</label>
    <input  id="email" maxlength="80" name="email" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="phone" class="span3">Phone</label>
    <input  id="phone" maxlength="40" name="phone" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="00N4000000231ne" class="span3" style="position:relative; top:-1.2em;">Profile:</label>
    <select  id="profile" name="00N4000000231ne" title="Profile" class="span9">    <option value="">--None--</option>
**[other options hidden for privacy]**
    </select>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="company" class="span3">Company</label>
    <input  id="company" maxlength="40" name="company" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="country" class="span3">Country</label>
    <input  id="country" maxlength="40" name="country" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="street" class="span3">Address</label>
    <textarea name="street" class="span9"></textarea><br>
</div>
<div class="span6 pull-left">
    <label for="city" class="span3">City</label>
    <input  id="city" maxlength="40" name="city" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="state" class="span3" style="position:relative; top:-1.2em;">State / Province</label>
    <input  id="state" maxlength="20" name="state" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="zip" class="span3">Zip</label>
    <input  id="zip" maxlength="20" name="zip" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="00N40000001V9wA" class="span3" style="position:relative; top:-1.2em;">Product Interest:</label>
    <select  id="productInterest" multiple="multiple" name="00N40000001V9wA" title="Product Interest" class="span9" size="5">
        <option value="API">API</option>
        **[other options hidden for privacy]**
    </select><br>
</div>
    <div class="span6 pull-left">
    <label for="00N40000001V8Yl" class="span3" style="position:relative; top:-1.2em;">Background Notes:</label>
    <textarea  id="notes" name="00N40000001V8Yl" type="text" wrap="soft" class="span9"></textarea><br>
</div>
</div>
<div class="clearfix"><br /></div>
<div class="span12 offset3">
<div class="span10 pull-right">
    <label for="lead_source" class="span8 pull-left">Check here to be contacted by *** for a demonstration.</label>
    <input id="demonstration" type="checkbox" name="lead_source" class="span1 pull-left" value="Web w/Demo Request"></input>
</div>
<div class="span10 pull-right">
    <label for="00N400000023QE0" class="span8 pull-left">Check here if you have a timeline for this project.</label>
    <input id="timeline" type="checkbox" name="00N400000023QE0" class="span1 pull-left" value="Confirmed"></input>
</div>
<div class="span10 pull-right">
    <label for="00N400000023QE5" class="span8 pull-left">Check here if you have purchase authority for this project.</label>
    <input id="purchaseAuthority" type="checkbox" name="00N400000023QE5" class="span1 pull-left" value="Confirmed"></input>
</div>
</div>
<div class="clearfix"><br /></div>
<div class="row-fluid">
<div class="span9 pull-right offset2">
    <div class="span8">
        <?php
            require_once('recaptcha/recaptchalib.php');
            $publickey = "xxxxxxxxxxxxx"; // you got this from the signup page
            echo recaptcha_get_html($publickey);
        ?><br />
    </div>
</div>
</div>
<input type="hidden" name="lead_source" value="Web" />
<input type="hidden" name="00N4000000231kf" value="Web Inquiry" />
<div class="span10 offset1 pull-right">
<input type="submit" name="ctl00$ctl00$MainContent$mainContentHolder$btnSubmit" value="Submit Inquiry" class="btn btn-primary span3 pull-right" />
</div>
</form>

これは、php cURL コードを含む contactFormConfirm.php コードです。

<?php

ob_start();
session_start();

include_once('[path-to]/recaptcha/recaptchalib.php');

     //Recaptcha Settings
   $publickey = "xxxxxxxxx"; // you got this from the signup page
   $privatekey = "xxxxxxxxx";


//curl method posting
//extract data from the post
  extract($_POST);

    if (isset($submit)){

    $ok = 1;

     $resp = recaptcha_check_answer ($privatekey,
                            $_SERVER["REMOTE_ADDR"],
                            $_POST["recaptcha_challenge_field"],
                            $_POST["recaptcha_response_field"]);

     if (!$resp->is_valid) {
          $ok = 0;
        }

if ($ok){       
    //set POST variables
    $url = 'https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
    $fields = array(
                'oid'=>urlencode($oid),
                'retURL'=>urlencode($retURL),
                'first_name'=>urlencode($first_name),
                'last_name'=>urlencode($last_name),
                'title'=>urlencode($title),
                'email'=>urlencode($email),
                'phone'=>urlencode($phone),
                '00N4000000231ne'=>urlencode($profile),
                'company'=>urlencode($company),
                'country'=>urlencode($country),
                'address'=>urlencode($address),
                'city'=>urlencode($city),
                'state'=>urlencode($state),
                'zip'=>urlencode($zip),
                '00N40000001V9wA'=>urlencode($productInterest),
                '00N40000001V8Yl'=>urlencode($notes),
                'lead_source'=>urlencode($demonstration),
                '00N400000023QE0'=>urlencode($timeline),
                '00N400000023QE5'=>urlencode($purchaseAuthority)
            );

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

    //print_r($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);

} //if ok
else {
          echo "<h4>Sorry - Invalid Captcha </h4>";
        }   


 } //if submit.
 ?>
4

2 に答える 2

1

数時間作業した後、私と職場の別の開発者は、上記のソリューション (一種) を使用してこの問題を解決することができました。

それがどのように壊れたかは次のとおりです。

<script type="text/javascript">
 var RecaptchaOptions = {
theme : 'clean'
 };
 </script>
<form action="/contactFormConfirm.php" method="POST" >
<input type=hidden name="oid" value="#########">
<input type=hidden name="retURL" value="http://www.website.com/thank-you/">
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="first_name" class="span3">First Name</label>
    <input  id="first_name" maxlength="40" name="first_name" size="20" type="text" class="span9" />
</div>
<div class="span6 pull-left">
    <label for="last_name" class="span3">Last Name</label>
    <input  id="last_name" maxlength="80" name="last_name" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="title" class="span3">Title</label>
    <input  id="title" maxlength="40" name="title" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="email" class="span3">Email</label>
    <input  id="email" maxlength="80" name="email" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="phone" class="span3">Phone</label>
    <input  id="phone" maxlength="40" name="phone" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="profile" class="span3" style="position:relative; top:-1.2em;">Profile:</label>
    <select  id="profile" name="profile" title="OverDrive Profile" class="span9">
        <option value="">--None--</option>
    </select>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="company" class="span3">Company</label>
    <input  id="company" maxlength="40" name="company" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="country" class="span3">Country</label>
    <input  id="country" maxlength="40" name="country" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="street" class="span3">Address</label>
    <textarea name="street" class="span9"></textarea><br>
</div>
<div class="span6 pull-left">
    <label for="city" class="span3">City</label>
    <input  id="city" maxlength="40" name="city" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="state" class="span3" style="position:relative; top:-1.2em;">State / Province</label>
    <input  id="state" maxlength="20" name="state" size="20" type="text" class="span9" /><br>
</div>
<div class="span6 pull-left">
    <label for="zip" class="span3">Zip</label>
    <input  id="zip" maxlength="20" name="zip" size="20" type="text" class="span9" /><br>
</div>
</div>
<div class="clearfix"></div>
<div class="row span12 pull-left">
<div class="span6 pull-left">
    <label for="productInterest" class="span3" style="position:relative; top:-1.2em;">Product Interest:</label>
    <select  id="productInterest" multiple="multiple" name="productInterest" title="Product Interest" class="span9" size="5">
        <option value="API">API</option>
    </select><br>
</div>
    <div class="span6 pull-left">
    <label for="notes" class="span3" style="position:relative; top:-1.2em;">Background Notes:</label>
    <textarea  id="notes" name="notes" type="text" wrap="soft" class="span9"></textarea><br>
</div>
</div>
<div class="clearfix"><br /></div>
<div class="span12 offset3">
<div class="span10 pull-right">
    <label for="lead_source" class="span8 pull-left">Check here to be contacted for a demonstration.</label>
    <input id="lead_source" type="checkbox" name="lead_source" class="span1 pull-left" value="Web w/Demo Request"></input>
</div>
<div class="span10 pull-right">
    <label for="timeline" class="span8 pull-left">Check here if you have a timeline for this project.</label>
    <input id="timeline" type="checkbox" name="timeline" class="span1 pull-left" value="Confirmed"></input>
</div>
<div class="span10 pull-right">
    <label for="purchaseAuthority" class="span8 pull-left">Check here if you have purchase authority for this project.</label>
    <input id="purchaseAuthority" type="checkbox" name="purchaseAuthority" class="span1 pull-left" value="Confirmed"></input>
</div>
</div>
<div class="clearfix"><br /></div>
<div class="row-fluid">
<div class="span9 pull-right offset2">
    <div class="span8">
        <?php
            require_once('recaptcha/recaptchalib.php');
            $publickey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // you got this from the signup page
            echo recaptcha_get_html($publickey);
        ?><br />
    </div>
</div>
</div>
<div class="span10 offset1 pull-right">
<input type="submit" name="submit" value="Submit Inquiry" class="btn btn-primary span3 pull-right" />
</div>
</form>

contactFormConfirm ファイルは次のとおりです。

<?php

ob_start();
session_start();

include_once('path-to/recaptcha/recaptchalib.php');

     //Recaptcha Settings
   $publickey = "xxxxxxxxxxxxxxxxxxxxxxxxx"; // you got this from the signup page
   $privatekey = "xxxxxxxxxxxxxxxxxxxxxxxx";


//curl method posting
//extract data from the post
  extract($_POST);

    if ($submit == 'Submit Inquiry'){

    $ok = 1;

     $resp = recaptcha_check_answer ($privatekey,
                            $_SERVER["REMOTE_ADDR"],
                            $_POST["recaptcha_challenge_field"],
                            $_POST["recaptcha_response_field"]);

     if (!$resp->is_valid) {
          $ok = 0;
        }

if ($ok){       
    //set POST variables
    $url = 'salesforce URL';


    $fields = array(
                'oid'=>urlencode($oid),
                'retURL'=>urlencode($retURL),
                'first_name'=>urlencode($first_name),
                'last_name'=>urlencode($last_name),
                'title'=>urlencode($title),
                'email'=>urlencode($email),
                'phone'=>urlencode($phone),
                'XXXXXXXXXXXXXXXX'=>urlencode($profile),
                'company'=>urlencode($company),
                'country'=>urlencode($country),
                'address'=>urlencode($street),
                'city'=>urlencode($city),
                'state'=>urlencode($state),
                'zip'=>urlencode($zip),
                'XXXXXXXXXXXXXXXX'=>urlencode($productInterest),
                'XXXXXXXXXXXXXXXX'=>urlencode($notes)
                );
                // replace XXXXXX with custom field ID

    // send default "lead source" value if it is not passed in the HTML form
    if (isset($lead_source))
    {
        $fields['XXXXXXXXXXXXXXXXX'] = urlencode('Web w/Demo Request');
    }
    else
    {
        $fields['XXXXXXXXXXXXXXXXX'] = urlencode('Web');
    }

    // add values to array if they are passed in via the HTML form
    if (isset($timeline))
    {
        $fields['XXXXXXXXXXXXXXXXX'] = urlencode($timeline);
    }

    if (isset($purchaseAuthority))
    {
        $fields['XXXXXXXXXXXXXXXX'] = urlencode($purchaseAuthority);
    }

    // add constant fields
    $fields['XXXXXXXXXXXXXXX'] = urlencode('Web Inquiry');
    $fields['recordType'] = urlencode('XXXXXXXXXXXXXXX');


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

    //print_r($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);

} //if ok
else {
          echo "<h4>Sorry - Invalid Captcha </h4>";
        }   


 } //if submit.
 ?>
于 2013-03-12T11:37:53.583 に答える
0

これが古いスレッドであることは知っていますが、同じことをしようとしているときに遭遇し、この解決策を思いつきました:

<?php
ob_start();
session_start();

require_once('recaptchalib.php');

$key_public = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$key_private = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

$captchaFailed = false;
$response = null;
$reCaptcha = new ReCaptcha($key_private);

if (!function_exists('curl_version')) {
    die('Curl package missing.');
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['g-recaptcha-response'])) {
        $response = $reCaptcha->verifyResponse(
            $_SERVER['REMOTE_ADDR'],
            $_POST['g-recaptcha-response']
        );

        if ($response !== null) {
            if ($response->success) {
                $fields = $_POST;
                $sendURL = $fields['sendURL'];

                unset($fields['sendURL']);
                unset($fields['g-recaptcha-response']);

                $fields_string = http_build_query($fields);

                $ch = curl_init();

                curl_setopt($ch, CURLOPT_URL, $sendURL);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

                $result = curl_exec($ch);

                curl_close($ch);
            } else {
                $captchaFailed = true;
            }
        } else {
            $captchaFailed = true;
        }
    } else {
        $captchaFailed = true;
    }
}

if ($captchaFailed && count(get_included_files()) < 3) {
    echo 'reCAPTCHA failed! Please go back and try again.';
}
?>

sendURLフォームを送信したい URL の値で呼び出される非表示の入力フィールドを作成する必要があります。

フォームのアクションを上記のコードを含むファイルに設定するか、フォームのページの上部に含めてアクションを空白のままにすることができます。

すべてを同じページに含める例は、次のようになります。

<?php require_once('form-submit.php'); ?>
<html>
<body>
    <form method="post">
        <input type="hidden" name="sendURL" value="https://login.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8&...">

        <label for="name">Name:</label>
        <input type="text" name="name" value="<?php if (!empty($_POST['name'])) { echo $_POST['name']; } ?>">

        <label for="email">E-Mail:</label>
        <input type="text" name="email" value="<?php if (!empty($_POST['email'])) { echo $_POST['email']; } ?>">

        <label for="message">Message:</label>
        <textarea name="message"><?php if (!empty($_POST['message'])) { echo $_POST['message']; } ?></textarea>

        <?php if ($captchaFailed): ?>
            <p>reCAPTCHA failed! Please try again!</p>
        <?php endif; ?>
        <div class="g-recaptcha" data-sitekey="<?php echo $key_public; ?>"></div>
    </form>

    <script src="https://www.google.com/recaptcha/api.js"></script>
</body>
</html>

これは、フォーム データを別の場所に送信する前に reCAPTCHA を検証する必要があるほとんどすべての場合に使用できます。

于 2016-03-10T17:45:45.450 に答える