reCAPTCHA Component & Helper for CakePHP

This article is also available in the following languages:
By Howard
an easy-to-use component and helper set to use reCAPTCHA on your website.
This is an easy to use component and helper set for you to get reCAPTCHA(including mailhide) running on your website now. If you don't know what reCAPTCHA is please head to http://recaptcha.net/ now to find out! Please note this code is largely derived off of the library provided for reCAPTCHA - it's just repurposed for ease of use in CakePHP.

Create the following files:
app/controllers/components/recaptcha.php 
app/views/helpers/recaptcha.php

code for app/controllers/components/recaptcha.php

Component Class:

<?php 
 
class RecaptchaComponent extends Object {
    var 
$publickey "";
    var 
$privatekey"";
    
    var 
$is_valid false;
    var 
$error "";
    
    function 
startup(&$controller){
        
Configure::write("Recaptcha.apiServer","http://api.recaptcha.net");
        
Configure::write("Recaptcha.apiSecureServer","https://api-secure.recaptcha.net");
        
Configure::write("Recaptcha.verifyServer","api-verify.recaptcha.net");
        
Configure::write("Recaptcha.pubKey"$this->publickey);
        
Configure::write("Recaptcha.privateKey"$this->privatekey);
        
        
$this->controller =& $controller;
        
$this->controller->helpers[] = "Recaptcha";
    }
    
    function 
valid($form){
        if (isset(
$form['recaptcha_challenge_field']) && isset($form['recaptcha_response_field'])){
            if(
$this->recaptcha_check_answer(
                
$this->privatekey
                
$_SERVER["REMOTE_ADDR"],
                
$form['recaptcha_challenge_field'], 
                
$form['recaptcha_response_field']
            ) == 
0)
                return 
false;

            if (
$this->is_valid)
                return 
true;
        }
        return 
false;
    }
    
    
/**
      * Calls an HTTP POST function to verify if the user's guess was correct
      * @param string $privkey
      * @param string $remoteip
      * @param string $challenge
      * @param string $response
      * @param array $extra_params an array of extra variables to post to the server
      * @return ReCaptchaResponse
      */
    
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='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</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) == || $response == null || strlen($response) == 0) {
                    
$this->is_valid false;
                    
$this->error 'incorrect-captcha-sol';
                    return 
0;
            }

            
$response $this->_recaptcha_http_post(Configure::read('Recaptcha.verifyServer'), "/verify",
                                              array (
                                                     
'privatekey' => $privkey,
                                                     
'remoteip' => $remoteip,
                                                     
'challenge' => $challenge,
                                                     
'response' => $response
                                                     
) + $extra_params
                                              
);
    
            
$answers explode ("\n"$response [1]);
            
            if (
trim ($answers [0]) == 'true') {
                    
$this->is_valid true;
                    return 
1;
            }else{
                    
$this->is_valid false;
                    
$this->error $answers [1];
                    return 
0;
            }
    }
    
    
    
/**
     * Submits an HTTP POST to a reCAPTCHA server
     * @param string $host
     * @param string $path
     * @param array $data
     * @param int port
     * @return array response
     */
    
function _recaptcha_http_post($host$path$data$port 80) {

        
$req $this->_recaptcha_qsencode ($data);

        
$http_request  "POST $path HTTP/1.0\r\n";
        
$http_request .= "Host: $host\r\n";
        
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
        
$http_request .= "Content-Length: " strlen($req) . "\r\n";
        
$http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
        
$http_request .= "\r\n";
        
$http_request .= $req;

        
$response '';
        if( 
false == ( $fs = @fsockopen($host$port$errno$errstr10) ) ) {
                die (
'Could not open socket');
        }

        
fwrite($fs$http_request);

        while ( !
feof($fs) )
                
$response .= fgets($fs1160); // One TCP-IP packet
        
fclose($fs);
        
$response explode("\r\n\r\n"$response2);

        return 
$response;
    }
    
    
    
/**
     * Encodes the given data into a query string format
     * @param $data - array of string elements to be encoded
     * @return string - encoded request
     */
    
function _recaptcha_qsencode ($data) {
        
$req "";
        foreach ( 
$data as $key => $value )
                
$req .= $key '=' urlencodestripslashes($value) ) . '&';

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




