Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-03-2010 12:09:57

rapotor
Nouveau membre
Date d'inscription: 28-03-2010
Messages: 2

[RESOLU] [1.10] reCaptcha, Zend_Form, Zend_Validate

Bonjour à tous,

Je vous soumets mon problème.

Situation:
Je tente d'utiliser le service reCaptcha dans un formulaire. Je suis actuellement en localhost.

Les faits:
J'ai correctement placé le recaptcha dans celui-ci et la validation semble bien s'effectuer.
Par contre, le recaptcha me renvoi toujours "INCORRECT-CAPTCHA-SOL" alors que je pense être un humain smile (bref je tape correctement les deux mots)

Mes vérifications:
- J'ai vérifié que le formulaire me renvoi correctement "recaptcha_challenge_field" et "recaptcha_response_field" avec d'un coté ce que j'ai tapé et de l'autre, une chaine.
- J'ai vérifié que mes clés sont bien présentes.


Si vous avez de brillantes idées; je suis tout à votre écoute. Merci d'avance.

Rapotor


Les classes:

Le formulaire d'un coté:

Code:

<?php



class Form_SignUp extends Zend_Form

{

  public function init()

  {

    $this->addElement('text'

                     ,'email'

                     ,array('filters'       => array('StringTrim', 'StringToLower')

                            ,'validators'   => array('EmailAddress')

                            ,'required'     => true

                            ,'decorators'   => array('ViewHelper')

                            ,'label'        => 'Email:'

                            )

                      );

    

    $this->addElement('submit'

                    , 'signup'

                    , array('required' => false

                            ,'ignore' => true

                            ,'decorators' => array('ViewHelper')

                            ,'label' => 'Sign Up'

                            )

                      );

    

    /* BEGIN recaptcha */

    $publicKey  = 'MA_CLE_PUBLIQUE';

    $privateKey = 'MA_CLE_PRIVEE';

    $recaptcha = new Zend_Service_ReCaptcha($publicKey, $privateKey);

    

        $adapter = new Zend_Captcha_ReCaptcha();

        $adapter->setService($recaptcha);

    

        $captcha = new Zend_Form_Element_Captcha('recaptcha'

                                            , array( 'label'       => "Are you a human?"

                                                    ,'decorators'   => array()

                                                    ,'captcha'      => $adapter

                                                    )

                                             );

    

    $captcha->removeDecorator('label')

            ->removeDecorator('HtmlTag')

            ->removeDecorator('errors')

            ->addValidator( new CL_Validate_Recaptcha($publicKey, $privateKey) );

            

        $this->addElement($captcha);

    /* END recaptcha */

    

    $this->setDecorators(array('ViewHelper'));

    

  }

  

}



?>

et voici la classe de validation:

Code:

