So validieren Sie Google reCaptcha


9

Ich habe das Google Recaptcha im Kontaktformular hinzugefügt, aber der Wert wird auch ohne Captcha übermittelt. Ich habe auf meiner Kontaktseite folgende Codes für Captcha verwendet:

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

Diese beiden Codes habe ich verwendet. Bitte sagen Sie mir, wie ich Captcha validieren kann.


1
Installieren Sie diese Erweiterung magentocommerce.com/magento-connect/recaptcha-1.html
Raghu

Dies wird Ihre Captcha bestätigen
Raghu

Antworten:


9

Sie sollten diesen Code ausprobieren: Ich habe ihn auf meiner Website verwendet.

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

Wird es auf der eingebauten Kontaktseite im Thema funktionieren ... ??
Manish Gaur

Ja ... es wird ... mich wissen lassen, ob es funktioniert hat
NID

2
Ersetzen Sie dann die Formularvalidierung durch contactForm
NID

1
Sie können einfach eine Erweiterung für Google Analytics installieren. magentocommerce.com/magento-connect/… . Google macht einen großartigen Job, um all diese Dinge bereits zu verfolgen. Wenn Sie später etwas Robusteres wünschen, gibt es kostenpflichtige Erweiterungen, die mehr leisten.
NID

1
Vielleicht hilft Ihnen das
NID

7

Dieses Skript verwendet für die Validierung Google ReCaptcha wie eine Standardvalidierung von Magento. bitte benutze es.

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

Vielen Dank, dies ist die richtige Antwort für die Validierung von reCaptcha auf Magento mithilfe von prototype / validate.js. Arbeiten wie ein Zauber!
Waleed Asender

Dies sollte die akzeptierte Antwort sein, die erfolgreich für meine Zwecke angepasst wurde
ajmedway

hier gilt das gleiche. Danke
Biplab Router

Ich möchte dies in meiner Datei billing.phtml verwenden. Können Sie mir bitte vorschlagen, dass ich diesen Code verwende, aber recaptcha nicht validiere? `<script> window.onload = function () {// var recaptcha = document.forms [" Co-Abrechnungsformular "] [" g-recaptcha-response "]; var recaptcha = jQuery ('. g-recaptcha-response'). val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert ("Bitte vervollständigen Sie das Captcha"); falsch zurückgeben; }} </ script> `
Abi Sharma

6

Ich habe Recaptcha in Kontaktform verwendet.

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

Ich habe den Captcha-Code in der erstellten Kontaktform des Themas implementiert. Bitte teilen Sie mir mein Thema entsprechend mit. Ich bin Anfänger in Magento, also bitte helfen Sie mir
Manish Gaur

Ich implementiere diesen Code in eingebauten Kontaktformular
Jigs Parmar

Sie müssen nur diesen Code in Ihr Formular implementieren und nur den Datenschlüssel ändern
Jigs Parmar

Bitte akzeptieren Sie meine Antwort, wenn Sie Ihre Antwort erhalten
Jigs Parmar

yeah ......... wirst du bitte nach einer Antwort auf diese Frage suchen magento.stackexchange.com/questions/183456/…
Manish Gaur

5

Die oben akzeptierte JavaScript-Lösung ist meiner Meinung nach definitiv NICHT der richtige Weg. Jeder Bot, der kein JS verwendet (was die meisten von ihnen sind), umgeht einfach Ihre Validierung und Sie erhalten all den Spam, den Sie blockieren möchten. Immer immer immer auf dem Server validieren. Die JS-Validierung ist nur ein erster UX-Schritt.

Wie auch immer, es gibt mehrere Lösungen, aber hier ist, was nach vielen Stunden Recherche für mich in Magento 1.9 funktioniert hat. Dies basiert ursprünglich auf Mikes Antwort oben, tauscht jedoch file_get_contents gegen cURL aus, da die vorherige Funktion abhängig von Ihrer Serverkonfiguration normalerweise http-Wrapper-Fehler verursacht.

