Theo tôi, giải pháp JavaScript được chấp nhận ở trên chắc chắn KHÔNG phải là cách để đi. Bất kỳ bot nào không sử dụng JS (phần lớn trong số chúng) sẽ chỉ bỏ qua xác thực của bạn và bạn sẽ nhận được tất cả thư rác mà bạn đang cố gắng chặn. Luôn luôn luôn xác nhận trên máy chủ. Xác thực JS chỉ là bước đầu tiên của UX.
Dù sao, có nhiều giải pháp, nhưng đây là những gì hiệu quả với tôi trong Magento 1.9 sau nhiều giờ nghiên cứu. Điều này ban đầu được xây dựng dựa trên câu trả lời của Mike ở trên, nhưng hoán đổi file_get_contents cho cURL vì chức năng trước đó thường sẽ cung cấp cho bạn các lỗi trình bao http tùy thuộc vào cấu hình máy chủ của bạn.
Tạo mô-đun của riêng bạn bằng cách Tạo thư mục / ứng dụng / mã / cục bộ / YourVendorName / ValidateCaptcha /
Trong thư mục ValidateCaptcha mới của bạn, hãy thêm thư mục Model với tệp Customer.php. Điều này sẽ được sử dụng để ghi đè lên tệp Customer.php cốt lõi do Magento cung cấp.
Sao chép và dán mã này:
<?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;
}
}
Bây giờ hãy thêm một thư mục vv vào mô-đun của bạn và tạo một tệp config.xml bằng cách sau:
<?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>
Tiếp theo, bạn sẽ cần thêm JS vào đầu chủ đề của mình. Trong ứng dụng / thiết kế / frontend / default / YOUTHEME / template / page / html / head.phtml hãy thêm quyền này vào cuối. Nếu bạn không có tệp này, hãy sao chép nó từ các tệp cơ sở. Đừng ghi đè lên các tập tin cơ sở, mặc dù. Luôn luôn làm cho riêng bạn!
<?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 } ?>
Bây giờ trong ứng dụng / thiết kế / frontend / default / YOUTHEME / template / continent / customer / form / register.phtml hãy thêm cái này ngay trước nút div đặt gần phía dưới:
<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>
Sắp xong! Bây giờ chỉ cần đăng ký mô-đun mới của bạn bằng cách tạo một ứng dụng / etc / mô-đun / YourVendorName / ValidateCaptcha.xml bằng cách sau:
<?xml version="1.0"?>
<config>
<modules>
<YourVendorName_ValidateCaptcha>
<active>true</active>
<codePool>local</codePool>
</YourVendorName_ValidateCaptcha>
</modules>
</config>
Thay thế YourVendorName trong suốt bằng bất cứ điều gì bạn muốn. Cấu trúc cuối cùng của bạn phải giống như:
- 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