2009-12-11 82 views
7

我需要在我的ZF應用程序的表單中插入ReCaptcha。我試圖遵循官方文檔,但ReCaptcha服務總是返回錯誤'錯誤 - 驗證碼'。 我正在使用的代碼:Zend框架和ReCaptcha

(格式)

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

(在控制器)

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

任何幫助嗎?

回答

20

爲什麼你從表單中抽取一個單獨的元素來檢查?這是我怎麼做到這一點:

<?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')); 
    } 
} 

控制器

$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 

查看

echo $this->form; 

這這裏是相當透明的代碼。當form的isValid()被執行時,它會驗證它的所有元素,並且只有在每個元素都有效時才返回true。

當然,確保您使用的密鑰與運行此代碼的域相關。

讓我知道你是否有更多的問題。

+0

你說得對!非常感謝!你救了我! :) – Stefano 2009-12-13 09:24:46

16

我在the zend site的快速入門之後,對於我來說,以下是來自'Figlet'驗證碼的更快更改。

$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 - 比接受的答案簡單得多 – 2011-07-16 12:43:34

+0

這應該是被接受的答案。我用它,它運作完美。 reCaptcha最簡單的方法。感謝哥們;) – 2013-07-29 09:33:02

+0

+1很好回答:) – 2013-10-04 07:55:25