Erstellen Sie Ihr eigenes Modul, indem Sie einen Ordner / app / code / local / YourVendorName / ValidateCaptcha / erstellen.

Fügen Sie in Ihrem neuen ValidateCaptcha-Ordner einen Modellordner mit einer Customer.php-Datei hinzu. Dies wird verwendet, um die von Magento bereitgestellte Customer.php-Kerndatei zu überschreiben.

Kopieren Sie diesen Code und fügen Sie ihn ein:

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


}

Fügen Sie nun Ihrem Modul einen Ordner etc hinzu und erstellen Sie eine config.xml mit den folgenden Angaben:

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

Als nächstes müssen Sie das JS zu Ihrem Themenkopf hinzufügen. Fügen Sie dies unter app / design / frontend / default / YOURTHEME / template / page / html / head.phtml am Ende hinzu. Wenn Sie diese Datei nicht haben, kopieren Sie sie aus den Basisdateien. Überschreiben Sie jedoch keine Basisdateien. Mach immer deine eigenen!

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

Fügen Sie dies jetzt in app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml direkt vor dem Button-Set div unten hinzu:

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

Fast fertig! Registrieren Sie jetzt einfach Ihr neues Modul, indem Sie eine App / etc / modules / YourVendorName / ValidateCaptcha.xml mit den folgenden Angaben erstellen:

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

Ersetzen Sie YourVendorName durchgehend durch das, was Sie möchten. Ihre endgültige Struktur sollte ungefähr so ​​aussehen:

- 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

Erstellen Sie zum Validieren von Captcha einen Speichercontroller zum Speichern Ihrer Formularwerte und der Validierung.

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

Stellen Sie sicher, dass Sie den Site-Schlüssel und den geheimen Schlüssel in den obigen Beispielcodes ersetzt haben.


Wie verknüpfe ich mein Formular mit dieser Datei? Das Formular geht mit einer POST-Methode zu action = "<? Php echo $ this-> getPostActionUrl ()?>".
Erdnüsse

1

NID,

Ihr reCaptcha-Skript-Snippit sieht aus, als würde es funktionieren, aber stellen Sie klar, ob es in die Quelle head.phtml des Magento eingegeben wurde. (oder die form.phtml?), die direkt unter dem Magento-Standard vor PHP in grüner Schrift platziert werden soll, da es a ist.

Frage bei der Eingabe von besonders PHP: Ist es üblich, nach diesem Abschnitt mit sofortigen PHP-Kommentaren einzugeben, den Magento für die meisten seiner Vorlagenquellenseiten wie in diesem Beispiel unten oben platziert?

Magento Disclaimer Code hier in PHP-Tags. PLACE THE RECAPTCHA HIER Snippit-Skript hier?

Was macht diesen reCaptcha-Antwortüberprüfungscode in diesem Video unten besser für die Methodenstruktur von Magento geeignet: In diesem Tutorial wird in der ersten Zeile die Zeile $ reCaptcha = $ _POST verwendet ?

Letzte Frage Alternative: Was ist, wenn ich die PHP- Version verwende, um diese reCaptcha-Antwortüberprüfung durchzuführen? Würde der PHP-Code-Snippit nach dem grünen Kommentarbereich der obersten Magento-Standardvorlage von PHP wie diesem eingegeben?

Einige Codes, für die keine Nachrichten im Front-End angezeigt werden sollen, da die Standard-ContactForm bereits rote Warnungen ausgibt, wenn der Benutzer nicht alle Informationen eingibt, die unter den einzelnen Feldern angezeigt werden. Ich möchte nur, dass reCaptcha für diese ContactForm funktioniert. Aber auf eine Weise, die ich auch für die zukünftige Verwendung verstehen werde. Ihr Weg wird von Ihnen als Entwickler oder Programmierer erstellt?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.