Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

I was following the quick start at the zend site, and for me the following was much quicker change from the 'Figlet' captcha.

   $this->addElement('captcha', 'captcha', array(
        'label' => 'Please enter two words displayed below:',
        'required' => true,
        'captcha' => array(
            'pubkey' => '---your public key here---',
            'privkey' => '---your private key here---',
            'captcha' => 'reCaptcha'
        )
    ));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top