Как проверить Google reCaptcha


9

Я добавил Google recaptcha в форму обратной связи, но значение также отправляется без кода. Я использовал на своей странице контактов следующие коды для капчи:

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

Эти два кода я использовал. пожалуйста, скажите мне, как я могу проверить капчу.


1
установить это расширение magentocommerce.com/magento-connect/recaptcha-1.html
Рагу

это подтвердит вашу
Рагху

Ответы:


9

Вы должны попробовать этот код: я использовал это на моем сайте.

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

это будет работать на встроенной странице контактов в теме ... ??
Маниш Гаур

да .. это будет .. дайте мне знать, если это сработало
NID

2
затем замените форму проверки на contactForm
NID

1
Вы можете просто установить расширение для Google Analytics. magentocommerce.com/magento-connect/… . Google отлично справляется с отслеживанием всего этого. Если вы хотите что-то более надежное позже, есть платные расширения, которые делают больше.
У

1
может быть, это поможет вам .. magento.stackexchange.com/questions/37363/…
NID

7

Этот скрипт используется для проверки Google ReCaptcha, как проверка по умолчанию magento. пожалуйста, используйте это.

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

Большое спасибо, это правильный ответ для проверки reCaptcha в magento с использованием prototype / validate.js. Работать как шарм!
Валид Асендер

Это должен быть принятый ответ, успешно адаптированный для моих целей
ajmedway

тоже самое. Спасибо
Biplab Rout

Я хочу использовать это в моем файле billing.phtml. Подскажите, пожалуйста, я использую этот код, но не проверяю recaptcha. `<script> window.onload = function () {// var recaptcha = document.forms [" co-billing-form "] [" g-recaptcha-response "]; var recaptcha = jQuery ('. g-recaptcha-response'). val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert («Пожалуйста, заполните капчу»); вернуть ложь; }} </ script> `
Аби Шарма

6

Я использовал recaptcha в контактной форме ..

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

Я реализовал код с картинки в встроенной форме контакта темы .... пожалуйста, скажите мне, соответственно, мою тему. я новичок в magento, поэтому, пожалуйста, помогите мне
Маниш Гаур

Я реализую этот код во встроенной контактной форме
Джигс Пармар

Вы просто должны реализовать этот код в вашей форме и изменить только данные-sitekey
Балки Пармары

Пожалуйста, примите мой ответ, если Вы
Джигс Пармар

да ......... не могли бы вы найти ответ на этот вопрос magento.stackexchange.com/questions/183456/…
Маниш Гаур

5

Принятое выше решение JavaScript, безусловно, НЕ является способом, по моему мнению. Любой бот, который не использует JS (а это большинство из них), просто обойдет проверку и получит весь спам, который вы пытаетесь заблокировать. Всегда всегда всегда проверять на сервере. Проверка JS - только первый шаг UX.

В любом случае, есть несколько решений, но вот что сработало для меня в Magento 1.9 после многих часов исследований. Первоначально это основывалось на ответе Майка выше, но заменяет file_get_contents для cURL, поскольку предыдущая функция обычно выдаст вам ошибки обертки http в зависимости от конфигурации вашего сервера.

Создайте свой собственный модуль, создав папку / app / code / local / YourVendorName / ValidateCaptcha /

В новой папке ValidateCaptcha добавьте папку Model с файлом Customer.php. Это будет использоваться для переопределения основного файла 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 в заголовок вашей темы. Под app / design / frontend / default / YOURTHEME / template / page / 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 } ?>

Теперь в app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml добавьте это прямо перед набором кнопок 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

3

Чтобы проверить капчу, создайте контроллер сохранения для сохранения значений формы, а также проверки.

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

Убедитесь, что вы заменили ключ сайта и секретный ключ в приведенных выше примерах кодов.


Как мне связать мою форму с этим файлом? Форма переходит в action = "<? Php echo $ this-> getPostActionUrl ()?>" С методом POST.
Арахис

1

У,

Ваш фрагмент сценария reCaptcha выглядит так, как будто он будет работать, но уточнить, введен ли он в исходный файл Magento head.phtml? (или form.phtml?) для размещения справа внизу за пределами Magento по умолчанию перед PHP зеленым шрифтом, потому что это a.

Вопрос при вводе, особенно php, является обычной практикой вводить его после того самого немедленного раздела комментариев php, который Magento помещает в верхнюю часть для большинства своих исходных страниц шаблона, как в этом примере ниже?

Magento Disclaimer код здесь в тегах php. РАЗМЕСТИТЕ РЕКАПТЧУ ЗДЕСЬ Сценарий здесь?

Кроме того, что делает этот код подтверждения ответа reCaptcha в этом видео ниже более удобным для структуры методов Magento: В этом руководстве в первой строке используется строка $ reCaptcha = $ _POST ?

Последний вариант вопроса: что, если я использую версию php, чтобы сделать эту проверку ответа reCaptcha, будет введен фрагмент кода php после верхнего magento шаблона по умолчанию, зеленого комментария php, как этот

Некоторый код, я не хочу, чтобы сообщения появлялись на внешнем интерфейсе, потому что по умолчанию contactForm уже выдает свои красные предупреждения, если пользователь не вводит всю информацию, которую он скажет под каждым полем, я просто хочу, чтобы reCaptcha работал для этой contactForm. Но таким образом, что я пойму, для будущего использования тоже. Ваш путь создан вами как разработчиком или программистом?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.