code for app/views/helpers/recaptcha.php

Helper Class:

<?php 
class RecaptchaHelper extends AppHelper {
    var 
$helpers = array('form'); 
    
    function 
display_form($output_method 'return'$error null$use_ssl false){
        
$data $this->__form(Configure::read("Recaptcha.pubKey"),$error,$use_ssl);
        if(
$output_method == "echo")
            echo 
$data;
        else
            return 
$data;
    }
    
    function 
hide_mail($email '',$output_method 'return'){
        
$data $this->recaptcha_mailhide_html(Configure::read('Recaptcha.pubKey'), Configure::read('Recaptcha.privateKey'), $email);
        if(
$output_method == "echo")
            echo 
$data;
        else
            return 
$data;
    }
    
    
/**
     * Gets the challenge HTML (javascript and non-javascript version).
     * This is called from the browser, and the resulting reCAPTCHA HTML widget
     * is embedded within the HTML form it was called from.
     * @param string $pubkey A public key for reCAPTCHA
     * @param string $error The error given by reCAPTCHA (optional, default is null)
     * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)
    
     * @return string - The HTML to be embedded in the user's form.
     */
    
function __form($pubkey$error null$use_ssl false){
        if (
$pubkey == null || $pubkey == '') {
            die (
"To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>");
        }
        
        if (
$use_ssl) {
                    
$server Configure::read('Recaptcha.apiSecureServer');
            } else {
                    
$server Configure::read('Recaptcha.apiServer');
            }
    
            
$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"/>
              <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
        </noscript>'
;
    }

    
/* 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=$this->_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://mailhide.recaptcha.net/apikey'>http://mailhide.recaptcha.net/apikey</a>");
        }
        
    
        
$ky pack('H*'$privkey);
        
$cryptmail $this->_recaptcha_aes_encrypt ($email$ky);
        
        return 
"http://mailhide.recaptcha.net/d?k=" $pubkey "&c=" $this->_recaptcha_mailhide_urlbase64 ($cryptmail);
    }
    
    
/**
     * gets the parts of the email to expose to the user.
     * eg, given johndoe@example,com return ["john", "example.com"].
     * the email is then displayed as john...@example.com
     */
    
function _recaptcha_mailhide_email_parts ($email) {
        
$arr preg_split("/@/"$email );
    
        if (
strlen ($arr[0]) <= 4) {
            
$arr[0] = substr ($arr[0], 01);
        } else if (
strlen ($arr[0]) <= 6) {
            
$arr[0] = substr ($arr[0], 03);
        } else {
            
$arr[0] = substr ($arr[0], 04);
        }
        return 
$arr;
    }
    
    
/**
     * Gets html to display an email address given a public an private key.
     * to get a key, go to:
     *
     * http://mailhide.recaptcha.net/apikey
     */
    
function recaptcha_mailhide_html($pubkey$privkey$email) {
        
$emailparts $this->_recaptcha_mailhide_email_parts ($email);
        
$url $this->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]);
    
    }
        

}
?>

To use the reCAPTCHA system load the component

Controller Class:

<?php 
var $components = array('Recaptcha'); 
?>

After you save the component and helper and initiate them, set your public & private keys in "beforeFilter" of your controller to the ones you received when you signed up on the reCAPTCHA website.

Controller Class:

<?php 
function beforeFilter(){
   
$this->Recaptcha->publickey "";
   
$this->Recaptcha->privatekey "";
}
?>

in the view, the helper can be used to verify form submissions or hide your e-mail addresses (NOTE: mcrypt is required for this.)

Controller Class:

<?php 
//create the reCAPTCHA form.
 
$recaptcha->display_form('echo')

//hide an e-mail address
 
$recaptcha->hide_mail("someuser@somdomain.tld",'echo');
?>


in the controller to verify a form submission using reCAPTCHA do the following.

Controller Class:

<?php 
if($this->Recaptcha->valid($this->params['form']))
  
//submission is valid!
else
  
//invalid reCAPTCHA entry.
?>

I hope you enjoy it, this is the first component / helper (let alone helper) pair I've written.

