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