views:

715

answers:

2

I need to insert ReCaptcha in a form in my ZF application. I'm trying to follow the official documentation, but the ReCaptcha service return me always the error 'incorrect-captcha-sol'. The code I'm using:

(In the form)

// configure the captcha service $privateKey = 'XXXXXXXXXXXXXXXXXXX'; $publicKey = 'YYYYYYYYYYYYYYYYYYYY'; $recaptcha = new Zend_Service_ReCaptcha($publicKey, $privateKey);

    // create the captcha control
    $captcha = new Zend_Form_Element_Captcha('captcha',
        array('captcha'        => 'ReCaptcha',
     'captchaOptions' => array('captcha' => 'ReCaptcha', 'service' => $recaptcha)));

$this->addElement($captcha);

(In the controller)

$recaptcha = new Zend_Service_ReCaptcha('YYYYYYYYYYYYY', 'XXXXXXXXXXXXXXX');

$result = $recaptcha->verify($this->_getParam('recaptcha_challenge_field'), $this->_getParam('recaptcha_response_field'));

            if (!$result->isValid()) {
                //ReCaptcha validation error
           }

Any help please?

+2  A: 

Why do you pull a separate element from the form to make a check? This is how I do this:

Form

<?php
class Default_Form_ReCaptcha extends Zend_Form
{
  public function init()
  {
 $publickey = 'YOUR KEY HERE';
 $privatekey = 'YOUR KEY HERE';
    $recaptcha = new Zend_Service_ReCaptcha($publickey, $privatekey);

    $captcha = new Zend_Form_Element_Captcha('captcha',
          array(
    'captcha'        => 'ReCaptcha',
    'captchaOptions' => array('captcha' => 'ReCaptcha', 'service' => $recaptcha),
    'ignore' => true
    )
  );

    $this->addElement($captcha);

    $this->addElement('text', 'data', array('label' => 'Some data'));
    $this->addElement('submit', 'submit', array('label' => 'Submit'));
   }
}

Controller

$form = new Default_Form_ReCaptcha();

if ($this->getRequest()->isPost()===true) {
    if($form->isValid($_POST)===true) {
     $values = $form->getValues();
     var_dump($values);
     die();
    }
}

$this->view->form = $form

View

echo $this->form;

This is quite transparent code here. When form's isValid() is executed, it validates all its elements and returns true only if each of those is valid.

An of course ensure that the keys you're using are relevant to the domain where you run this code.

Let me know if you have more questions.


PavelDubinin.com - Professional Web Development blog

Pavel Dubinin
You're right! Many thanks! You saved me! :)
Stefano