Cómo validar Google reCaptcha

9

He agregado el resumen de google en el formulario de contacto, pero el valor también se envía sin captcha. He utilizado en mi página de contacto los siguientes códigos para captcha:

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

Estos dos códigos los he usado. por favor dime cómo puedo validar captcha.

Manish Gaur
fuente
esto validará tu captcha
Raghu

Respuestas:

9

Deberías probar este código: he estado usando esto en mi sitio.

<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
fuente
¿Funcionará en la página integrada en contacto con nosotros en el tema ... ??
Manish Gaur
sí ... lo hará ... avíseme si funcionó
NID
2
luego reemplace form-validate con contactForm
NID
1
simplemente podría instalar una extensión para Google Analytics. magentocommerce.com/magento-connect/… . Google ya hace un gran trabajo rastreando todo esto. Si desea algo más robusto más adelante, hay extensiones pagas que hacen más.
NID
1
puede ser esto te ayudará ... magento.stackexchange.com/questions/37363/…
NID
7

Este script se utiliza para la validación de Google reCaptcha como una validación predeterminada de magento. por favor úsalo

<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
fuente
Muchas gracias, esta es la respuesta correcta para validar reCaptcha en magento usando prototype / validate.js. Trabajando como un encanto!
Waleed Asender
Esta debería ser la respuesta aceptada, adaptada con éxito para mis propósitos
Ajmedway
igual que aquí. Gracias
biplab router
Quiero usar esto en mi archivo billing.phtml, ¿podría sugerirme que estoy usando este código pero no estoy validando 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 ("Complete el captcha"); falso retorno; }} </script> `
Abi Sharma
6

Usé recaptcha en el formulario de contacto.

<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
fuente
He implementado el código captcha en el formulario de contacto integrado del tema ... ¿podría decirme en consecuencia mi tema? soy principiante en magento, así que por favor
ayúdenme
implemento este código en un formulario de contacto integrado
Jigs Parmar
solo tiene que implementar este código en su formulario y cambiar solo la clave del sitio de datos
Jigs Parmar
Acepte mi respuesta si obtiene su respuesta
Jigs Parmar
sí ......... ¿podrías buscar la respuesta a esta pregunta? magento.stackexchange.com/questions/183456/…
Manish Gaur
5

La solución de JavaScript aceptada arriba definitivamente NO es el camino a seguir en mi opinión. Cualquier bot que no esté usando JS (que es la mayoría de ellos) simplemente pasará por alto su validación y obtendrá todo el spam que está tratando de bloquear. Siempre siempre siempre validar en el servidor. La validación de JS es solo un primer paso de UX.

De todos modos, hay múltiples soluciones, pero esto es lo que funcionó para mí en Magento 1.9 después de muchas horas de investigación. Originalmente, esto se basó en la respuesta de Mike anterior, pero intercambia file_get_contents por cURL ya que la función anterior generalmente le dará errores de envoltura http dependiendo de la configuración de su servidor.

Cree su propio módulo creando una carpeta / aplicación / código / local / YourVendorName / ValidateCaptcha /

En su nueva carpeta ValidateCaptcha, agregue una carpeta Modelo con un archivo Customer.php. Esto se utilizará para anular el archivo principal Customer.php proporcionado por Magento.

Copie y pegue 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;
    }


}

Ahora agregue una carpeta etc. a su módulo y cree un config.xml con lo siguiente:

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

A continuación, deberá agregar el JS al encabezado de su tema. En app / design / frontend / default / YOURTHEME / template / page / html / head.phtml agregue esto al final. Si no tiene este archivo, cópielo de los archivos base. Sin embargo, no sobrescriba los archivos base. ¡Siempre haz el tuyo!

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

Ahora en app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml, agregue esto justo antes del div de conjunto de botones cerca de la 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>

¡Casi termino! Ahora solo registre su nuevo módulo creando una aplicación / etc / modules / YourVendorName / ValidateCaptcha.xml con lo siguiente:

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

Reemplace YourVendorName con lo que desee. Su estructura final debería 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
fuente
3

Para validar captcha, cree un controlador de guardado para guardar sus valores de formulario y también la validación.

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

Asegúrese de haber reemplazado la clave del sitio y la clave secreta en los códigos de muestra anteriores.

Miguel
fuente
¿Cómo vinculo mi formulario a este archivo? El formulario va a action = "<? Php echo $ this-> getPostActionUrl ()?>" Con un método POST.
Maní
1

NID

Parece que su fragmento de script reCaptcha funcionará, pero aclare si se ingresó en la fuente head.phtml de Magento. (¿o el form.phtml?) que se colocará justo debajo de Magento predeterminado pre PHP en tipo verde porque es a.

Pregunta al ingresar especialmente php ¿es una práctica habitual ingresarlo después de esa sección inmediata de comentarios php que Magento coloca en la parte superior de la mayoría de sus páginas fuente de plantillas como este ejemplo a continuación?

Código de descargo de responsabilidad de Magento aquí en las etiquetas php. ¿COLOCA EL RECAPTCHA AQUÍ script de fragmento aquí?

Además, ¿qué hace que este código de verificación de respuesta de reCaptcha en este video a continuación sea más adecuado para la estructura de métodos de Magento: este tutorial utiliza en la primera línea la línea $ reCaptcha = $ _POST ?

Alternativa de la última pregunta: ¿Qué sucede si uso la versión de php para hacer esto? La verificación de respuesta de reCaptcha se introduciría en el fragmento de código de php después de la sección de comentarios verdes de la plantilla predeterminada de magento superior de php como esta

Algún código no quiero que aparezcan mensajes en la parte frontal porque contactForm predeterminado ya da sus alertas rojas si el usuario no ingresa toda la información que dirá debajo de cada campo, solo quiero que reCaptcha funcione para este contactForm. Pero de una manera que lo entenderé para uso futuro también. ¿Tu camino es creado por ti mismo como desarrollador o programador?

Paul N
fuente