<?php

   

  class CL_Validate_Recaptcha extends Zend_Validate_Abstract

  {

    const MISSING_CHALLENGE_FIELD = 'MISSING_CHALLENGE_FIELD';

    const INVALID_SITE_PUBLIC_KEY = 'INVALID_SITE_PUBLIC_KEY';

    const INVALID_SITE_PRIVATE_KEY = 'INVALID_SITE_PRIVATE_KEY';

    const INVALID_REQUEST_COOKIE = 'INVALID_REQUEST_COOKIE';

    const INCORRECT_CAPTCHA_SOL = 'INCORRECT_CAPTCHA_SOL';

    const VERIFY_PARAMS_INCORRECT = 'VERIFY_PARAMS_INCORRECT';

    const INVALID_REFERRER = 'INVALID_REFERRER';

    const RECAPTCHA_NOT_REACHABLE = 'RECAPTCHA_NOT_REACHABLE';

    

    protected $_messageTemplates = array(

      self::MISSING_CHALLENGE_FIELD   => "Challenge field is missing",

      self::INVALID_SITE_PUBLIC_KEY   => "Unable to validate the public key",

      self::INVALID_SITE_PRIVATE_KEY  => "Unable to validate the private key",

      self::INVALID_REQUEST_COOKIE    => "The challenge parameter of the verify script is incorrect",

      self::INCORRECT_CAPTCHA_SOL     => "The CAPTCHA solution is incorrect",

      self::VERIFY_PARAMS_INCORRECT   => "The parameters to verify are incorrect",

      self::INVALID_REFERRER          => "reCAPTCHA keys invalid for this domain",

      self::RECAPTCHA_NOT_REACHABLE   => "Unable to contact reCAPTCHA service"

    );

    

    protected static $httpClient = null;

    

    protected $publicKey = null;

    

    protected $privateKey = null;

    

    public static function setHttpClient(Zend_Http_Client $httpClient)

    {

      self::$httpClient = $httpClient;

    }

    

    public function __construct($publicKey, $privateKey)

    {

      $this->publicKey = $publicKey;

      $this->privateKey = $privateKey;

    }

    

    public function isValid($value)

    {

      // Grab non-prototyped $context param set from Zend_Form

      $params = func_get_args();

      $context = null;

      if (isset($params[1])) {

        $context = $params[1];

      }

      if (is_null($context) || !isset($context['recaptcha_challenge_field'])) {

        $this->_error(self::MISSING_CHALLENGE_FIELD);

        return false;

      }

      // ici j'ai vérifié que les clés sont bien présentes... elles le sont.
      $recaptcha = new Zend_Service_Recaptcha( $this->publicKey, $this->privateKey );

      if (!is_null(self::$httpClient)) {

        self::$httpClient->resetParameters();

        $recaptcha->setHttpClient(self::$httpClient);

      }
      

      // ici j'ai vérifié que $context contenait bien mes deux champs, tout est la!
      $result = $recaptcha->verify($context['recaptcha_challenge_field'], $context['recaptcha_response_field']);

      

      if (!$result->isValid()) {

        $errorCode = strtoupper(

          str_replace("-", '_', $result->getErrorCode())

        );

        $this->_error($errorCode);

        return false;

      }

      return true;

    }

  }

  

?>

Dernière modification par rapotor (29-03-2010 19:58:12)

Hors ligne

 

#2 29-03-2010 08:46:28

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [RESOLU] [1.10] reCaptcha, Zend_Form, Zend_Validate

J'ai l'impression que c'est toi qui a fait ce validateur. Zend en fournit un par défaut sur le reCaptcha d'activé. Pourquoi ne pas utiliser celui-ci?

Hors ligne

 

#3 29-03-2010 19:29:09

rapotor
Nouveau membre
Date d'inscription: 28-03-2010
Messages: 2

Re: [RESOLU] [1.10] reCaptcha, Zend_Form, Zend_Validate

Ah... effectivement... il était planqué!
Le validateur est "Zend_Captcha_ReCaptcha" lui-même.

Merci pour ta réponse.

Rapotor


Voici le code tout simple pour ceux qui arriverait par google... smile

Code:

    /* BEGIN recaptcha */
    $publicKey  = 'MA_CLE_PUBLIQUE';
    $privateKey = 'MA_CLE_PRIVEE';
   // ici on créé le service recaptcha
    $recaptcha = new Zend_Service_ReCaptcha($publicKey, $privateKey);
    
  // on créé l'adapter nécessaire à 'Zend_Form_Element_Captcha' pour le champ.
        $adapter = new Zend_Captcha_ReCaptcha();
        $adapter->setService($recaptcha);
    
        $captcha = new Zend_Form_Element_Captcha('recaptcha'
                                            , array( 'label'       => "Are you a human?"
                                                    ,'decorators'   => array()
                                                    ,'captcha'      => $adapter
                                                    )
                                             );
    
    $captcha->removeDecorator('label')
            ->removeDecorator('HtmlTag')
            ->removeDecorator('errors')
// ici ; le truc magique est que le validateur est l'adaptateur lui-même...
            ->addValidator( $adapter );
    
        
        $this->addElement($captcha);
    /* END recaptcha */

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages