Comment valider Google reCaptcha

9

J'ai ajouté le google recaptcha dans le formulaire contactez-nous, mais la valeur est également soumise sans captcha. J'ai utilisé dans ma page de contact les codes suivants pour captcha:

 <div class="g-recaptcha" data-sitekey="XXXXXXXXXX"></div> 
 <script src='https://www.google.com/recaptcha/api.js'></script>

Ces deux codes que j'ai utilisés. dites-moi comment valider le captcha.

Manish Gaur
la source
1
installez cette extension magentocommerce.com/magento-connect/recaptcha-1.html
Raghu
cela validera votre captcha
Raghu

Réponses:

9

Vous devriez essayer ce code: je l'ai utilisé sur mon site.

<script>
window.onload = function() {
  var recaptcha = document.forms["contactForm"]["g-recaptcha-response"];
  recaptcha.required = true;
  recaptcha.oninvalid = function(e) {

    alert("Please complete the captcha");
   }
}
</script> 
NID
la source
fonctionnera-t-il sur la page de contact intégrée dans le thème ... ??
Manish Gaur
oui .. ça va .. laissez-moi savoir si cela a fonctionné
NID
2
puis remplacez form-validate par contactForm
NID
1
vous pouvez simplement installer une extension pour Google Analytics. magentocommerce.com/magento-connect/… . Google fait déjà un excellent travail de suivi de tout cela. Si vous voulez quelque chose de plus robuste plus tard, il existe des extensions payantes qui en font plus.
NID
1
peut-être que cela vous aidera .. magento.stackexchange.com/questions/37363/…
NID
7

Ce script utilise pour la validation google reCaptcha comme une validation par défaut de magento. veuillez l'utiliser.

<form name="freeeventForm" id="freeeventForm">
    <div id="RecaptchaField"></div>
    <input type="hidden" class="validate-reCAPTCHA">
</form>
        <script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>
    <script type="text/javascript">
        //< ![CDATA[
            var CaptchaCallback = function() {  
            grecaptcha.render('RecaptchaField', {'sitekey' : '6LeuiDwUAAAAALByt-xxxxxxxxxxx-xUsZHFkeEP'});
        };
        var customForm = new VarienForm('freeeventForm');
        Validation.add('validate-reCAPTCHA','reCAPTCHA is mandatory',function(){
            var response = grecaptcha.getResponse();
            if (response.length === 0) {
                    return false;
            }
            return true;
    });
        //]]>
    </script>
Shorabh
la source
Merci beaucoup, c'est la bonne réponse pour valider reCaptcha sur magento en utilisant prototype / validate.js. Travailler comme un charme!
Waleed Asender
Cela devrait être la réponse acceptée, adaptée avec succès à mes fins
ajmedway
pareil ici. Merci
biplab déroute
Je souhaite l'utiliser dans mon fichier billing.phtml, pouvez-vous me suggérer d'utiliser ce code mais pas de valider recaptcha. `<script> window.onload = function () {// var recaptcha = document.forms [" co-billing-form "] [" g-recaptcha-response "]; var recaptcha = jQuery ('. g-recaptcha-response'). val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert ("Veuillez compléter le captcha"); retour faux; }} </script> `
Abi Sharma
6

J'ai utilisé recaptcha dans le formulaire de contact ..

