Добавляем reCAPTCHA API key

Для начала необходимо добавить reCAPTCHA API key, как это сделать, подробно описано здесь: Добавляем reCAPTCHA от Google на сайт. Опишу процесс вкратце. Открываем менеджер reCAPTCHA API по ссылке: https://www.google.com/recaptcha/admin, заполняем поля label и domains, после заполнения получим site key и secret key, которые нам понадобятся далее.

Yii framework, добавляем Google reCAPTCHA 2

Для добавления Google reCAPTCHA в Yii 1 воспользуемся расширением, скачать его можно с сайта кодер.укр или с github: github.com/dakiquang/yiiReCaptcha.

Распаковываем архив в папку /protected/extensions/yiiReCaptcha.

Подключаем расширение в основном файле настроек /protected/config/main.php в components:

<?php

return array(
    //...

    'components'=>array(
        //...

        'reCaptcha' => array(
            'name' => 'reCaptcha',
            'class' => 'ext.yiiReCaptcha.ReCaptcha',
            'key' => '<Site key>',
            'secret' => '<Secret key>',
        ),

    ),
);

Далее в моделе для которой необходимо использовать Google reCAPTCHA 2 добавляем публичную переменную $verifyCode и в метод rules добавляем правило обработки reCAPTCHA 2:

class ModelForm extends CFormModel {

    //...
    public $verifyCode;

    public function rules() {
    //...
        return array(
            array('verifyCode', 'required'),
            array('verifyCode', 'ext.yiiReCaptcha.ReCaptchaValidator'),
        );
    }

}

В представлении с формой добавляем блок с reCAPTCHA 2 в нужное место:

<?php
$this->widget('ext.yiiReCaptcha.ReCaptcha', array(
    'model'     => $model,
    'attribute' => 'verifyCode',
    //'isSecureToken' => true, //для нескольких доменов
));

Пример интеграции reCAPTCHA 2 в форму

Разберем внедрение reCAPTCHA 2 в стандартную форму обратной связи. Качаем и распаковываем архив с расширением, добавляем расширение в файл настроек /protected/config/main.php, в итоге файл примет вид (основные изменения в строке 39-44):

<?php

return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'My Web Application',

    'preload'=>array('log'),

    'import'=>array(
        'application.models.*',
        'application.components.*',
    ),

    'modules'=>array(
    ),

    'components'=>array(

        'user'=>array(
            'allowAutoLogin'=>true,
        ),

        'db'=>require(dirname(__FILE__).'/database.php'),

        'errorHandler'=>array(
            'errorAction'=>YII_DEBUG ? null : 'site/error',
        ),

        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning',
                ),                
            ),
        ),

        'reCaptcha' => array(
            'name' => 'reCaptcha',
            'class' => 'ext.yiiReCaptcha.ReCaptcha',
            'key' => '6LcIzBQUAAAAAH4D5uZJp1K7LM1Pngivb3uwjGZE',
            'secret' => '6LcIzBQUAAAAAOf-zvcg9pkclzSjNyym5tvL1lWA',
        ),

    ),

    'params'=>array(
        'adminEmail'=>'webmaster@example.com',
    ),
);

Редактируем модель формы обратной связи, в стандартной форме уже есть переменная для капчи, остается удалить или закомментировать старое правило валидации капчи и добавить новое. Файл /protected/models/ContactForm.php примет вид (строка 18-19):

<?php

class ContactForm extends CFormModel
{

    public $name;
    public $email;
    public $subject;
    public $body;
    public $verifyCode;

    public function rules()
    {
        return array(
            array('name, email, subject, body', 'required'),
            array('email', 'email'),
            //array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),
            array('verifyCode', 'required'),
            array('verifyCode', 'ext.yiiReCaptcha.ReCaptchaValidator'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'verifyCode'=>'Verification Code',
        );
    }

}

Добавляем в представление блок с reCAPTCHA 2 и удаляем блок со старой капчей. Файл /protected/views/site/contact.php (строка 58-63):

<?php

$this->pageTitle=Yii::app()->name . ' - Contact Us';
$this->breadcrumbs=array(
    'Contact',
);
?>

<h1>Contact Us</h1>

<?php if(Yii::app()->user->hasFlash('contact')): ?>
<div class="flash-success">
    <?php echo Yii::app()->user->getFlash('contact'); ?>
</div>

<?php else: ?>

<p>
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
</p>
<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'contact-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <p class="note">Fields with <span class="required">*</span> are required.</p>
    <?php echo $form->errorSummary($model); ?>

    <div class="row">
        <?php echo $form->labelEx($model,'name'); ?>
        <?php echo $form->textField($model,'name'); ?>
        <?php echo $form->error($model,'name'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'email'); ?>
        <?php echo $form->textField($model,'email'); ?>
        <?php echo $form->error($model,'email'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'subject'); ?>
        <?php echo $form->textField($model,'subject',array('size'=>60,'maxlength'=>128)); ?>
        <?php echo $form->error($model,'subject'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'body'); ?>
        <?php echo $form->textArea($model,'body',array('rows'=>6, 'cols'=>50)); ?>
        <?php echo $form->error($model,'body'); ?>
    </div>

    <?php
    $this->widget('ext.yiiReCaptcha.ReCaptcha', array(
        'model'     => $model,
        'attribute' => 'verifyCode',
    ));
    ?>

    <div class="row buttons">
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>

<?php $this->endWidget(); ?>
</div><!-- form -->
<?php endif; ?>

Результат: