Cara Memvalidasi Google reCaptcha


9

Saya telah menambahkan google recaptcha dalam formulir contact us tetapi nilainya juga dikirimkan tanpa captcha. Saya telah menggunakan di halaman kontak saya kode berikut untuk captcha:

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

Kedua kode ini telah saya gunakan. tolong beri tahu saya bagaimana saya bisa memvalidasi captcha.



ini akan memvalidasi captcha Anda
Raghu

Jawaban:


9

Anda harus mencoba kode ini: Saya telah menggunakan ini di situs saya.

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

apakah ini akan berfungsi pada halaman contact in built in di tema ... ??
Manish Gaur

ya .. itu akan .. beri tahu saya kalau itu berhasil
NID

2
kemudian ganti validasi formulir dengan contactForm
NID

1
Anda cukup menginstal ekstensi untuk Google Analytics. magentocommerce.com/magento-connect/… . Google telah melakukan pekerjaan yang bagus untuk melacak semua hal ini. Jika Anda menginginkan sesuatu yang lebih kuat di kemudian hari, ada ekstensi berbayar yang melakukan lebih banyak.
NID

1
mungkin ini akan membantu kamu .. magento.stackexchange.com/questions/37363/…
NID

7

Script ini digunakan untuk validasi google reCaptcha seperti validasi magento default. tolong gunakan itu.

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

Terima kasih banyak, ini adalah jawaban yang tepat untuk memvalidasi reCaptcha di magento menggunakan prototipe / validate.js. Bekerja seperti pesona!
Waleed Asender

Ini harus menjadi jawaban yang diterima, berhasil diadaptasi untuk tujuan saya
ajmedway

sama disini. Terima kasih
biplab rout

Saya ingin menggunakan ini dalam file billing.phtml saya, dapatkah Anda menyarankan saya menggunakan kode ini tetapi tidak memvalidasi 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 ("Silakan lengkapi captcha"); return false; }} </script> `
Abi Sharma

6

Saya menggunakan recaptcha dalam formulir kontak ..

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

saya telah menerapkan kode captcha dalam bentuk kontak yang dibangun dari tema .... tolong beri tahu saya sesuai tema saya. Saya pemula di Magento jadi tolong bantu saya
Manish Gaur

saya menerapkan kode ini dalam formulir kontak built-in
Jigs Parmar

Anda hanya perlu menerapkan kode ini di formulir Anda dan hanya mengubah data-sitekey
Jigs Parmar

Tolong Terima jawaban saya jika Anda Mendapatkan jawaban Anda
Jigs Parmar

ya ......... bisakah Anda mencari jawaban dari pertanyaan ini magento.stackexchange.com/questions/183456/…
Manish Gaur

5

Solusi JavaScript yang diterima di atas jelas BUKAN cara untuk menurut saya. Bot apa pun yang tidak menggunakan JS (yang sebagian besar darinya) hanya akan mem-bypass validasi Anda dan Anda akan mendapatkan semua spam yang Anda coba blokir. Selalu selalu memvalidasi di server. Validasi JS hanyalah langkah pertama UX.

Bagaimanapun, ada beberapa solusi, tapi inilah yang bekerja untuk saya di Magento 1.9 setelah banyak penelitian. Ini awalnya dibangun di atas jawaban Mike di atas, tetapi swap file_get_contents untuk cURL karena fungsi sebelumnya biasanya akan memberi Anda kesalahan http wrapper tergantung pada konfigurasi server Anda.

Buat modul Anda sendiri dengan Membuat folder / aplikasi / kode / lokal / YourVendorName / ValidateCaptcha /

Di folder ValidateCaptcha baru Anda, tambahkan folder Model dengan file Customer.php. Ini akan digunakan untuk mengganti file inti Customer.php yang disediakan oleh Magento.

Salin & Tempel kode ini:

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


}

Sekarang tambahkan folder dll ke modul Anda dan buat config.xml dengan yang berikut ini:

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

Selanjutnya Anda harus menambahkan JS ke kepala tema Anda. Di bawah app / design / frontend / default / YOURTHEME / template / halaman / html / head.phtml tambahkan ini di akhir. Jika Anda tidak memiliki file ini, salin dari file dasar. Jangan menimpa file dasar. Selalu buat sendiri!

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

Sekarang di app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml tambahkan ini tepat sebelum div set-tombol di dekat bagian bawah:

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

Hampir selesai! Sekarang cukup daftarkan modul baru Anda dengan membuat aplikasi / etc / modules / YourVendorName / ValidateCaptcha.xml dengan yang berikut:

<?xml version="1.0"?>
<config>
    <modules>
        <YourVendorName_ValidateCaptcha>
            <active>true</active>
            <codePool>local</codePool>
        </YourVendorName_ValidateCaptcha>
    </modules>
</config>

Ganti YourVendorName dengan yang Anda inginkan. Struktur akhir Anda harus seperti:

- 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

Untuk memvalidasi captcha, buat pengendali penyimpanan untuk menyimpan nilai formulir Anda dan juga validasinya.

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

Pastikan Anda telah mengganti kunci situs dan kunci rahasia dalam kode sampel di atas.


Bagaimana cara menautkan formulir saya ke file ini? Formulir menuju ke action = "<? Php echo $ this-> getPostActionUrl ()?>" Dengan metode POST.
Kacang

1

NID,

Cuplikan skrip reCaptcha Anda sepertinya berfungsi, tetapi jelaskan apakah itu dimasukkan ke head.phtml sumber Magento? (atau form.phtml?) untuk ditempatkan Tepat di bawah di luar Magento sebelum PHP dalam bentuk hijau karena a.

Pertanyaan ketika memasukkan terutama php apakah itu praktik biasa untuk memasukkannya setelah bagian komentar php langsung yang ditempatkan Magento di atas untuk sebagian besar halaman sumber template mereka seperti contoh di bawah ini?

Kode Penafian Magento di sini di tag php. TEMPAT RECAPTCHA DI SINI skrip snippit di sini?

Juga apa yang membuat kode verifikasi respons reCaptcha ini dalam video di bawah ini lebih diperuntukkan bagi struktur metode Magento: Tutorial ini menggunakan baris pertama baris $ reCaptcha = $ _POST ?

Alternatif Pertanyaan Terakhir: Bagaimana jika saya menggunakan versi php untuk melakukan verifikasi respons reCaptcha ini akan memasukkan kode php snippit setelah bagian komentar hijau template default magento atas dari php seperti ini

Beberapa kode saya tidak ingin pesan muncul di ujung depan karena contactForm default sudah memberikan peringatan merah jika pengguna tidak memasukkan semua info yang akan mengatakan di bawah setiap bidang, saya hanya ingin mendapatkan reCaptcha bekerja untuk contactForm ini. Tetapi dengan cara yang saya akan mengerti untuk digunakan di masa depan juga. Cara Anda dibuat oleh Anda sendiri sebagai pengembang atau programmer?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.