<form action="<?php echo Mage::getUrl('mcrecaptcha/index/save'); ?>" id="contactForm" method="post" onSubmit="return checkcaptcha() ;">
    <ul class="form-list">
            <li class="fields">
                <div class="field">
                    <div class="input-box">
                        <input placeholder="Name" name="name" id="name" title="<?php echo Mage::helper('contacts')->__('Name') ?>" value="<?php echo $this->escapeHtml($this->helper('contacts')->getUserName()) ?>" class="input-text required-entry" type="text" />
                    </div>
                </div>
                <div class="field">
                    <div class="input-box">
                        <input placeholder="Email" name="email" id="email" title="<?php echo Mage::helper('contacts')->__('Email') ?>" value="<?php echo $this->escapeHtml($this->helper('contacts')->getUserEmail()) ?>" class="input-text required-entry validate-email contact_us_margin_top" type="text" />
                    </div>
                </div>
            </li>
            <li>
                <div class="input-box">
                    <input placeholder="Telephone" name="telephone" id="telephone" title="<?php echo Mage::helper('contacts')->__('Telephone') ?>" value="" class="input-text contact_us_margin_top" type="text" />
                </div>
            </li>
            <li class="wide">
                <div class="input-box">
                    <textarea placeholder="Comment" name="comment" id="comment" title="<?php echo Mage::helper('contacts')->__('Comment') ?>" class="required-entry input-text contact_us_margin_top" cols="5" rows="3" style="width:100%;"></textarea>
                </div>
            </li>
               <li id="rcode">  
                        <div class="captcha">
                                <div class="g-recaptcha contact_us_margin_top" data-sitekey="6Ldi8xsUAAAAAHsK15YxKsdhIn6lGk-RUIk222-f"> </div>
                        </div>
                        <div class="buttons-set contact_us_margin_top">
                            <input type="text" name="hideit" id="hideit" value="" style="display:none !important;" />
                            <button type="submit" title="<?php echo Mage::helper('contacts')->__('Submit') ?>" class="button" onClick="_gaq.push(['_trackEvent', 'Submit', 'contacts click','Contact Us'])"><span><span><?php echo Mage::helper('contacts')->__('Submit') ?></span></span></button>
                        </div>
                        <span class='captcha-error'><?php echo Mage::helper('contacts')->__('Please check the the captcha form.') ?></span>
                </li>      
        </ul>
</form>

<script>
function checkcaptcha()
{
    if((jQuery('#g-recaptcha-response').val())=='')
    {
        jQuery('.captcha-error').css('display','block');
        return false;
    }
    else
    {
        jQuery('.captcha-error').css('display','none');
    }

}
</script>
Jigs Parmar
la source
j'ai implémenté le code captcha dans le formulaire de contact intégré du thème .... voulez-vous s'il vous plaît me dire en conséquence mon thème. je suis débutant à magento alors s'il vous plaît aidez-moi
Manish Gaur
j'implémente ce code dans le formulaire de contact intégré
Jigs Parmar
il vous suffit d'implémenter ce code dans votre formulaire et de modifier uniquement data-sitekey
Jigs Parmar
Veuillez accepter ma réponse si vous obtenez votre réponse
Jigs Parmar
ouais ......... voulez-vous s'il vous plaît chercher la réponse à cette question magento.stackexchange.com/questions/183456/…
Manish Gaur
5

