Google Recaptcha V3 Example Tutorial in Laravel 8

Hello buddies,

How are you guys? Today I am going to show you how to add google Recaptcha to your laravel web application. Let’s look at an example of integrating Recaptcha in laravel application. This article will go over how to implement google Recaptcha in Laravel 8. I’ll teach you how to use Google’s v3 ReCAPTCHA with Laravel 8 forms in this article. This tutorial will show you how to use Recaptcha in laravel.

Create Laravel project

composer create-project --prefer-dist laravel/laravel blog

Set Database Configuration properties

Go to the .env file and set your Database name, Database username, and password.

 DB_CONNECTION=mysql
 DB_HOST=127.0.0.1
 DB_PORT=3306
 DB_DATABASE=laravelblog
 DB_USERNAME=root
 DB_PASSWORD=

Install Laravel  josiasmontag/laravel-recaptchav3

We need josiasmontag/laravel-recaptchav3 package. you can install the google v3 Recaptcha validation package in laravel 8 google v3 Recaptcha validation app. So let’s open the terminal and run the below command:

composer require josiasmontag/laravel-recaptchav3 
Github-link: josiasmontag/laravel-recaptchav3

After installing the above package, you can add providers and aliases in the config file. So let’s run the below command to publish the config file:

php artisan vendor:publish --provider="Lunaweb\RecaptchaV3\Providers\RecaptchaV3ServiceProvider"

Then add the site key and secret key on the .env file provided by the google Recaptcha website.

NOCAPTCHA_SITEKEY=your_secret_site_key 
NOCAPTCHA_SECRET=your_secret_key 

Create Model and Migration

We are going to create a Google Recaptcha v3 application for the contact-us page in my laravel app. So run the below command:

php artisan make:model ContactUs -m

Add the following code to your database/migrations file

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateContactUsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('contact_us', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email');
            $table->string('subject');
            $table->text('message');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('contact_us');
    }
}

Migrate

php artisan migrate

Now you can add all table columns in fillable So let’s open the model file and put the below code.

app/Models/ContactUs.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ContactUs extends Model
{
    use HasFactory;
    
    protected $table = 'contact_us';
    protected $fillable = ['name', 'email','subject','message'];
}

Create Routes

Read Also: Laravel 8 REST API Authentication with Sanctum

Go to the .env file and create the following routes respectively

routes/web.php

Route::get('contact-us', [GoogleV3CaptchaController::class, 'index']);
Route::post('validate-g-recaptcha', [GoogleV3CaptchaController::class, 'validateGCaptch']);

Create Controller

Now it’s time to create our controller, run the below command:

php artisan make:controller recaptcha\GoogleV3CaptchaController

app/Http/Controllers/recaptcha/GoogleV3CaptchaController.php

<?php

namespace App\Http\Controllers\recaptcha;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\ContactUs;
use Validator;
use Session;


class GoogleV3CaptchaController extends Controller
{
    public function index()
    {
        return view('contact');
    }
 
    public function validateGCaptch(Request $request)
    {
        $input = $request->all();

        $validator = Validator::make($input,[
            'name' => 'required',
            'email' => 'required',
            'subject' => 'required',
            'message' => 'required',
            'g-recaptcha-response' => 'required',
        ]);

        if ($validator->passes()){
            ContactUs::create($input);
            return redirect('contact-us')->with('status', 'Google V3 Recaptcha has been validated form');
        }

        return redirect()->back()->withErrors($validator)->withInput();
    }
}

Create Blade File(contact)

We need to add a blade view so first create a new file contact.blade.php file and put the below code:

resources/views/contact.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>Google Recaptcha Validation In Laravel 8 Form</title>
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-4">
        @if(session('status'))
            <div class="alert alert-success">
                {{ session('status') }}
            </div>
        @endif
        <div class="card">
            <div class="card-header text-center font-weight-bold">
                <h2>Contact Us</h2>
            </div>
            <div class="card-body">
                <form name="g-v3-recaptcha-contact-us" id="g-v3-recaptcha-contact-us" method="post" action="{{url('validate-g-recaptcha')}}">
                    @csrf
                    <div class="form-group">
                        <label for="exampleInputEmail1">Name</label>
                        <input type="text" id="name" name="name" class="@error('name') is-invalid @enderror form-control">
                        @error('name')
                            <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div>
                        @enderror
                    </div>          
                    <div class="form-group">
                        <label for="exampleInputEmail1">Email</label>
                        <input type="email" id="email" name="email" class="@error('email') is-invalid @enderror form-control">
                        @error('email')
                            <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div>
                        @enderror
                    </div>           
                    <div class="form-group">
                        <label for="exampleInputEmail1">Subject</label>
                        <input type="text" id="subject" name="subject" class="@error('subject') is-invalid @enderror form-control">
                        @error('subject')
                            <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div>
                        @enderror
                    </div>      
                    <div class="form-group">
                        <label for="exampleInputEmail1">Message</label>
                        <textarea name="message" class="@error('description') is-invalid @enderror form-control"></textarea>
                        @error('message')
                            <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div>
                        @enderror
                    </div>
                    <div class="form-group">
                        <input type="hidden" name="g-recaptcha-response" id="recaptcha">
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
        </div>
    </div>    
    <script src="https://www.google.com/recaptcha/api.js?render={{ config('services.recaptcha.sitekey') }}"></script>
    <script>
             grecaptcha.ready(function() {
                 grecaptcha.execute('{{ config('services.recaptcha.sitekey') }}', {action: 'contact'}).then(function(token) {
                    if (token) {
                      document.getElementById('recaptcha').value = token;
                    }
                 });
             });
    </script>
    <!-- <script src="https://www.google.com/recaptcha/api.js?render={{ config('services.recaptcha.sitekey') }}"></script> -->
    
</body>
</html>

Now we are ready to run our google Recaptcha v3 example with laravel 8 so run the below command for the quick run:

php artisan serve

Now you can open the below URL on your browser:

http://localhost:8000/contact-us

It will help you…