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