À mon avis, la solution JavaScript acceptée ci-dessus n'est certainement pas la voie à suivre. Tout bot qui n'utilise pas JS (qui est la plupart d'entre eux) contournera simplement votre validation et vous obtiendrez tout le spam que vous essayez de bloquer. Toujours toujours toujours valider sur le serveur. La validation JS n'est qu'une première étape UX.

Quoi qu'il en soit, il existe plusieurs solutions, mais voici ce qui a fonctionné pour moi dans Magento 1.9 après de nombreuses heures de recherche. Cela s'appuyait à l'origine sur la réponse de Mike ci-dessus, mais remplace file_get_contents par cURL car la fonction précédente vous donnera généralement des erreurs de wrapper http en fonction de la configuration de votre serveur.

Créez votre propre module en créant un dossier / app / code / local / YourVendorName / ValidateCaptcha /

Dans votre nouveau dossier ValidateCaptcha, ajoutez un dossier Model avec un fichier Customer.php. Il sera utilisé pour remplacer le fichier core Customer.php fourni par Magento.

Copiez et collez ce code:

<?php
class YourVendorName_ValidateCaptcha_Model_Customer extends Mage_Customer_Model_Customer {

    /**
     * Validate customer attribute values.
     *
     * @return bool
     */
    public function validate()
    {
        // This section is from the core file
        $errors = array();
        if (!Zend_Validate::is( trim($this->getFirstname()) , 'NotEmpty')) {
            $errors[] = Mage::helper('customer')->__('The first name cannot be empty.');
        }

        if (!Zend_Validate::is( trim($this->getLastname()) , 'NotEmpty')) {
            $errors[] = Mage::helper('customer')->__('The last name cannot be empty.');
        }

        if (!Zend_Validate::is($this->getEmail(), 'EmailAddress')) {
            $errors[] = Mage::helper('customer')->__('Invalid email address "%s".', $this->getEmail());
        }

        $password = $this->getPassword();
        if (!$this->getId() && !Zend_Validate::is($password , 'NotEmpty')) {
            $errors[] = Mage::helper('customer')->__('The password cannot be empty.');
        }
        if (strlen($password) && !Zend_Validate::is($password, 'StringLength', array(6))) {
            $errors[] = Mage::helper('customer')->__('The minimum password length is %s', 6);
        }
        $confirmation = $this->getPasswordConfirmation();
        if ($password != $confirmation) {
            $errors[] = Mage::helper('customer')->__('Please make sure your passwords match.');
        }

        $entityType = Mage::getSingleton('eav/config')->getEntityType('customer');
        $attribute = Mage::getModel('customer/attribute')->loadByCode($entityType, 'dob');
        if ($attribute->getIsRequired() && '' == trim($this->getDob())) {
            $errors[] = Mage::helper('customer')->__('The Date of Birth is required.');
        }
        $attribute = Mage::getModel('customer/attribute')->loadByCode($entityType, 'taxvat');
        if ($attribute->getIsRequired() && '' == trim($this->getTaxvat())) {
            $errors[] = Mage::helper('customer')->__('The TAX/VAT number is required.');
        }
        $attribute = Mage::getModel('customer/attribute')->loadByCode($entityType, 'gender');
        if ($attribute->getIsRequired() && '' == trim($this->getGender())) {
            $errors[] = Mage::helper('customer')->__('Gender is required.');
        }

        // additional reCAPTCHA validation
        // this should actually be in it's own function, but I've added 
        // it here for simplicity

        // Magento uses this method for a few different requests, so make
        // sure it's limited only to the 'createpost' action
        $action = Mage::app()->getRequest()->getActionName();
        if ( $action == 'createpost' ) { // restrict to the registration page only
            $captcha = Mage::app()->getRequest()->getPost('g-recaptcha-response', 1);
            if ( $captcha == '' ) {
                // if the field is empty, add an error which will be
                // displayed at the top of the page
                $errors[] = Mage::helper('customer')->__('Please check the reCAPTCHA field to continue.');
            } else {
                $secret = 'your-secret-key-goes-here';
                $url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret . '&response=' . $captcha . '&remoteip=' . $_SERVER["REMOTE_ADDR"];

                $ch = curl_init();
                // if you're testing this locally, you'll likely need to 
                // add your own CURLOPT_CAINFO parameter or you'll get
                // SSL errors
                curl_setopt( $ch, CURLOPT_URL, $url );
                curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
                $response = curl_exec( $ch );

                $result = json_decode( $response, true );
                if ( trim( $result['success'] ) != true ) {
                    // Add reCAPTCHA error
                    // This will be shown at the top of the registration page
                    $errors[] = Mage::helper('customer')->__('reCAPTCHA unable to verify.');
                }
            }
        }

        // now return the errors with your reCAPTCHA validation as well
        if (empty($errors)) {
            return true;
        }
        return $errors;
    }


}

Ajoutez maintenant un dossier etc à votre module et créez un config.xml avec les éléments suivants:

<?xml version="1.0"?>
<config>
    <modules>
        <YourVendorName_ValidateCaptcha>
            <version>1.0</version>
        </YourVendorName_ValidateCaptcha>
    </modules>

    <global>
       <models>
          <customer>
              <rewrite>
                  <customer>YourVendorName_ValidateCaptcha_Model_Customer</customer>
              </rewrite>
          </customer>
       </models>
    </global>
</config>

Ensuite, vous devrez ajouter le JS à votre tête de thème. Sous app / design / frontend / default / YOURTHEME / template / page / html / head.phtml ajoutez ce droit à la fin. Si vous n'avez pas ce fichier, copiez-le à partir des fichiers de base. N'écrasez pas les fichiers de base, cependant. Faites toujours le vôtre!

<?php
/* reCAPTCHA */
if ( strpos( Mage::helper('core/url')->getCurrentUrl(), 'account/create') != false ) { ?>   
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<?php } ?>

Maintenant, dans app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml, ajoutez ceci juste avant la div set de boutons vers le bas:

    <div class="g-recaptcha" data-sitekey="your-site-key-goes-here"></div>
    <span id="captcha-required" style='display:none; color:#ff0000'><?php echo $this->__('Please Fill Recaptcha To Continue'); ?></span>

Presque fini! Enregistrez maintenant votre nouveau module en créant une application / etc / modules / YourVendorName / ValidateCaptcha.xml avec les éléments suivants:

<?xml version="1.0"?>
<config>
    <modules>
        <YourVendorName_ValidateCaptcha>
            <active>true</active>
            <codePool>local</codePool>
        </YourVendorName_ValidateCaptcha>
    </modules>
</config>

Remplacez YourVendorName tout au long de ce que vous souhaitez. Votre structure finale devrait ressembler à:

- app
  - code
    - local
      - YourVendorName
        - ValidateCaptcha
          - etc
            config.xml
          - Model
            Customer.php
- design
  - frontend
    - default
      - YOURTHEME
        - template
          - customer
            - form
              register.phtml
          - page
            - html
              head.phtml
          - persistent
            - customer
              - form
                register.phtml
- etc
  - modules
    YourVendorName_ValidateCaptcha.xml
Sean Michaud
la source
3

Pour valider le captcha, créez un contrôleur de sauvegarde pour enregistrer vos valeurs de formulaire et également la validation.

namespace Mike\SampleModule\Controller;

class Save extends \Magento\Framework\App\Action\Action
{
/**
* @var Google reCaptcha Options
*/
private static $_siteVerifyUrl = "https://www.google.com/recaptcha/api/siteverify?";
private $_secret;
private static $_version = "php_1.0";
/**
* Save Form Data
*
* @return array
*/
public function execute()
{
$captcha = $this->getRequest()->getParam('g-recaptcha-response');
$secret = "<--your secret key-->"; //Replace with your secret key
$response = null;
$path = self::$_siteVerifyUrl;
$dataC = array (
'secret' => $secret,
'remoteip' => $_SERVER["REMOTE_ADDR"],
'v' => self::$_version,
'response' => $captcha
);
$req = "";
foreach ($dataC as $key => $value) {
     $req .= $key . '=' . urlencode(stripslashes($value)) . '&';
}
// Cut the last '&'
$req = substr($req, 0, strlen($req)-1);
$response = file_get_contents($path . $req);
$answers = json_decode($response, true);
if(trim($answers ['success']) == true) {
    // Captcha Validated
    // Save Form Data
}else{
    // Display Captcha Error
}
}
}

Assurez-vous d'avoir remplacé la clé de site et la clé secrète dans les exemples de codes ci-dessus.

Mike
la source
Comment lier mon formulaire à ce fichier? Le formulaire passe à action = "<? Php echo $ this-> getPostActionUrl ()?>" Avec une méthode POST.
Peanuts
1

NID,

Votre extrait de script reCaptcha semble fonctionner, mais clarifiez s'il est entré dans le fichier head.phtml source de Magento? (ou le formulaire.phtml?) à placer juste en dessous en dehors de Magento par défaut pré PHP en type vert car c'est un.

Question lors de la saisie de php en particulier, est-il courant de l'entrer après cette section de commentaires php immédiate que Magento place en haut pour la plupart de leurs pages source de modèle comme cet exemple ci-dessous?

Magento Disclaimer code ici dans les balises php. PLACER LE RECAPTCHA ICI script de snippit ici?

De plus, qu'est-ce qui rend ce code de vérification de réponse reCaptcha dans cette vidéo ci-dessous plus adapté à la structure des méthodes de Magento: Ce tutoriel utilise sur la première ligne la ligne $ reCaptcha = $ _POST ?

Dernière question alternative: que se passe-t-il si j'utilise la version php pour effectuer cette vérification de réponse reCaptcha, un extrait de code php sera entré après la section des commentaires verts du modèle magento par défaut de php comme ceci

Certains codes, je ne veux pas que les messages apparaissent sur le front-end parce que contactForm par défaut donne déjà ses alertes rouges si l'utilisateur ne saisit pas toutes les informations qu'il dira sous chaque champ, je veux juste que reCaptcha fonctionne pour ce contactForm. Mais d'une manière que je comprendrai également pour une utilisation future. Votre chemin est créé par vous-même en tant que développeur ou programmeur?

Paul N
la source