PHPackages                             jonnott/laravel-recaptcha - 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. [Validation &amp; Sanitization](/categories/validation)
4. /
5. jonnott/laravel-recaptcha

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

jonnott/laravel-recaptcha
=========================

Simple and painless Google reCAPTCHA package for Laravel framework

v6.3.0(1mo ago)01.6k↓50%MITPHPPHP ^7.3|^8.0

Since Apr 18Pushed 1mo agoCompare

[ Source](https://github.com/jonnott/laravel-recaptcha)[ Packagist](https://packagist.org/packages/jonnott/laravel-recaptcha)[ Docs](https://biscolab.com/laravel-recaptcha)[ RSS](/packages/jonnott-laravel-recaptcha/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (2)Dependencies (8)Versions (41)Used By (0)

**Laravel ReCAPTCHA** is a very simply-to-use Laravel 5 package to embed Google reCAPTCHA in your application.

[![Build Status](https://camo.githubusercontent.com/257bd59df6b22fbf118d425d747bd4257831eebf03ab82bfde470c32b440d576/68747470733a2f2f7472617669732d63692e6f72672f626973636f6c61622f6c61726176656c2d7265636170746368612e7376673f6272616e63683d6d617374657223696d672d7468756d626e61696c)](https://travis-ci.org/biscolab/laravel-recaptcha)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/76f6afd4a3e2b01eab3601889e366628403d5a120b956b7787f7c7e95c3bf422/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f626973636f6c61622f6c61726176656c2d7265636170746368612f6261646765732f7175616c6974792d73636f72652e706e673f623d6d617374657223696d672d7468756d626e61696c)](https://scrutinizer-ci.com/g/biscolab/laravel-recaptcha/?branch=master)[![Code Coverage](https://camo.githubusercontent.com/0f7ad04b7399ea574ed09f8ef348f06a083231d69cfaac5c0bde5676cfdaebe2/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f626973636f6c61622f6c61726176656c2d7265636170746368612f6261646765732f636f7665726167652e706e673f623d6d617374657223696d672d7468756d626e61696c)](https://scrutinizer-ci.com/g/biscolab/laravel-recaptcha/?branch=master)[![Packagist version](https://camo.githubusercontent.com/b5459960ec98e4c7da9c10ce7b7f5725708dbaa98334e49029efa49661dcf031/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f626973636f6c61622f6c61726176656c2d7265636170746368612e73766723696d672d7468756d626e61696c)](https://packagist.org/packages/biscolab/laravel-recaptcha)[![Downloads](https://camo.githubusercontent.com/1d5b79169aefa516005d219e991200dc2d91368bece01def521326187a70421d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f626973636f6c61622f6c61726176656c2d7265636170746368612e73766723696d672d7468756d626e61696c)](https://packagist.org/packages/biscolab/laravel-recaptcha/stats)[![MIT License](https://camo.githubusercontent.com/5704c38144d157e4499131b87630f12957e28d5225c682d9635256dcce6d280b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626973636f6c61622f6c61726176656c2d7265636170746368612e73766723696d672d7468756d626e61696c)](https://github.com/biscolab/laravel-recaptcha/blob/master/LICENSE)

What is reCAPTCHA?
------------------

[](#what-is-recaptcha)

Google developers says: "reCAPTCHA protects you against spam and other types of automated abuse. Here, we explain how to add reCAPTCHA to your site or application."

You can find further info at [Google reCAPTCHA Developer's Guide](https://developers.google.com/recaptcha/intro "Google reCAPTCHA Developer's Guide")

reCAPTCHA available versions
----------------------------

[](#recaptcha-available-versions)

At this moment there are 3 versions available (for web applications):

- **v3**, the latest ([reCAPTCHA v3](https://developers.google.com/recaptcha/docs/v3))
- **v2 checkbox** or simply reCAPTCHA v2 ([reCAPTCHA v2](https://developers.google.com/recaptcha/docs/display))
- **v2 invisible** ([Invisible reCAPTCHA](https://developers.google.com/recaptcha/docs/invisible))

Get your key first!
-------------------

[](#get-your-key-first)

First of all you have to create your own API keys [here](https://www.google.com/recaptcha/admin)

Follow the instructions and at the end of the process you will find **Site key** and **Secret key**. Keep them close..you will need soon!

System requirements
-------------------

[](#system-requirements)

Package versionreCaptcha versionPHP versionLaravel version6.3v3, v2 Invisible, v2 Checkbox7.3 or greater7, 8, 9, 10, 11, 12, 136.2v3, v2 Invisible, v2 Checkbox7.3 or greater7, 8, 9, 10, 11, 126.1v3, v2 Invisible, v2 Checkbox7.3 or greater7, 8, 9, 10, 116.0v3, v2 Invisible, v2 Checkbox7.3 or greater7, 8, 9, 105.xv3, v2 Invisible, v2 Checkbox7.3 or greater7, 8, 94.2.x to 4.4.xv3, v2 Invisible, v2 Checkbox7.1 or greater5.5 or greater, 6, 7, 84.1.xv3, v2 Invisible, v2 Checkbox7.1 or greater5.5 or greater, 6, 74.0.xv3, v2 Invisible, v2 Checkbox7.1 or greater5.5 or greater, 63.xv3, v2 Invisible, v2 Checkbox7.1 or greater5.5 or greater, 6 (\*)2.xv2 Invisible, v2 Checkbox5.5.9, 7.0 or greater5.0 or greater> (\*) Version 3.6.1 is Laravel 6 ready

Composer
--------

[](#composer)

You can install the package via composer:

```
$ composer require biscolab/laravel-recaptcha
```

Laravel 5.5 (or greater) uses package auto-discovery, so doesn't require you to manually add the Service Provider, but if you don't use auto-discovery `ReCaptchaServiceProvider` must be registered in `config/app.php`:

```
'providers' => [
    ...
    Biscolab\ReCaptcha\ReCaptchaServiceProvider::class,
];
```

You can use the facade for shorter code. Add `ReCaptcha` to your aliases:

```
'aliases' => [
    ...
    'ReCaptcha' => Biscolab\ReCaptcha\Facades\ReCaptcha::class,
];
```

Publish package
---------------

[](#publish-package)

Create `config/recaptcha.php` configuration file using the following artisan command:

```
$ php artisan vendor:publish --provider="Biscolab\ReCaptcha\ReCaptchaServiceProvider"
```

Set the environment
-------------------

[](#set-the-environment)

### Add your API Keys

[](#add-your-api-keys)

Open `.env` file and set `RECAPTCHA_SITE_KEY` and `RECAPTCHA_SECRET_KEY`:

```
# in your .env file
RECAPTCHA_SITE_KEY=
RECAPTCHA_SECRET_KEY=
RECAPTCHA_SKIP_IP=
```

`RECAPTCHA_SKIP_IP` (since v5.2.0, not required, CSV format ) allows you to add a list of IP/CIDR (netmask included). It will be the value of `skip_ip`

> **The following environment variables have been removed!!!**Now only sensitive informations as API keys are allowed as environment variables, that means you have to set configuration values in `config/recaptcha.php`

- RECAPTCHA\_DEFAULT\_VERSION
- RECAPTCHA\_CURL\_TIMEOUT
- RECAPTCHA\_DEFAULT\_VALIDATION\_ROUTE
- RECAPTCHA\_DEFAULT\_TOKEN\_PARAMETER\_NAME
- RECAPTCHA\_DEFAULT\_LANGUAGE

### Complete configuration

[](#complete-configuration)

Open `config/recaptcha.php` configuration file and set `version`:

```
return [
    'api_site_key'                  => env('RECAPTCHA_SITE_KEY', ''),
    'api_secret_key'                => env('RECAPTCHA_SECRET_KEY', ''),
    // changed in v4.0.0
    'version'                       => 'v2', // supported: "v3"|"v2"|"invisible"
    // @since v3.4.3 changed in v4.0.0
    'curl_timeout'                  => 10,
    'skip_ip'                       => env('RECAPTCHA_SKIP_IP', []), // array of IP addresses - String: dotted quad format e.g.: "127.0.0.1", IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed
    // @since v3.2.0 changed in v4.0.0
    'default_validation_route'      => 'biscolab-recaptcha/validate',
    // @since v3.2.0 changed in v4.0.0
    'default_token_parameter_name' => 'token',
    // @since v3.6.0 changed in v4.0.0
    'default_language'             => null,
    // @since v4.0.0
    'default_form_id'              => 'biscolab-recaptcha-invisible-form', // Only for "invisible" reCAPTCHA
    // @since v4.0.0
    'explicit'                     => false, // true|false
    // @since v4.3.0
    'api_domain'                   => "www.google.com", // default value is "www.google.com"
    // @since v5.1.0
    'empty_message'                => false,
    // @since v5.1.0
    'error_message_key'            => 'validation.recaptcha',
    // @since v4.0.0
    'tag_attributes'               => [
        'theme'                    => 'light', // "light"|"dark"
        'size'                     => 'normal', // "normal"|"compact"
        'tabindex'                 => 0,
        'callback'                 => null, // DO NOT SET "biscolabOnloadCallback"
        'expired-callback'         => null, // DO NOT SET "biscolabOnloadCallback"
        'error-callback'           => null, // DO NOT SET "biscolabOnloadCallback"
    ]
];
```

KeyTypeDescriptionDefault`api_site_key` and `api_secret_key``string`reCAPTCHA keys you have to create in order to perform Google API authentication. For more information about Site Key and Secret Key please visit [Google reCAPTCHA developer documentation](https://developers.google.com/recaptcha/docs/start)`''``version``string`indicates the reCAPTCHA version (supported: v3|v2|invisible). Get more info about reCAPTCHA version at [](https://developers.google.com/recaptcha/docs/versions)`'v2'``curl_timeout``int`the maximum number of seconds to allow cURL functions to execute`10``skip_ip``array` | `string`a whitelist of IP addresses (array or CSV) that, if recognized, disable the reCAPTCHA validation (return always true) and if you embed JS code in blade (view) file **NO validation call will be performed**`[]``default_validation_route``string`the route called via javascript built-in validation script (v3 only)`'biscolab-recaptcha/validate'``default_token_parameter_name``string`the name of "token" GET parameter sent to `default_validation_route` to be validated (v3 only)`'token'``default_language``string`the default language code. It has no effect with v3. See  for further information`null``default_form_id``string`the default form ID. Only for "invisible" reCAPTCHA`'biscolab-recaptcha-invisible-form'``explicit``bool`deferring the render can be achieved by specifying your onload callback function and adding parameters to the JavaScript resource. It has no effect with v3 and invisible (supported values: true|false)`false``api_domain``string`customize API domain. Default value is `'www.google.com'`, but, if not accessible you ca set that value to `'www.recaptcha.net'`. More info about [Can I use reCAPTCHA globally?](https://developers.google.com/recaptcha/docs/faq#can-i-use-recaptcha-globally)`'www.google.com'``empty_message``bool`set default error message to `null``false``error_message_key``string`set default error message translation key`'validation.recaptcha'`#### (array) tag\_attributes

[](#array-tag_attributes)

KeyTypeDescriptionDefault`tag_attributes.theme``string`the color theme of the widget. (supported values: "light"|"dark")`'light'``tag_attributes.size``string`the size of the widget. (supported values: "normal"|"compact")`'normal'``tag_attributes.tabindex``int`the tabindex of the widget and challenge`0``tag_attributes.callback``string`the name of your callback function, executed when the user submits a successful response. The g-recaptcha-response token is passed to your callback`null``tag_attributes.expired-callback``string`the name of your callback function, executed when the reCAPTCHA response expires and the user needs to re-verify`null``tag_attributes.error-callback``string`the name of your callback function, executed when reCAPTCHA encounters an error (usually network connectivity) and cannot continue until connectivity is restored. If you specify a function here, you are responsible for informing the user that they should retry`null`> DO NOT SET `tag_attributes.callback`, `tag_attributes.expired-callback`, `tag_attributes.error-callback` to `biscolabOnloadCallback`. `biscolabOnloadCallback` is the default JavaScript callback function called when **explicit** is set to `true` and widget `onload` event is fired.

Here you can find further details about `tag_attributes.*` [https://developers.google.com/recaptcha/docs/display#render\_param](https://developers.google.com/recaptcha/docs/display#render_param)

### Reload config cache file

[](#reload-config-cache-file)

> **!!! IMPORTANT !!!** Every time you change some configuration run the following shell command:

```
$ php artisan config:cache
```

Have you updated?
-----------------

[](#have-you-updated)

If you are migrating from an older version check your `config/recaptcha.php` configuration file and compare it with [](https://github.com/biscolab/laravel-recaptcha/blob/master/config/recaptcha.php).

> Make sure `config/recaptcha.php` is updated

Customize error message
-----------------------

[](#customize-error-message)

Just for v2 and invisible users.

Before starting please add the validation message to `resources/lang/[LANG]/validation.php` file

```
return [
    ...
    'recaptcha' => 'Hey!!! :attribute is wrong!',
];
```

Embed in Blade
--------------

[](#embed-in-blade)

Insert `htmlScriptTagJsApi()` helper before closing `` tag.

You can also use `ReCaptcha::htmlScriptTagJsApi()`.

```

        ...
        {!! htmlScriptTagJsApi($configuration) !!}

```

#### htmlScriptTagJsApi

[](#htmlscripttagjsapi)

`htmlScriptTagJsApi` function accepts `$configuration` argument. `$configuration` has different keys depending on which ReCAPTCHA you are using:

- [Checkbox](#recaptcha-v2-checkbox)
- [Invisible](#recaptcha-v2-invisible)

### ReCAPTCHA v2 Checkbox

[](#recaptcha-v2-checkbox)

#### htmlScriptTagJsApi($configuration)

[](#htmlscripttagjsapiconfiguration)

`$configuration` argument can have following keys:

- `lang` set reCAPTCHA language. This will override `default_language` in `config/recaptcha.php`. Here you ca find the complete list of availeble languages

#### Form set-up

[](#form-set-up)

After you have to insert `htmlFormSnippet()` helper inside the form where you want to use the field `g-recaptcha-response`.

You can also use `ReCaptcha::htmlFormSnippet()` .

```

    @csrf

    ...
    {!! htmlFormSnippet() !!}

    {!! htmlFormSnippet($attributes) !!}

```

> DO NOT forget `@csrf` blade directive

#### htmlFormSnippet(\[, array $attributes = \[\] \])

[](#htmlformsnippet-array-attributes---)

`htmlFormSnippet()` function does not require attributes but you can override default config `data-` attributes:

```
{!! htmlFormSnippet([
    "theme" => "light",
    "size" => "normal",
    "tabindex" => "3",
    "callback" => "callbackFunction",
    "expired-callback" => "expiredCallbackFunction",
    "error-callback" => "errorCallbackFunction",
]) !!}
```

`htmlFormSnippet` methos allows are only folowing attribute names:

- theme
- size
- tabindex
- callback
- expired-callback
- error-callback

> Any different attribute name will be rejected

#### Customization

[](#customization)

In `config/recaptcha.php` you can customize reCAPTCHA widget setting `tag_attributes` array values. Take a look to `tag_attributes` section in [Complete configuration](configuration.md#complete-configuration)

### ReCAPTCHA v2 Invisible

[](#recaptcha-v2-invisible)

#### htmlScriptTagJsApi($configuration)

[](#htmlscripttagjsapiconfiguration-1)

`$configuration` argument can have following keys:

- `form_id` set reCAPTCHA form ID. This will override `default_form_id` in `config/recaptcha.php`. This value will be returned by `getFormId()` function in order to set the form tag `id` property.

#### Form set-up

[](#form-set-up-1)

After you have to insert `htmlFormButton($button_label, $properties)` helper inside the form where you want to use reCAPTCHA.

This function creates submit button therefore you don't have to insert `` or similar.

You can also use `ReCaptcha::htmlFormButton($button_label, $properties)` .

`$button_label` is what you want to write on the submit button

```

  @csrf ... {!! htmlFormButton($button_label, $properties) !!}

```

> DO NOT forget `@csrf` blade directive

#### getFormId()

[](#getformid)

`getFormId` function returns the default form ID value. This is the value of either `default_form_id` in `config/recaptcha.php` or `$configuration['form_id']` previously set as arguments of `htmlScriptTagJsApi` helper.

> `$configuration['form_id']` overrides default settings.

#### htmlFormButton()

[](#htmlformbutton)

`htmlFormButton` function accepts 2 arguments:

- `$button_label`: (string: optional) the button lable. For example: `Subscribe!`;
- `$properties`: (array: optional) the HTML button properties. For example:

```
// $properties =
[
    'class' => 'btn btn-info',
    'data-foo' => 'bar'
]
```

> If `data-sitekey` and `data-callback` properties are set, they will be overwritten

> If `class` property is set the value `g-recaptcha` will be appended

Verify submitted data
---------------------

[](#verify-submitted-data)

Add `recaptcha` to your rules

```
$validator = Validator::make(request()->all(), [
    ...
    'g-recaptcha-response' => 'recaptcha',
    // OR since v4.0.0
    recaptchaFieldName() => recaptchaRuleName()
]);

// check if validator fails
if($validator->fails()) {
    ...
    $errors = $validator->errors();
}
```

Embed in Blade
--------------

[](#embed-in-blade-1)

Insert `htmlScriptTagJsApi($config)` helper before closing `` tag.

```
>

        ...
        {!! htmlScriptTagJsApi([
            'action' => 'homepage',
            'callback_then' => 'callbackThen',
            'callback_catch' => 'callbackCatch'
        ]) !!}

        {!! htmlScriptTagJsApi([
            'action' => 'homepage',
            'custom_validation' => 'myCustomValidation'
        ]) !!}

```

`$config` is required and is an associative array containing configuration parameters required for the JavaScript validation handling.

The keys are:

KeyRequiredDescriptionDefault value`action`nois the `action` parameter required by reCAPTCHA v3 API ([further info](https://developers.google.com/recaptcha/docs/v3))`homepage``custom_validation`nois the name of your custom callback javascript function who will override the built-in javascript validation system of this packageempty string`callback_then`no(overlooked if `custom_validation`is set) is the name of your custom callback javascript function called by the built-in javascript validation system of this package in case of response successempty string`callback_catch`no(overlooked if `custom_validation`is set) is the name of your custom callback javascript function called by the built-in javascript validation system in this package in case of response faultempty stringBuilt-in javascript validation system
-------------------------------------

[](#built-in-javascript-validation-system)

As callback of `grecaptcha.execute` an ajax call to `config('recaptcha.default_validation_route')` will be performed using `fetch` function. In case of successful response a Promise object will be received and passed as parameter to the `callback_then` function you have set. In not set, no actions will be performed.

Same will happen with `callback_catch`. `callback_catch` will be called in event of response errors and errors will pass as parameter et that function. If not set, no actions will be performed.

Please, go to [Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) for further information on `fetch` javascript function.

> **Warning!!! Check browser compatibility**`fetch` function has compatibility issues with some browser like IE. Please create a custom validation function and set `custom_validation` with its name. That function has to accept as argument the `token`received from Google reCAPTCHA API.
>
> [Fetch browser compatibility](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Browser_compatibility)

### Validation Laravel route

[](#validation-laravel-route)

Default validation route is `config('recaptcha.default_validation_route', 'biscolab-recaptcha/validate')`.
Route and relative Controller are built-in in the package. The route if filtered and protected by Laravel `web` Middleware, that's why is important you embed `csrf-token` HTML meta tag and send `X-Requested-Wit` and `X-CSRF-TOKEN` headers.

You can also change the validation end-point changing `default_validation_route` value in `recaptcha.php` config file.

```

    ...

```

### Validation response object

[](#validation-response-object)

The output will be a JSON containing following data:

- **Default output without errors**

```
{
    "action":"homepage",
    "challenge_ts":"2019-01-29T00:42:08Z",
    "hostname":"www.yourdomain.ext",
    "score":0.9,
    "success":true
}
```

- **Output when calling IP is included in "skip\_ip" config whitelist**

```
{
    "skip_by_ip":true,
    "score":0.9,
    "success":true
}
```

> If you embed code in your blade file using `htmlScriptTagJsApiV3` helper no validation call will be performed!
>
> More info at [Configuration page](#complete-configuration)

- **Output with an empty response from Google reCAPTCHA API**

```
{
    "error":"cURL response empty",
    "score":0.1,
    "success":false
}
```

In the next paragraph you can learn how handle Validation promise object

### "callback\_then" and "callback\_catch"

[](#callback_then-and-callback_catch)

After built-in validation you should do something. How? Using `callback_then` and `callback_catch` functions.

What you have to do is just create functions and set parameters with their names.

- `callback_then` must receive one argument of type `Promise`.
- `callback_catch` must receive one argument of type `string`

The result should be something like that:

```

    ...

    ...

        function callbackThen(response){
        	// read HTTP status
            console.log(response.status);

            // read Promise object
            response.json().then(function(data){
                console.log(data);
            });
        }
        function callbackCatch(error){
            console.error('Error:', error)
        }

    ...
    {!! htmlScriptTagJsApiV3([
        'action' => 'homepage',
        'callback_then' => 'callbackThen',
        'callback_catch' => 'callbackCatch'
    ]) !!}

```

### "custom\_validation" function

[](#custom_validation-function)

As just said you can handle validation with your own function. To do that you have to write your function and set `custom_validation` parameter with its name.

The result should be something like that:

```

    ...

    ...

        function myCustomValidation(token) {
            // do something with token
        }

    ...
    {!! htmlScriptTagJsApiV3([
        'action' => 'homepage',
        'custom_validation' => 'myCustomValidation'
    ]) !!}

```

###  Health Score

54

—

FairBetter than 97% of packages

Maintenance90

Actively maintained with recent releases

Popularity18

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity80

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 94.3% 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 ~90 days

Recently: every ~352 days

Total

37

Last Release

53d ago

Major Versions

v1.0.1 → v2.0.0-beta2017-05-07

v2.x-dev → v3.0.02018-09-12

v3.6.1 → 4.0.02019-09-09

4.4.0 → 5.0.02020-12-05

v5.4.0 → v6.0.02023-02-11

PHP version history (3 changes)v1.0.0PHP &gt;=5.5.9|7.\*

v3.0.0PHP ^7.1

5.0.0PHP ^7.3|^8.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/472468?v=4)[Jonny Nott](/maintainers/jonnott)[@jonnott](https://github.com/jonnott)

---

Top Contributors

[![biscolab](https://avatars.githubusercontent.com/u/9263090?v=4)](https://github.com/biscolab "biscolab (267 commits)")[![jonnott](https://avatars.githubusercontent.com/u/472468?v=4)](https://github.com/jonnott "jonnott (6 commits)")[![laravel-shift](https://avatars.githubusercontent.com/u/15991828?v=4)](https://github.com/laravel-shift "laravel-shift (4 commits)")[![mohamadrezasalehi](https://avatars.githubusercontent.com/u/16059139?v=4)](https://github.com/mohamadrezasalehi "mohamadrezasalehi (1 commits)")[![paulredmond](https://avatars.githubusercontent.com/u/177773?v=4)](https://github.com/paulredmond "paulredmond (1 commits)")[![aaronsaray](https://avatars.githubusercontent.com/u/956888?v=4)](https://github.com/aaronsaray "aaronsaray (1 commits)")[![rafaelyanagui](https://avatars.githubusercontent.com/u/6343584?v=4)](https://github.com/rafaelyanagui "rafaelyanagui (1 commits)")[![dispercity](https://avatars.githubusercontent.com/u/69723412?v=4)](https://github.com/dispercity "dispercity (1 commits)")[![matthiasgrube](https://avatars.githubusercontent.com/u/45481056?v=4)](https://github.com/matthiasgrube "matthiasgrube (1 commits)")

---

Tags

checkboxdata-validationform-validationgoogle-recaptchagoogle-recaptcha-v2google-recaptcha-v3laravellaravel-recaptchalaravel10laravel11laravel12laravel7laravel8laravel9phpphp8recaptcharecaptcha-apirecaptcha-validationlaravelvalidationrecaptchacaptcha

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/jonnott-laravel-recaptcha/health.svg)

```
[![Health](https://phpackages.com/badges/jonnott-laravel-recaptcha/health.svg)](https://phpackages.com/packages/jonnott-laravel-recaptcha)
```

###  Alternatives

[galahad/laravel-addressing

Laravel package providing addressing functionality

70316.6k](/packages/galahad-laravel-addressing)[illuminatech/validation-composite

Allows uniting several validation rules into a single one for easy re-usage

184485.5k](/packages/illuminatech-validation-composite)

PHPackages © 2026

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