PHPackages                             vvb/yandex-smart-captcha - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. vvb/yandex-smart-captcha

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

vvb/yandex-smart-captcha
========================

Yandex Smart Captcha integration for Laravel 10/11/12/13

v1.0.2(1w ago)22201MITPHPPHP ^8.1

Since Jan 30Pushed 3w ago1 watchersCompare

[ Source](https://github.com/VVBphp/yandex-captcha-laravel)[ Packagist](https://packagist.org/packages/vvb/yandex-smart-captcha)[ Docs](https://github.com/vvb/yandex-smart-captcha)[ RSS](/packages/vvb-yandex-smart-captcha/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (6)Dependencies (5)Versions (13)Used By (0)

Yandex Smart Captcha для Laravel 10/11/12/13
============================================

[](#yandex-smart-captcha-для-laravel-10111213)

[![Latest Version](https://camo.githubusercontent.com/7544f21d04ccd3e6173c35e5204e2432fe591c1f3f6da52953837b2983a91432/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7676622f79616e6465782d736d6172742d636170746368612e737667)](https://packagist.org/packages/vvb/yandex-smart-captcha)[![PHP Version](https://camo.githubusercontent.com/6518db1335bf20fdff07253dc6d6d0cec955b5fb6a8ef1382ac6d73687ecc07f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344382e312d626c7565)](https://php.net)[![Laravel Version](https://camo.githubusercontent.com/00c5f016f1be1dcb437799532f73826897c37799fdeffc328694e95d9f9e9fa7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d31302532463131253246313225324631332d726564)](https://laravel.com)

Пакет для интеграции Yandex Cloud Smart Captcha в Laravel приложения. Поддерживает Blade-компоненты, Vue 3 компонент, JS-хелпер для API-only проектов, валидацию через Rule, Facade и переводы.

Установка
---------

[](#установка)

```
composer require vvb/yandex-smart-captcha
```

Миграция с v0.x
---------------

[](#миграция-с-v0x)

### Breaking Changes

[](#breaking-changes)

- Конфиг: добавлены новые ключи (`script_url`, `validate_url`, `language`, `theme`, `test`, `http_timeout`, `enabled`, `validate_host`). После обновления выполните: ```
    php artisan vendor:publish --tag=config --force
    ```
- Имя скрытого поля токена: теперь всегда `smart-token` (ранее было настраиваемое)
- Новые пропсы Blade-компонента: `container`, `formId`, `lang`, `theme`, `test`, `invisible`, `shieldPosition`, `hideShield`, `enabled`
- Конструктор Service: теперь принимает массив конфига вместо двух строк
- Синглтон привязан к строке `'yandex-smart-captcha'` (исправлен баг с Facade/Rule)

### Что продолжает работать без изменений

[](#что-продолжает-работать-без-изменений)

- Facade `YandexSmartCaptcha::verify()`
- Rule `new YandexSmartCaptchaRule()`
- Синглтон `app('yandex-smart-captcha')`

### What's New in v1.0

[](#whats-new-in-v10)

- Invisible-режим (execute/executePromise)
- Vue 3 компонент с v-model и lazy load
- JS-хелпер (ES-модуль) для SPA/API-only
- Опциональная валидация хоста (`validate_host`)
- Переводы сообщений валидации (ru/en)
- Тестовый режим (`test`)

Настройка
---------

[](#настройка)

1. Получите ключи в [Yandex Cloud Console](https://cloud.yandex.ru/services/smartcaptcha)
2. Добавьте в `.env`:

```
YANDEX_SMART_CAPTCHA_CLIENT_KEY=your_client_key
YANDEX_SMART_CAPTCHA_SERVER_KEY=your_server_key
# Опционально:
YANDEX_SMART_CAPTCHA_SCRIPT_URL=https://smartcaptcha.cloud.yandex.ru/captcha.js
YANDEX_SMART_CAPTCHA_VALIDATE_URL=https://smartcaptcha.cloud.yandex.ru/validate
YANDEX_SMART_CAPTCHA_LANGUAGE=ru
YANDEX_SMART_CAPTCHA_THEME=auto
YANDEX_SMART_CAPTCHA_TEST=false
YANDEX_SMART_CAPTCHA_HTTP_TIMEOUT=30
YANDEX_SMART_CAPTCHA_ENABLED=true
YANDEX_SMART_CAPTCHA_VALIDATE_HOST=false
```

3. Опубликуйте конфиг (при обновлении — с флагом `--force`):

```
php artisan vendor:publish --tag=config --provider="vvb\YandexSmartCaptcha\YandexSmartCaptchaServiceProvider"
```

Использование
-------------

[](#использование)

### Blade-компонент

[](#blade-компонент)

```

    @csrf

    {{-- Стандартный вид --}}

    {{-- С кастомным контейнером --}}

    {{-- Invisible режим (требует JS вызов executeWidget) --}}

    {{-- С переопределением языка/темы --}}

    Отправить

```

**Пропсы компонента:**

ПропсТипПо умолчаниюОписание`container`stringnullauto (uniqid)`formId`stringnullnull`lang`string`config('yandex-smart-captcha.language')`Язык виджета (ru, en, uk, tr, lv)`theme`string`config('yandex-smart-captcha.theme')`Тема: `light`, `dark`, `auto``test`bool`config('yandex-smart-captcha.test')`Тестовый режим Яндекса`invisible`bool`false`Невидимый режим (требует ручной вызов executeWidget)`shieldPosition`stringnullnull`hideShield`bool`false`Скрыть уведомление об обработке данных`enabled`bool`config('yandex-smart-captcha.enabled')`Отключает рендер капчи (возвращает пустой div)**Важно:** Виджет создаёт `` внутри контейнера. Используйте имя поля `smart-token` при валидации.

### Валидация (PHP Rule)

[](#валидация-php-rule)

```
use vvb\YandexSmartCaptcha\Rules\YandexSmartCaptchaRule;

public function store(Request $request)
{
    $request->validate([
        'smart-token' => [new YandexSmartCaptchaRule],
    ]);

    // Ваша логика
}
```

**Кастомные сообщения:**

```
new YandexSmartCaptchaRule(
    message: 'Неверная капча!',
    emptyMessage: 'Пожалуйста, пройдите проверку'
)
```

Или через языковые файлы (`resources/lang/{locale}/validation.php`):

```
return [
    'yandex_smart_captcha_rule' => 'Капча не пройдена',
    'yandex_smart_captcha_empty' => 'Требуется подтверждение капчи',
];
```

### PHP API (Facade / Service)

[](#php-api-facade--service)

```
use vvb\YandexSmartCaptcha\Facades\YandexSmartCaptcha;

// Проверка токена
YandexSmartCaptcha::verify($token, $ip = null);

// Получить client_key
YandexSmartCaptcha::getClientKey();

// Получить публичный конфиг (без server_key)
YandexSmartCaptcha::getConfig();
```

Или через сервис:

```
$service = app('yandex-smart-captcha');
$service->verify($token);
$service->getClientKey();
$service->getConfig();
```

### Invisible-режим (Blade + JS)

[](#invisible-режим-blade--js)

```

```

```
// В вашем JS перед отправкой формы
const formId = 'my-form';
const widgetId = window.__smartcaptchaContainers[formId]?.widgetId;

if (widgetId) {
    const token = await window.smartCaptcha.executePromise(widgetId);
    // token содержит одноразовый токен
    // добавьте его в форму и отправьте
}
```

### Vue 3 компонент

[](#vue-3-компонент)

**Установка и регистрация:**

```
// resources/js/app.js
import YandexSmartCaptcha from 'vvb/yandex-smart-captcha/resources/js/vue/YandexSmartCaptcha.vue';

app.component('YandexSmartCaptcha', YandexSmartCaptcha);
```

Или локально в компоненте:

```

import YandexSmartCaptcha from 'vvb/yandex-smart-captcha/resources/js/vue/YandexSmartCaptcha.vue';

```

**Использование:**

```

import { ref } from 'vue';
import YandexSmartCaptcha from 'vvb/yandex-smart-captcha/resources/js/vue/YandexSmartCaptcha.vue';

const captchaToken = ref('');
const captchaRef = ref(null);
const lang = 'ru';
const theme = 'auto';

const onCaptchaSuccess = (token) => {
    console.log('Token received:', token);
};

const onTokenExpired = () => {
    captchaRef.value.resetToken();
};

// При ошибке валидации (422)
const handleFormSubmit = async () => {
    try {
        await submitForm();
    } catch (e) {
        if (e.response?.status === 422) {
            captchaRef.value.resetToken(); // сброс виджета + обнуление v-model
        }
    }
};

```

**Пропсы Vue:**

ПропсТипПо умолчаниюОписание`modelValue` (v-model)string`''`Токен капчи`container`stringautoID контейнера или CSS-селектор`lang`string`VITE_SMARTCAPTCHA_LANG` или `ru`Язык`theme`string`VITE_SMARTCAPTCHA_THEME` или `auto`Тема`test`bool`VITE_SMARTCAPTCHA_TEST`Тестовый режим`invisible`bool`false`Невидимый режим`shieldPosition`stringnullnull`hideShield`bool`false`Скрыть уведомление об обработке данных`enabled`bool`true`Включить/выключить капчу`formId`stringnullnull`scriptUrl`stringnull`VITE_SMARTCAPTCHA_SCRIPT_URL`**Эмиты:**

- `update:modelValue` (token) — новый токен
- `success` (token) — успешное прохождение
- `token-expired` — токен устарел
- `network-error` — ошибка сети
- `javascript-error` (error) — JS ошибка
- `challenge-visible` / `challenge-hidden` — состояние челленджа

**Expose-методы (через `ref`):**

- `getResponse()` — текущий токен
- `reset()` — сброс виджета
- `resetToken()` — сброс виджета + обнуление v-model
- `execute()` — запуск invisible капчи
- `executePromise()` — Promise с токеном (invisible)

**Переменные окружения (Vite):**

```
VITE_SMARTCAPTCHA_KEY=your_client_key
VITE_SMARTCAPTCHA_SCRIPT_URL=https://smartcaptcha.cloud.yandex.ru/captcha.js
VITE_SMARTCAPTCHA_LANG=ru
VITE_SMARTCAPTCHA_THEME=auto
VITE_SMARTCAPTCHA_TEST=false
```

### JS-хелпер (ES-модуль)

[](#js-хелпер-es-модуль)

Для API-only проектов или ручного управления:

```
import {
    loadSmartCaptchaScript,
    destroySmartCaptcha,
    getResponse,
    resetWidget,
    executeWidget,
    executeWidgetPromise
} from 'vvb/yandex-smart-captcha/resources/js/captcha.js';

// Загрузка скрипта (один раз на приложение)
await loadSmartCaptchaScript({
    scriptUrl: 'https://smartcaptcha.cloud.yandex.ru/captcha.js',
});

// Рендер виджета вручную
const widgetId = window.smartCaptcha.render(container, {
    sitekey: 'your_client_key',
    hl: 'ru',
    theme: 'auto',
});

// Invisible
const token = await executeWidgetPromise(widgetId);

// Получение токена
const token = getResponse(widgetId);

// Сброс
resetWidget(widgetId);

// Очистка при unmount
destroySmartCaptcha(widgetId, containerId);
```

Важно — токены
--------------

[](#важно--токены)

- **Токен SmartCaptcha можно использовать только один раз.** После отправки формы токен сгорает.
- При ошибке валидации (422) необходим новый токен:
    - **Vue:** используйте `resetToken()` через `defineExpose`
    - **Blade:** перезагрузка страницы
- **Время жизни токена — 5 минут.** По истечении токен недействителен.

Конфигурация (config/yandex-smart-captcha.php)
----------------------------------------------

[](#конфигурация-configyandex-smart-captchaphp)

```
return [
    'client_key' => env('YANDEX_SMART_CAPTCHA_CLIENT_KEY'),
    'server_key' => env('YANDEX_SMART_CAPTCHA_SERVER_KEY'),
    'script_url' => env('YANDEX_SMART_CAPTCHA_SCRIPT_URL', 'https://smartcaptcha.cloud.yandex.ru/captcha.js'),
    'validate_url' => env('YANDEX_SMART_CAPTCHA_VALIDATE_URL', 'https://smartcaptcha.cloud.yandex.ru/validate'),
    'language' => env('YANDEX_SMART_CAPTCHA_LANGUAGE', 'ru'),
    'theme' => env('YANDEX_SMART_CAPTCHA_THEME', 'auto'),
    'test' => env('YANDEX_SMART_CAPTCHA_TEST', false),
    'http_timeout' => env('YANDEX_SMART_CAPTCHA_HTTP_TIMEOUT', 30),
    'enabled' => env('YANDEX_SMART_CAPTCHA_ENABLED', true),
    'validate_host' => env('YANDEX_SMART_CAPTCHA_VALIDATE_HOST', false),
];
```

Логирование
-----------

[](#логирование)

При ошибках API логируется на уровень `ERROR`:

- HTTP ошибки (не 200)
- Некорректный JSON ответ
- Ошибки соединения (таймаут, DNS, SSL)

При `status: failed` с непустым `message` — `WARNING` (диагностика неверного ключа/токена). При `validate_host=true` и несовпадении хоста — `WARNING`.

При `enabled=false` — никаких HTTP запросов и логирования.

Тестирование
------------

[](#тестирование)

Установлены dev-зависимости: `pestphp/pest`, `orchestra/testbench`.

```
./vendor/bin/pest
```

Лицензия
--------

[](#лицензия)

MIT License.

---

[Документация Yandex SmartCaptcha](https://cloud.yandex.ru/docs/smartcaptcha/)

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance97

Actively maintained with recent releases

Popularity18

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~50 days

Recently: every ~7 days

Total

12

Last Release

10d ago

Major Versions

v0.2.1 → v1.0.02026-07-16

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/19225426?v=4)[VVB](/maintainers/VVBphp)[@VVBphp](https://github.com/VVBphp)

---

Top Contributors

[![VVBphp](https://avatars.githubusercontent.com/u/19225426?v=4)](https://github.com/VVBphp "VVBphp (6 commits)")

---

Tags

laravelspamcaptchayandexprotectionvuesmart captcha

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/vvb-yandex-smart-captcha/health.svg)

```
[![Health](https://phpackages.com/badges/vvb-yandex-smart-captcha/health.svg)](https://phpackages.com/packages/vvb-yandex-smart-captcha)
```

###  Alternatives

[api-platform/laravel

API Platform support for Laravel

58190.1k21](/packages/api-platform-laravel)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21327.3k4](/packages/ecotone-laravel)[aurorawebsoftware/aauth

Laravel Aauth

412.4k1](/packages/aurorawebsoftware-aauth)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
