Como validar o Google reCaptcha

9

Adicionei o google recaptcha no formulário de contato, mas o valor também é enviado sem captcha. Eu usei na minha página de contato os seguintes códigos para captcha:

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

Estes dois código que eu usei. por favor me diga como posso validar o captcha.

Manish Gaur
fonte
isso irá validar a sua captcha
Raghu

Respostas:

9

Você deve tentar este código: Eu tenho usado isso no meu 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
fonte
ele funcionará na página de contato interna no tema ... ??
precisa
sim .. ele me will..let sei se funcionou
NID
2
em seguida, substitua validar formulário por contactForm
NID
11
você pode apenas instalar uma extensão para o Google Analytics. magentocommerce.com/magento-connect/… . O Google já faz um ótimo trabalho rastreando todas essas coisas. Se você quiser algo mais robusto posteriormente, existem extensões pagas que fazem mais.
NID
11
pode ser que isso ajude você .. magento.stackexchange.com/questions/37363/…
NID
7

Este script usa para validação o Google reCaptcha como uma validação padrão do magento. por favor use-o.

<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
fonte
Muito obrigado, esta é a resposta certa para validar o reCaptcha no magento usando prototype / validate.js. Trabalhando como um encanto!
Waleed Asender
Esta deve ser a resposta aceita, adaptado com sucesso para os meus propósitos
ajmedway
o mesmo aqui. Obrigado
biplab rout 16/05/19
Quero usar isso no meu arquivo billing.phtml, você pode me sugerir que estou usando esse código, mas não estou validando o recaptcha. `<script> window.onload = function () {// var recaptcha = document.forms [" co-billing-form "] [" g-recaptcha-response "]; var recaptcha = jQuery ('. g-recaptcha-resposta'). val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert ("Por favor complete o captcha"); retorna falso; }} </script> `
Abi Sharma
6

Usei recaptcha no formulário de contato ..

<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
fonte
Eu implementei o código captcha no formulário de contato construído sobre o tema .... por favor, diga-me adequadamente o meu tema. eu sou novato no Magento ajuda por favor me
Manish Gaur
i implementar esse código em construído em formulário de contato
Jigs Parmar
você só tem que implementar este código em seu formulário e alterar apenas dados SiteKey
Jigs Parmar
Por favor, aceite a minha resposta se está recebendo a sua resposta
Jigs Parmar
sim ......... você vai Por favor veja resposta desta pergunta magento.stackexchange.com/questions/183456/...
Manish Gaur
5

A solução JavaScript aceita acima definitivamente NÃO é o caminho a percorrer na minha opinião. Qualquer bot que não esteja usando JS (que é a maioria deles) simplesmente ignorará sua validação e você receberá todo o spam que está tentando bloquear. Sempre sempre, sempre valide no servidor. A validação de JS é apenas um primeiro passo do UX.

Enfim, existem várias soluções, mas eis o que funcionou para mim no Magento 1.9 após muitas horas de pesquisa. Isso foi criado originalmente com base na resposta de Mike acima, mas troca file_get_contents por cURL, pois a função anterior geralmente gera erros de wrapper http, dependendo da configuração do servidor.

Crie seu próprio módulo Criando uma pasta / app / code / local / YourVendorName / ValidateCaptcha /

Na sua nova pasta ValidateCaptcha, adicione uma pasta Model com um arquivo Customer.php. Isso será usado para substituir o arquivo principal Customer.php fornecido pelo Magento.

Copie e cole este código:

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


}

Agora adicione uma pasta etc ao seu módulo e crie um config.xml com o seguinte:

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

Em seguida, você precisará adicionar o JS ao cabeçalho do tema. Em app / design / frontend / default / YOURTHEME / template / page / html / head.phtml, adicione isso no final. Se você não possui esse arquivo, copie-o dos arquivos base. Não substitua os arquivos base, no entanto. Faça sempre o seu!

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

Agora, em app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml, adicione isso imediatamente antes da div definida pelo botão na parte inferior:

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

Quase pronto! Agora, basta registrar seu novo módulo criando um aplicativo / etc / modules / YourVendorName / ValidateCaptcha.xml com o seguinte:

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

Substitua YourVendorName todo com o que você quiser. Sua estrutura final deve ser algo como:

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

Para validar o captcha, crie um controlador de salvamento para salvar seus valores de formulário e também a validação.

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

Verifique se você substituiu a chave do site e a chave secreta nos códigos de amostra acima.

Mike
fonte
Como vinculo meu formulário a esse arquivo? O formulário vai para action = "<? Php echo $ this-> getPostActionUrl ()?>" Com um método POST.
Amendoins
1

NID,

Seu snippit de script reCaptcha parece que vai funcionar, mas esclarecemos que ele foi inserido na fonte head.phtml do Magento? (ou o form.phtml?) deve ser colocado logo abaixo, fora do PHP padrão do Magento, no tipo verde, porque é a.

Pergunta ao entrar especialmente no php: é prática comum inseri-lo após a seção de comentários php imediatos que o Magento coloca no topo da maioria das páginas de origem dos modelos, como neste exemplo abaixo?

Código de isenção de responsabilidade do Magento aqui em tags php. COLOCAR O script de snippit AQUI aqui?

Além disso, o que torna esse código de verificação de resposta reCaptcha neste vídeo mais adequado para a estrutura de métodos do Magento: Este tutorial usa na primeira linha a linha $ reCaptcha = $ _POST ?

Alternativa à última pergunta: E se eu usar a versão php para fazer isso, a verificação de resposta reCaptcha será inserida no snippit de código php após a seção de comentários em verde do modelo padrão magento superior do php como esta

Algum código que eu não quero que apareçam mensagens no front-end porque o contactForm padrão já dá seus alertas em vermelho se o usuário não inserir todas as informações que ele irá dizer abaixo de cada campo, só quero que o reCaptcha funcione para esse contactForm. Mas de uma maneira que eu vou entender para uso futuro também. Seu caminho é criado por você como desenvolvedor ou programador?

Paul N
fonte