โซลูชัน JavaScript ที่ได้รับการยอมรับด้านบนไม่ใช่วิธีการในความคิดของฉัน บอทใด ๆ ที่ไม่ได้ใช้ JS (ซึ่งส่วนใหญ่เป็นพวกมัน) จะผ่านการตรวจสอบความถูกต้องของคุณและคุณจะได้รับสแปมทั้งหมดที่คุณพยายามบล็อก ตรวจสอบเสมอบนเซิร์ฟเวอร์เสมอ การตรวจสอบ JS เป็นเพียงขั้นตอนแรก UX
อย่างไรก็ตามมีวิธีแก้ปัญหาหลายอย่าง แต่นี่คือสิ่งที่ฉันใช้ใน Magento 1.9 หลังจากการวิจัยหลายชั่วโมง สิ่งนี้สร้างขึ้นตามคำตอบของไมค์ด้านบน แต่เปลี่ยน file_get_contents สำหรับ cURL เนื่องจากฟังก์ชั่นก่อนหน้านี้มักจะให้ข้อผิดพลาด http wrapper ของคุณขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์ของคุณ
สร้างโมดูลของคุณเองโดยสร้างโฟลเดอร์ / แอพ / รหัส / local / YourVendorName / ValidateCaptcha /
ในโฟลเดอร์ ValidateCaptcha ใหม่ของคุณเพิ่มโฟลเดอร์รุ่นด้วยไฟล์ Customer.php สิ่งนี้จะถูกใช้เพื่อแทนที่ไฟล์ core Customer.php ที่จัดทำโดย Magento
คัดลอกและวางรหัสนี้:
<?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;
}
}
ตอนนี้เพิ่มโฟลเดอร์ etc เข้ากับโมดูลของคุณและสร้าง config.xml ด้วยรายการต่อไปนี้:
<?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>
ต่อไปคุณจะต้องเพิ่ม JS ลงในส่วนหัวของธีมของคุณ ภายใต้แอป / ออกแบบ / ส่วนหน้า / ค่าเริ่มต้น / YOURTHEME / แม่แบบ / หน้า / html / head.phtml เพิ่มสิทธิ์นี้ในตอนท้าย หากคุณไม่มีไฟล์นี้ให้คัดลอกไฟล์จากไฟล์ฐาน อย่าเขียนทับไฟล์ฐานแม้ว่า ทำด้วยตัวเองเสมอ!
<?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 } ?>
ตอนนี้อยู่ในแอพ / ออกแบบ / ส่วนหน้า / ค่าเริ่มต้น / YOURTHEME / แม่แบบ / แบบถาวร / ลูกค้า / แบบฟอร์ม / register.phtml เพิ่มสิทธิ์นี้ก่อน div div ชุดปุ่มใกล้ด้านล่าง:
<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>
เกือบเสร็จแล้ว! ตอนนี้เพียงลงทะเบียนโมดูลใหม่ของคุณโดยการสร้างแอพ / etc / modules / YourVendorName / ValidateCaptcha.xml ด้วยสิ่งต่อไปนี้:
<?xml version="1.0"?>
<config>
<modules>
<YourVendorName_ValidateCaptcha>
<active>true</active>
<codePool>local</codePool>
</YourVendorName_ValidateCaptcha>
</modules>
</config>
แทนที่ YourVendorName ด้วยสิ่งที่คุณต้องการ โครงสร้างสุดท้ายของคุณควรมีลักษณะดังนี้:
- 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