Cách xác thực Google reCaptcha


9

Tôi đã thêm google recaptcha trong mẫu liên hệ với chúng tôi nhưng giá trị cũng được gửi mà không có captcha. Tôi đã sử dụng trong trang liên hệ của mình các mã sau cho captcha:

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

Hai mã tôi đã sử dụng. xin vui lòng cho tôi biết làm thế nào tôi có thể xác nhận captcha.


1
cài đặt tiện ích mở rộng này magentoc Commerce.com/magento-connect/recaptcha-1.html
Raghu

điều này sẽ xác thực captcha của bạn
Raghu

Câu trả lời:


9

Bạn nên thử mã này: Tôi đã sử dụng mã này trên trang web của tôi.

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

nó sẽ hoạt động trên trang liên hệ được xây dựng trong chủ đề ... ??
Bò tót Manish

vâng .. nó sẽ..cho tôi biết nếu nó hoạt động
NID

2
sau đó thay thế xác thực mẫu bằng contactForm
NID

1
bạn chỉ có thể cài đặt tiện ích mở rộng cho Google Analytics. magentoc Commerce.com/magento-connect/ trên . Google thực hiện một công việc tuyệt vời theo dõi tất cả những thứ này rồi. Nếu bạn muốn một cái gì đó mạnh mẽ hơn sau này, có những tiện ích mở rộng phải trả tiền làm được nhiều hơn thế.
NID

1
có thể điều này sẽ giúp u .. magento.stackexchange.com/questions/37363/...
NID

7

Tập lệnh này sử dụng để xác thực google reCaptcha giống như xác thực mặc định của magento. hãy sử dụng nó

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

Cảm ơn bạn rất nhiều, đây là câu trả lời đúng cho việc xác thực reCaptcha trên magento bằng nguyên mẫu / validate.js. Làm việc như một cơ duyên!
Asender Asender

Đây phải là câu trả lời được chấp nhận, được điều chỉnh thành công cho mục đích của tôi
ajmedway

tương tự ở đây Cảm ơn
biplab thường

Tôi muốn sử dụng điều này trong tập tin billing.phtml của mình, bạn có thể vui lòng gợi ý cho tôi tôi đang sử dụng mã này nhưng không xác thực recaptcha. `<script> window.onload = function () {// var recaptcha = document.forms [" co-billing-form "] [" g-recaptcha-reply "]; var recaptcha = jQuery ('. g-recaptcha-reply'). val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert ("Vui lòng hoàn thành captcha"); trả lại sai; }} </ script> `
Abi Sharma

6

Tôi đã sử dụng recaptcha ở dạng liên lạc ..

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

tôi đã triển khai mã captcha ở dạng liên hệ được xây dựng của chủ đề .... bạn sẽ vui lòng cho tôi biết chủ đề của tôi. Tôi là người mới bắt đầu chơi magento vì vậy hãy giúp tôi
Manish Gaur

tôi triển khai mã này dưới dạng liên hệ được xây dựng
Jigs Parmar

bạn chỉ cần thực hiện mã này trong biểu mẫu của mình và chỉ thay đổi dữ liệu trang web
Jigs Parmar

Hãy chấp nhận câu trả lời của tôi nếu bạn nhận được câu trả lời của mình
Jigs Parmar

yeah ......... bạn sẽ vui lòng tìm câu trả lời cho câu hỏi này magento.stackexchange.com/questions/183456/NH
Bò tót Manish

5

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

3

Để xác thực captcha, hãy tạo một bộ điều khiển lưu để lưu các giá trị biểu mẫu của bạn và cả xác thực.

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

Hãy chắc chắn rằng bạn đã thay thế khóa trang web và khóa bí mật trong các mã mẫu ở trên.


Làm cách nào để liên kết biểu mẫu của tôi với tệp này? Biểu mẫu chuyển sang action = "<? Php echo $ this-> getPostActionUrl ()?>" Với phương thức POST.
Đậu phộng

1

NID,

Đoạn mã reCaptcha của bạn có vẻ như nó sẽ hoạt động nhưng làm rõ là nó đã được nhập vào head.phtml nguồn của Magento chưa? (hoặc form.phtml?) được đặt Ngay bên dưới bên ngoài Magento mặc định trước PHP ở loại màu xanh lá cây vì nó là a.

Câu hỏi khi nhập đặc biệt là php có phải là thông lệ để nhập nó sau phần bình luận php ngay lập tức mà Magento đặt ở đầu cho hầu hết các trang nguồn mẫu của họ như ví dụ dưới đây không?

Mã từ chối Magento ở đây trong các thẻ php. NƠI RECAPTCHA TẠI ĐÂY đoạn trích đoạn nào ở đây?

Ngoài ra, điều gì làm cho mã xác minh phản hồi reCaptcha trong video này bên dưới được phục vụ nhiều hơn cho cấu trúc phương thức của Magento: Hướng dẫn này sử dụng trên dòng đầu tiên dòng $ reCaptcha = $ _POST ?

Câu hỏi thay thế cuối cùng: Điều gì sẽ xảy ra nếu tôi sử dụng phiên bản php để thực hiện xác minh phản hồi reCaptcha này, đoạn mã php sẽ được nhập sau phần bình luận mẫu mặc định magento hàng đầu của php như thế này

Một số mã tôi không muốn thông báo xuất hiện ở giao diện người dùng vì contactForm mặc định đã đưa ra cảnh báo màu đỏ nếu người dùng không nhập tất cả thông tin mà nó sẽ nói bên dưới mỗi trường, tôi chỉ muốn reCaptcha hoạt động cho contactForm này. Nhưng theo cách mà tôi sẽ hiểu để sử dụng trong tương lai. Cách của bạn được tạo ra bởi chính bạn như một nhà phát triển hoặc lập trình viên?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.