2012-06-08 2 views
0

Я пытаюсь интегрировать Recaptcha с одной из моих форм. Мне как-то удалось поместить recaptcha в форму и передать ее с помощью Curl (с помощью этого сообщения: What is blocking fsockopen?). Но recaptcha, похоже, не принимает даже правильных ответов.Recaptcha response null для действительного ответа

Я не настолько хорошо разбираюсь в PHP, но при отладке кода (offcourse using echo) выясняется, что ответ приходит как пустой. Я потратил около 2 дней на это, но все же безрезультатно.

Нужно ли вносить изменения в recaptcha_check_answer после включения Curl?

Примечание: Я использую WampServer 2.2 (Apache: 2.2.21, PHP: 5.3.10)

Вот выдержки из моего кода формы и отправить код.

/** Recaptcha display Code**/ 
require_once('recaptchalib.php'); 
$publickey = "6LeamtESAAAAAH-77WMLP5NqvCQR8g3ZMJ7kZJvV"; // you got this from recaptcha.org 

$out = '<div><label for="captcha'.$form_id.'">* '.$field_object->field_label.'</label></div>'; 
$out .= recaptcha_get_html($publickey); 
return $out; 


/** Form Submit Code **/ 
require_once('recaptchalib.php'); 
$privatekey = "6LeamtESAAAAAFM1d1Zd2XRDlTjxZRH8OaTowg7n"; 

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

if (!$resp->is_valid) { 
    if (empty($resp->error)) 
     $this->setFormError('captcha', __('You copied the number from the captcha field incorrectly.', 'custom-contact-forms')); 
    else $this->setFormError('captcha', $resp->error); 
} 

Вот модифицированный код Recaptcha

<?php 

define("RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api"); 
define("RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api"); 
define("RECAPTCHA_VERIFY_SERVER", "www.google.com"); 

function _recaptcha_qsencode ($data) { 
     $req = ""; 
     foreach ($data as $key => $value) 
       $req .= $key . '=' . urlencode(stripslashes($value)) . '&'; 

     // Cut the last '&' 
     $req=substr($req,0,strlen($req)-1); 
     return $req; 
} 

function _recaptcha_http_post($host, $path, $data, $port = 80) { 

     $req = _recaptcha_qsencode ($data); 
     $request = curl_init("http://".$host.$path); 

     curl_setopt($request, CURLOPT_USERAGENT, "reCAPTCHA/PHP"); 
     curl_setopt($request, CURLOPT_POST, true); 
     curl_setopt($request, CURLOPT_POSTFIELDS, $req); 
     curl_setopt($request, CURLOPT_RETURNTRANSFER, true); 

     $response = curl_exec($request); 
     return $response; 
} 

function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) 
{ 
    if ($pubkey == null || $pubkey == '') { 
     die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>"); 
    } 

    if ($use_ssl) { 
       $server = RECAPTCHA_API_SECURE_SERVER; 
     } else { 
       $server = RECAPTCHA_API_SERVER; 
     } 

     $errorpart = ""; 
     if ($error) { 
      $errorpart = "&amp;error=" . $error; 
     } 
     return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script> 

    <noscript> 
     <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/> 
     <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea> 
     <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/> 
    </noscript>'; 
} 

class ReCaptchaResponse { 
     var $is_valid; 
     var $error; 
} 

function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) 
{ 
    if ($privkey == null || $privkey == '') { 
     die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>"); 
    } 
    if ($remoteip == null || $remoteip == '') { 
     die ("For security reasons, you must pass the remote ip to reCAPTCHA"); 
    } 

     //discard spam submissions 
     if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { 
       $recaptcha_response = new ReCaptchaResponse(); 
       $recaptcha_response->is_valid = false; 
       $recaptcha_response->error = 'incorrect-captcha-sol'; 
       return $recaptcha_response; 
     } 

     $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify", 
              array (
               'privatekey' => $privkey, 
               'remoteip' => $remoteip, 
               'challenge' => $challenge, 
               'response' => $response 
               ) + $extra_params 
             ); 

     $answers = explode ("\n", $response [1]); 
     $recaptcha_response = new ReCaptchaResponse(); 

     if (trim ($answers [0]) == 'true') { 
       $recaptcha_response->is_valid = true; 
     } 
     else { 
       $recaptcha_response->is_valid = false; 
       $recaptcha_response->error = $answers [1]; 
     } 
     return $recaptcha_response; 
} 

function recaptcha_get_signup_url ($domain = null, $appname = null) { 
    return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); 
} 

function _recaptcha_aes_pad($val) { 
    $block_size = 16; 
    $numpad = $block_size - (strlen ($val) % $block_size); 
    return str_pad($val, strlen ($val) + $numpad, chr($numpad)); 
} 

/* Mailhide related code */ 

function _recaptcha_aes_encrypt($val,$ky) { 
    if (! function_exists ("mcrypt_encrypt")) { 
     die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); 
    } 
    $mode=MCRYPT_MODE_CBC; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=_recaptcha_aes_pad($val); 
    return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); 
} 


function _recaptcha_mailhide_urlbase64 ($x) { 
    return strtr(base64_encode ($x), '+/', '-_'); 
} 

/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ 
function recaptcha_mailhide_url($pubkey, $privkey, $email) { 
    if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { 
     die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . 
      "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>"); 
    } 


    $ky = pack('H*', $privkey); 
    $cryptmail = _recaptcha_aes_encrypt ($email, $ky); 

    return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); 
} 

function _recaptcha_mailhide_email_parts ($email) { 
    $arr = preg_split("/@/", $email); 

    if (strlen ($arr[0]) <= 4) { 
     $arr[0] = substr ($arr[0], 0, 1); 
    } else if (strlen ($arr[0]) <= 6) { 
     $arr[0] = substr ($arr[0], 0, 3); 
    } else { 
     $arr[0] = substr ($arr[0], 0, 4); 
    } 
    return $arr; 
} 

function recaptcha_mailhide_html($pubkey, $privkey, $email) { 
    $emailparts = _recaptcha_mailhide_email_parts ($email); 
    $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); 

    return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) . 
     "' onclick=\"window.open('" . htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ($emailparts [1]); 

} 

?> 

ответ

1

Я также испытываю эти проблемы во всех моих сайтах, при работе в режиме разработки. Не берите в голову, если вы работаете с виртуальным хостом (то есть: mydomain.local) или просто «плоскостным» localhost (localhost/mydomain). Как только я переключаюсь на производство на реальном сервере производства, recaptcha работает как шарм.

Так что, я думаю, это должно быть что-то связанное с Apache. Самым разумным кодом будет HTTP-запрос, сделанный througout php, но я проверил, что fsockopen работает правильно. Не отображается предупреждение или ошибка, таинственная вещь - $ response всегда пуста.

Я пробовал в своем домене formacion online, который является VPS, и, похоже, он работает нормально. Те же настройки в большинстве значений, показанных phpinfo().

+0

Это была полезная информация. Во всяком случае, я удалил recaptcha с моей проверки страницы и использовал секретный код третьей стороны. Попробуй с предложением ur в следующем веб-релизе. –

 Смежные вопросы

  • Нет связанных вопросов^_^