2009-12-11 11 views
7

Potrzebuję wstawić ReCaptcha w formularzu w mojej aplikacji ZF. Staram się postępować zgodnie z oficjalną dokumentacją, ale usługa ReCaptcha zwraca mi zawsze błąd "wrong-captcha-sol". Kod używam:Zend framework i ReCaptcha

(w formie)

// 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); 

(w sterowniku)

$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 
} 

Każda pomoc proszę?

Odpowiedz

20

Dlaczego wyciągasz oddzielny element z formularza, aby dokonać kontroli? Oto jak to zrobić:

Formularz

<?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 

Zobacz

echo $this->form; 

to jest tutaj dość przejrzysty kod. Po wykonaniu funkcji isValid() formant sprawdza wszystkie swoje elementy i zwraca true tylko wtedy, gdy każda z nich jest poprawna.

Oczywiście upewnij się, że klucze, których używasz, są odpowiednie dla domeny, w której uruchamiasz ten kod.

Daj mi znać, jeśli masz więcej pytań.

+0

Masz rację! Wielkie dzięki! Uratowałeś mnie! :) – Stefano

16

Śledziłem szybki start pod numerem the zend site, a dla mnie następująca była znacznie szybsza zmiana z captcha "Figleta".

$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' 
     ) 
    )); 
+4

+1 - znacznie prostsza niż zaakceptowana odpowiedź –

+0

To powinna być zaakceptowana odpowiedź. Użyłem go i zadziałało idealnie. Najprostszy sposób na reCaptcha. Dziękuję kolego;) –

+0

+1 wspaniała odpowiedź :) –