Come convalidare Google reCaptcha


9

Ho aggiunto il recaptcha di Google nel modulo di contatto, ma anche il valore viene inviato senza captcha. Ho usato nella mia pagina dei contatti i seguenti codici per captcha:

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

Ho usato questi due codici. per favore dimmi come posso convalidare captcha.



questo convaliderà il tuo captcha
Raghu,

Risposte:


9

Dovresti provare questo codice: lo sto usando sul mio sito.

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

funzionerà sulla pagina di contatto integrata nel tema ... ??
Manish Gaur,

sì .. mi farà sapere se ha funzionato
NID

2
quindi sostituire form-validate con contactForm
NID

1
potresti semplicemente installare un'estensione per Google Analytics. magentocommerce.com/magento-connect/… . Google fa già un ottimo lavoro nel tracciare tutte queste cose. Se vuoi qualcosa di più robusto in seguito, ci sono estensioni a pagamento che fanno di più.
NID

1
potrebbe essere questo che ti aiuterà .. magento.stackexchange.com/questions/37363/…
NID

7

Questo script utilizza per la convalida goCo reCaptcha come una convalida predefinita di magento. per favore usalo.

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

Grazie mille, questa è la risposta giusta per convalidare reCaptcha su magento usando prototype / validate.js. Funzionando come un incanto!
Waleed Asender,

Questa dovrebbe essere la risposta accettata, adattata con successo ai miei scopi
ajmedway,

anch'io. Grazie
biplab rout

Voglio usarlo nel mio file billing.phtml, per favore mi può suggerire che sto usando questo codice ma non sto convalidando recaptcha. `<script> window.onload = function () {// var recaptcha = document.forms [" modulo di co-fatturazione "] [" g-recaptcha-response "]; var recaptcha = jQuery ('. g-recaptcha-response'). val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert ("Per favore completa il captcha"); restituire false; }} </script> `
Abi Sharma,

6

Ho usato recaptcha nel modulo di contatto ..

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

ho implementato il codice captcha nel modulo di contatto incorporato del tema .... per favore, mi dirai di conseguenza il mio tema. sono principiante nel magento, quindi per favore aiutatemi
Manish Gaur,

implemento questo codice nel modulo di contatto integrato
Jigs Parmar,

devi solo implementare questo codice nel tuo modulo e cambiare solo data-sitekey
Jigs Parmar

Accetta la mia risposta se ricevi la tua risposta
Jigs Parmar,

si ......... per favore, cercherai la risposta a questa domanda magento.stackexchange.com/questions/183456/…
Manish Gaur,

5

La soluzione JavaScript accettata sopra NON è sicuramente la strada da percorrere secondo me. Qualsiasi bot che non utilizza JS (che è la maggior parte di essi) ignorerà semplicemente la tua convalida e otterrai tutto lo spam che stai cercando di bloccare. Sempre convalidare sempre sempre sul server. La validazione JS è solo un primo passo di UX.

Comunque, ci sono più soluzioni, ma ecco cosa ha funzionato per me in Magento 1.9 dopo molte ore di ricerca. Questo originariamente si basava sulla risposta di Mike sopra, ma sostituisce file_get_contents per cURL poiché la funzione precedente di solito ti dà errori del wrapper http a seconda della configurazione del tuo server.

Crea il tuo modulo creando una cartella / app / codice / local / YourVendorName / ValidateCaptcha /

Nella nuova cartella ValidateCaptcha, aggiungi una cartella Modello con un file Customer.php. Questo verrà utilizzato per sovrascrivere il file Customer.php principale fornito da Magento.

Copia e incolla questo codice:

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


}

Ora aggiungi una cartella etc al tuo modulo e crea un file config.xml con il seguente:

<?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>

Successivamente dovrai aggiungere il JS alla testa del tema. Sotto app / design / frontend / default / YOURTHEME / template / page / html / head.phtml aggiungi questo diritto alla fine. Se non si dispone di questo file, copiarlo dai file di base. Tuttavia, non sovrascrivere i file di base. Crea sempre il tuo!

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

Ora in app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml aggiungi questo prima del div set di pulsanti nella parte inferiore:

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

Quasi fatto! Ora registra il tuo nuovo modulo creando un'app / etc / modules / YourVendorName / ValidateCaptcha.xml con il seguente:

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

Sostituisci YourVendorName ovunque con quello che desideri. La tua struttura finale dovrebbe essere simile a:

- 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

3

Per convalidare captcha, creare un controller di salvataggio per salvare i valori del modulo e anche la convalida.

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

Assicurati di aver sostituito la chiave del sito e la chiave segreta nei codici di esempio sopra.


Come collego il mio modulo a questo file? Il modulo va in action = "<? Php echo $ this-> getPostActionUrl ()?>" Con un metodo POST.
Peanuts,

1

NID,

Il tuo frammento di script di reCaptcha sembra funzionare ma chiarisci se è entrato nel head.phtml di Magento? (o il form.phtml?) da posizionare proprio sotto al di fuori di Magento predefinito pre PHP in tipo verde perché è a.

Domanda quando si entra in particolare php è normale inserirla dopo quella sezione di commenti php immediati che Magento inserisce nella parte superiore della maggior parte delle pagine di origine del modello come nell'esempio seguente?

Codice di esclusione di responsabilità Magento qui nei tag php. POSIZIONA QUI IL RECAPTCHA QUI lo script snippit qui?

Inoltre, ciò che rende questo codice di verifica della risposta reCaptcha in questo video di seguito è più adatto alla struttura dei metodi di Magento: questo tutorial utilizza sulla prima riga la riga $ reCaptcha = $ _POST ?

Alternativa all'ultima domanda: cosa succede se uso la versione php per fare questa verifica della risposta di reCaptcha lo snippit di codice php verrebbe inserito dopo la sezione dei commenti verdi del modello predefinito magento in alto di php come questa

Alcuni codici non voglio che vengano visualizzati messaggi sul front-end perché contactForm predefinito dà già i suoi avvisi rossi se l'utente non inserisce tutte le informazioni che dirà sotto ciascun campo, voglio solo far funzionare reCaptcha per questo contactForm. Ma in un modo che capirò anche per un uso futuro. Il tuo modo è creato da te come sviluppatore o programmatore?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.