Comments

  • Posted 05/19/11 11:13:18 PM
    Hiya,

    Thanks for the component and helper code... this works pretty well. Though, recently I ran into an issue with the URLs. It appears the old recaptcha API URLs aren't working anymore. To get this to work, again, I changed the following (both changes are in the controller):

    in startup()...
    Configure::write("Recaptcha.apiServer","http://www.google.com/recaptcha/api");
    Configure::write("Recaptcha.apiSecureServer","https://www.google.com/recaptcha/api");
    Configure::write("Recaptcha.verifyServer","www.google.com");

    in recaptcha_check_answer()...
    $response = $this->_recaptcha_http_post(Configure::read('Recaptcha.verifyServer'), "/recaptcha/api/verify", [...]
    I hope this helps!
  • Posted 04/11/11 12:51:06 AM
    Perfect for me, I just modified a thing on the helper: I've separate the function "__form()" in two parts, one for the widget and one only for the the HTML script tag to place it alone on my layout.

    Thank you.
  • Posted 03/03/11 05:18:30 PM
    For anyone who is interested in having the Recaptcha, validated after form validation. You can accomplish this by sending Recaptcha->valid( $this->params['form'] ) as a @parameter of your Model->registration() method.

    public function register( $data = array(), $recaptcha = false ) {
    $this->set( $data );
    if ( $this->validates() ) {
    if ( $recaptcha ) {...}
    }
    return false;
    }

    Very simple!
  • Posted 01/03/11 09:47:12 AM
    Many thanks for this. It took me only 10 minutes to add the component/helper and it worked beautifully!
  • Posted 01/01/11 12:30:28 PM
    I've change to cake 1.3, and when I submit my form, I allways have $this->params['form'] empty.

    What I need to do to put this working fine?
  • Posted 12/19/10 06:58:29 AM
    I used your plugin in my first cakephp project and it works great. However, i have a small problem with the ajax pagination. I include the captcha form inside a view having the ajax pagination and everytime i navigate into the new page, the whole view gets updated (in the ajax mode) but the captcha form disappears. If i navigate in the normal way (no ajax), form still show up. Do you have any suggestion to solve it ?
  • Posted 10/21/10 02:34:23 AM
    This has worked for me on cakephp 1.3.x

    Although, I am having issue when validating the form. When I click submit on an empty form. It first validates the captcha and does not display the error on each forms. What I wanted is, validate the form first, then recaptcha.

    I am using this code.

    if($this->Recaptcha->valid($this->params['form'])) {
       if (!empty($this->data)) {
       $this->Feedback->create();
        if ($this->Feedback->save($this->data)) {
                //... save here
            } else {
           $this->Session->setFlash(__('could not be saved.', true));
        }
    }
    }
    }
    else {
       //invalid reCAPTCHA entry.
       $this->Session->setFlash(__('Invalid captcha. Please, try again.', true));
    }

    What might be possibly wrong?

    Thanks
  • Posted 09/02/10 12:00:54 PM
    My first component download from the bakery. Helped out a lot. Works beautiful on CakePHP 1.3.3.
  • Posted 07/13/10 12:28:07 PM
    var $compoments = array ('Recaptcha');
    use
    $this->Recaptcha->valid($this->params['form']))
    but Undefined property: ContactsController::$Recaptcha,
    Fatal error: Call to a member function valid() on a non-object

    the helpers it works great.

    cakephp v1.3.2
  • Posted 03/30/10 11:41:43 PM
    It works great,

    Thanks.

    www.the-di-lab.com
  • Posted 03/17/10 03:30:56 PM
    I'd been racking my brain as to how I could implement this so I Google searched it and this came up.

    Worked perfectly - well done!
  • Posted 02/25/10 01:26:43 AM
    Despite being a bit old, this component/helper works great.

    If you update to 1.3 and you want to use the new Component settings feature, you can change the startup function to initialize, and then just use the settings array.

    Component Class:

    <?php 
      
    function initialize(&$controller$settings = array()){
        
    $this->publickey $settings['publickey'];
        
    $this->privatekey $settings['privatekey'];

        
    Configure::write("Recaptcha.apiServer","http://api.recaptcha.net");
        
    Configure::write("Recaptcha.apiSecureServer","https://api-secure.recaptcha.net");
        
    Configure::write("Recaptcha.verifyServer","api-verify.recaptcha.net");
        
    Configure::write("Recaptcha.pubKey"$this->publickey);
        
    Configure::write("Recaptcha.privateKey"$this->privatekey);

        
    $this->controller =& $controller;
        
    $this->controller->helpers[] = "Recaptcha";
    }
    ?>

    And you would set your variables either in app_controller or where ever.

    Controller Class:

    <?php 
    var $components = array(
        
    'Recaptcha' => array(
            
    'publickey' => 'key',
            
    'privatekey' => 'other_key'
        
    ),
        
    'Auth' => array(
            
    'userModel' => 'MyUser',
            
    'loginAction' => array('controller' => 'users''action' => 'login')
        )
    );
    ?>
    It's a bit of a frivolous change, but it keeps your beforeFilter clean.
  • Posted 02/16/10 01:03:14 PM
    I've modified the original helper from Howard to also work with the Ajax API which you'll need for Ajax calls and e.g. on modal windows. There seems to be some bug related to this, which makes that you need the Ajax API to make it work.

    Here is the modified Helper code (app/views/helpers/recaptcha.php)

    Helper Class:

    <?php 

    <?php  
    class RecaptchaHelper extends AppHelper 
        var 
    $helpers = array('form');  
         
        function 
    display_form($output_method 'return'$error null$use_ssl false){ 
            
    $data $this->__form(Configure::read("Recaptcha.pubKey"),$error,$use_ssl); 
            if(
    $output_method == "echo"
                echo 
    $data
            else 
                return 
    $data
        } 
         
        function 
    hide_mail($email '',$output_method 'return'){ 
            
    $data $this->recaptcha_mailhide_html(Configure::read('Recaptcha.pubKey'), Configure::read('Recaptcha.privateKey'), $email); 
            if(
    $output_method == "echo"
                echo 
    $data
            else 
                return 
    $data
        } 
         
        
    /** 
         * Gets the challenge HTML (javascript and non-javascript version). 
         * This is called from the browser, and the resulting reCAPTCHA HTML widget 
         * is embedded within the HTML form it was called from. 
         * @param string $pubkey A public key for reCAPTCHA 
         * @param string $error The error given by reCAPTCHA (optional, default is null) 
         * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) 
         
         * @return string - The HTML to be embedded in the user's form. 
         */ 
        
    function __form($pubkey$error null$use_ssl false){ 
            if (
    $pubkey == null || $pubkey == '') { 
                die (
    "To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>"); 
            } 
             
            if (
    $use_ssl) { 
                        
    $server Configure::read('Recaptcha.apiSecureServer'); 
                } else { 
                        
    $server Configure::read('Recaptcha.apiServer'); 
                } 
         
                
    $errorpart ""
                if (
    $error) { 
                   
    $errorpart "&amp;error=" $error
                } 
         
                
            
                
                return 
    '
                <script type="text/javascript" src="' 
    .  $server .'/js/recaptcha_ajax.js">
                </script>
                <div id="recaptcha_div"></div>
                <script type="text/javascript">    
                 Recaptcha.create("' 
    .  $pubkey '",
                "recaptcha_div", {
                theme: "clean",
                });
                </script>
                '


        } 

        
    /* 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=$this->_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://mailhide.recaptcha.net/apikey'>http://mailhide.recaptcha.net/apikey</a>"); 
            } 
             
         
            
    $ky pack('H*'$privkey); 
            
    $cryptmail $this->_recaptcha_aes_encrypt ($email$ky); 
             
            return 
    "http://mailhide.recaptcha.net/d?k=" $pubkey "&c=" $this->_recaptcha_mailhide_urlbase64 ($cryptmail); 
        } 
         
        
    /** 
         * gets the parts of the email to expose to the user. 
         * eg, given johndoe@example,com return ["john", "example.com"]. 
         * the email is then displayed as john...@example.com 
         */ 
        
    function _recaptcha_mailhide_email_parts ($email) { 
            
    $arr preg_split("/@/"$email ); 
         
            if (
    strlen ($arr[0]) <= 4) { 
                
    $arr[0] = substr ($arr[0], 01); 
            } else if (
    strlen ($arr[0]) <= 6) { 
                
    $arr[0] = substr ($arr[0], 03); 
            } else { 
                
    $arr[0] = substr ($arr[0], 04); 
            } 
            return 
    $arr
        } 
         
        
    /** 
         * Gets html to display an email address given a public an private key. 
         * to get a key, go to: 
         * 
         * http://mailhide.recaptcha.net/apikey 
         */ 
        
    function recaptcha_mailhide_html($pubkey$privkey$email) { 
            
    $emailparts $this->_recaptcha_mailhide_email_parts ($email); 
            
    $url $this->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]); 
         
        } 
             


    ?> 
    ?>

    This is using the clean theme, check the reCAPTCHA site for other available themes. I hope this helps!
  • Posted 02/08/10 09:31:42 AM
    any chance we can get a peek at that updated code? thanks! :)
    • Posted 02/08/10 09:40:52 AM
      any chance we can get a peek at that updated code? thanks! :)
      Sure thing, it's really only two lines added to the component, and one line to the __form() function of the helper, but I'll paste the beginning of the component and the whole __form() function so you can see the changes in some sort of context.

      Component:

      <?php
       
      class RecaptchaComponent extends Object {
          var 
      $publickey "";
          var 
      $privatekey"";
          var 
      $theme"clean";

          var 
      $is_valid false;
          var 
      $error "";

          function 
      startup(&$controller){
              
      Configure::write("Recaptcha.apiServer","http://api.recaptcha.net");
              
      Configure::write("Recaptcha.apiSecureServer","https://api-secure.recaptcha.net");
              
      Configure::write("Recaptcha.verifyServer","api-verify.recaptcha.net");
              
      Configure::write("Recaptcha.pubKey"$this->publickey);
              
      Configure::write("Recaptcha.privateKey"$this->privatekey);
              
      Configure::write("Recaptcha.theme"$this->theme);

              
      $this->controller =& $controller;
              
      $this->controller->helpers[] = "Recaptcha";
          }
      ...

      helper->__form():


          function __form($pubkey, $error = null, $use_ssl = false){
              if ($pubkey == null || $pubkey == '') {
                  die ("To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>");
              }

              if ($use_ssl) {
            $server = Configure::read('Recaptcha.apiSecureServer');
          } else {
            $server = Configure::read('Recaptcha.apiServer');
          }

          $errorpart = "";
          if ($error) {
             $errorpart = "&amp;error=" . $error;
          }
          return '<script>var RecaptchaOptions = {theme:\''.Configure::read('Recaptcha.theme').'\'}; </script>
              <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"/>
                    <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
              </noscript>';
          }

      Then, to change the theme you simply set $this->Recaptcha->theme = ''; in your controller as you do with the public and private key component variables.

      Hope it's of help!

      Paul.
  • Posted 02/04/10 05:56:16 AM
    Had it up and running in no time at all using the standard captcha form.

    I have added a theme variable so I can change the default skin on the captcha which required passing through the variable from the controller, through the component to the helper which echoes "var RecaptchaOptions = {theme:\''.Configure::read('Recaptcha.theme').'\'}; " before the main javascript.

    Your first component/helper was a good one, keep up the good work!

    Paul.
  • Posted 12/15/09 01:32:15 PM
    Easy to use, had it up and running in minutes. Thanks.
  • Posted 11/10/09 09:26:05 PM
    Thanks.
  • Posted 09/02/09 08:31:42 AM
    Thanks.
  • Posted 08/05/09 08:18:53 AM
    I got error "Could not open socket"

    Here
    http://www.linux.uz/dsearch/signup
  • Posted 04/14/09 07:33:41 AM
    Great tutorial. However I think you have a small typo - the second-to-last code block actually goes in the View, but it's labeled "Controller class". That tripped me up until I realized it.

    Thanks again!
  • Posted 03/20/09 10:12:37 AM
    If you're using Security Component, don't forget to add the reCAPTCHA fields to your disabledFields:


    $this->Security->disabledFields = array('recaptcha_challenge_field', 'recaptcha_response_field');
  • Posted 03/19/09 11:37:45 PM
    I believe I might be having the same problems as the users above but it seems all my comments are being approved.

    I've used the block


    <?php 
    if($this->Recaptcha->valid($this->params['form']))
      
    //submission is valid!
    else
      
    //invalid reCAPTCHA entry.
    ?> 

    Any workarounds yet?
    • Posted 06/24/09 10:20:56 PM
      I believe I might be having the same problems as the users above but it seems all my comments are being approved.

      I've used the block


      <?php 
      if($this->Recaptcha->valid($this->params['form']))
        
      //submission is valid!
      else
        
      //invalid reCAPTCHA entry.
      ?> 

      Any workarounds yet?

      Hi here's a solution you can try, worked for me!

      Check your corresponding view, app/views/users/register.ctp (in my case)

      And make sure the code that displays the reCaptcha form:

      $recaptcha->display_form('echo')
      is within your form,NOT outside example:

      <?php 
          
      echo $form->create('User', array('url' => '/users/register'));
          
          
      $recaptcha->display_form('echo');

          echo 
      $form->input('username');
          echo 
      $form->input('password');
          echo 
      $form->input('email');
          echo 
      $form->input('first_name');
          echo 
      $form->input('last_name');
          
          echo 
      $form->end('Register'); 
       
      ?>
      Hope this helps! :)
  • Posted 02/17/09 06:24:33 PM
    When I load a view that I created with the code I get the following error many times. The only variation is digit itself... that changes with the characters of my private key.

    Warning (2): pack() [function.pack]: Type H: illegal hex digit L [APP/views/helpers/recaptcha.php, line 79]
    I must be missing a step but I can't figure it out. Can anyone help?
    • Posted 06/25/09 11:17:21 PM
      When I load a view that I created with the code I get the following error many times. The only variation is digit itself... that changes with the characters of my private key.

      Warning (2): pack() [function.pack]: Type H: illegal hex digit L [APP/views/helpers/recaptcha.php, line 79]
      I must be missing a step but I can't figure it out. Can anyone help?

      Hi try this!

      It seems one of the functions in your "/helpers/recaptcha.php" is missing, so add this function in there!


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

      Then... find the function hide_mail in the same page and add in the Public and Private Keys given for MailHide as variables, see below..


      function hide_mail($email = '',$output_method = 'return'){
              
              $pubkey = "01URu9mx0VAUTVkg3Eb6Bn1Q==";
              $privkey = "8AE48922E14FB61F90BDDBE4C61D70E5";
              
              $data = $this->recaptcha_mailhide_html($pubkey, $privkey, $email);
              if($output_method == "echo")
                  echo $data;
              else
                  return $data;
          }

      That solved the problem for me! Cheers! :)
    • Posted 02/27/09 03:56:49 PM
      You need to have mcrypt installed as stated above to use some of the helpers functions. Hope this helps!

      When I load a view that I created with the code I get the following error many times. The only variation is digit itself... that changes with the characters of my private key.

      Warning (2): pack() [function.pack]: Type H: illegal hex digit L [APP/views/helpers/recaptcha.php, line 79]
      I must be missing a step but I can't figure it out. Can anyone help?
  • Posted 12/06/08 03:03:18 AM
    In case someone has problems (like I): In the view the element must be called after the form->create() is executed.
  • Posted 11/23/08 12:00:57 PM
    When I add die(pr($this->params)) inside of my controller I see that it is empty so $recaptcha->recaptcha_check_answer() never gets executed. Recaptcha is included in both $this->helper and $this->component and the form displays without issue. I'm also not seeing any sign of the challenge response in $this->data.

    Any ideas where I might be going wrong or why $this->params['form'] refuses to be populated with the captcha response? Any help would be greatly appreciated.


    *** update ***
    It seems like this may be a problem with browsers? Everything works beautifully in IE 8. $this->params[form] is populated appropriately and I can validate the captcha response.

    Unfortunately it fails in Firefox 3.0.4 (safe mode), Safari 3.2, and Opera 9.62. At least it does for me. Anyone else validate or have a solution?
    • Posted 01/11/09 09:55:17 AM
      Any ideas where I might be going wrong or why $this->params['form'] refuses to be populated with the captcha response?
      I have exactly the same problem, though it has worked for some time, and I don't know why now it doesn't work anymore (and I really don't understand why in the ___form() function there are two inputs with the same name?)

      **EDIT**
      you need valid XHTML pages for this to work. I've modified my page according to the W3C validator, and now it works well!
  • Posted 10/22/08 12:15:18 AM
    You can group your Configure settings into an array and access them with dot notation. This is one major benefit of the Configure class over standard defines.

Comments are closed for articles over a year old