Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

hoclaravel's avatar

laravel captcha cannot validate

Hi all, I'm install captcha for Laravel 5.2.* using step by step in this guide: https://captcha.com/doc/php/howto/laravel-captcha.html I declare a LoginForm class with rules below:

class LoginFormRequest extends Request {
.....
public function rules()
    {
        return [
          'username' => 'required|max:30',
          'password' => 'required|max:200',
          'CaptchaCode' => 'required|valid_captcha',
        ];
    }
}

Here is my template:

{!! captcha_image_html('LoginCaptcha') !!}
<input type="text" class="form-control" id="CaptchaCode" name="CaptchaCode">

The captcha display very good. But it always display that "CAPTCHA validation failed, please try again." I've already tried to debug in LaravelCaptchaServiceProvider class. In function "registerValidCaptchaValidationRule" i see it still works fine.

Log::info(($captcha->Validate($value))? "captcha true": "captcha false");

Please help me, what is the exact errors here? Thank you!

0 likes
5 replies
hoclaravel's avatar

Only a little different. I create a LoginForm Request instead validate captcha in Controller In my LoginForm class, i use "valid_captcha" rule for "CaptchaCode"

When i debug: Log::info(($captcha->Validate($value))? "captcha true": "captcha false"); I see it return "captcha true". But on website, it still display invalid message: "CAPTCHA validation failed, please try again."

Do you think It may not work with Form validation ? I will try to validate in Controller again

ejdelmonico's avatar

You should get rid of that old bulky package. All you have to do is activate the service with Google and place this in you form:

<div class="g-recaptcha" data-sitekey="{{ env('RECAPTCHA_SITE') }}"></div>

Then in your controller:

<?php

namespace App\Http\Controllers;

use App\Mail\ContactEmail;
use App\Utilities\Curl;
use Mail;
use Illuminate\Http\Request;

class ContactController extends Controller
{
    public function contact() {
        return view('pages.contact');
    }

    /**
     * @param \Illuminate\Http\Request $request
     * @param \App\Utilities\Curl      $curl
     *
     * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function send(Request $request, Curl $curl) {
        // Validate request
        $response = json_decode(
            $curl->post('https://www.google.com/recaptcha/api/siteverify', [
                'secret'   => config('services.recaptcha.secret'),
                'response' => $request->input('g-recaptcha-response'),
                'remoteip' => $request->ip(),
            ])
        );

        $this->validate($request, [
            'my_name' => 'required|min:2',
            'email' => 'required|email',
            'subject' => 'required|max:255',
            'message_text' => 'required|min:5'
        ]);

        if (!$response->success) {
            flash('Try again to prove you are a human!');
            flash_level('warning');
            return redirect('/contact')->withInput();
        }

        $data = $request->all();

        Mail::to('[email protected]')->send(new ContactEmail($data));

        flash('Your email has been sent!');
        flash_level('success');

        return redirect('/contact');
    }
}

That should get you started.

2 likes
slowkow's avatar

Thanks, @ejdelmonico

With Laravel 5.2 and Guzzle, here is what worked for me.

<?php

namespace App\Http\Controllers;

use GuzzleHttp;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class ContactController extends Controller
{
    public function showForm()
    {
        return view('pages.contact');
    }

    public function sendContactInfo(Request $request)
    {
        $client = new \GuzzleHttp\Client();

        $response = $client->request(
            'POST',
            'https://www.google.com/recaptcha/api/siteverify',
            [
                'form_params' => [
                    'secret'   => env('RECAPTCHA_SECRET'),
                    'response' => $request->input('g-recaptcha-response'),
                    'remoteip' => $request->ip(),
                ]
            ]
        );

        $response_json = json_decode($response->getBody());

        if ($response_json->success !== true) {
            $request->session()->flash('warning', 'Try again to prove you are a human!');
            return redirect()
              ->back()
              ->withInput();
        }

        $this->validate($request, [
            'contactName'    => 'required|min:5',
            'contactEmail'   => 'required|email',
            'contactSubject' => 'required|min:4',
            'contactMessage' => 'required|min:10'
        ]);

        $data = $request->only('contactName', 'contactEmail', 'contactSubject', 'contactMessage');

        Mail::send('emails.contact', $data, function ($message) use ($data) {
            $dev = \App::environment('dev') ? '[dev] ' : '';
            $message->subject($dev.'Contact Us: '.$data['contactSubject'])
                    ->to('[email protected]')
                    ->replyTo($data['contactEmail']);
        });

        return back()->withSuccess(
          "Thank you for contacting us! We will be in touch shortly!"
        );
    }
}

Please or to participate in this conversation.