Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 (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é:
<?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:
<?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
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
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...
/* 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