Laravel 5 表单中如何集成使用 Google reCAPTCHA 验证码
1、简介
有时候我们需要在表单提交时使用验证码以防止灌水、机器人等恶意操作,关于验证码有很多开源库可供使用,目前使用率最高的当属Google reCAPTCHA——无论是客户端还是服务器端使用起来都很简单方便,所以这里我们以Google reCAPTCHA为例演示如何在Laravel应用的表单中嵌入验证码。
Github上有现成的集成Google reCAPTCHA到Laravel的项目:anhskohbo/no-captcha。在这篇教程中我们将演示如何在Laravel 5中使用验证码。
2、安装&配置
我们使用Composer安装该扩展包:
composer require anhskohbo/no-captcha
对于 Laravel 5.5 以下版本,安装完成后,我们需要在config/app.php
中注册服务提供者到providers
数组(5.5 以上版本会自动发现该服务提供者,无需手动注册):
Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class
然后将扩展包的配置文件发布到 config
目录下:
php artisan vendor:publish --provider="Anhskohbo\NoCaptcha\NoCaptchaServiceProvider"
接下来需要为站点获取 Google recaptcha site key 和 secret key,登录Recaptcha Admin,初次获取需要先注册站点:
点击“Register”,即可获取站点对应的 site key 和 secret key:
将刚刚获取到的site key和secret key添加到.env
文件中:
NOCAPTCHA_SECRET=[secret-key] NOCAPTCHA_SITEKEY=[site-key]
这样我们就为Laravel应用配置好了recaptcha,下面我们在表单中显示验证码。
3、在表单中集成验证码
要在视图中显示验证码,需要插入如下这行代码:
{!! NoCaptcha::display() !!}
并且引入相应的 JS 代码:
{!! NoCaptcha::renderJs() !!}
接下来,我们来演示如何在具体 Laravel 项目中集成并渲染 Google reCAPTCHA。
首先我们在routes.php
中定义相应的访问路由:
Route::get('contact', function() { return view('contact'); }); Route::post('contact', 'EnquiryController@index');
然后我们创建一个控制器EnquiryController
:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Redirect; class EnquiryController extends Controller { public function index() { $data = Input::all(); $rules = array( 'name' => 'required', 'email' => 'required|email', 'subject' => 'required', 'g-recaptcha-response' => 'required|captcha', 'msg' => 'required', ); $validator = Validator::make($data, $rules); if ($validator->fails()){ return Redirect::to('/contact')->withInput()->withErrors($validator); } else { // Do your stuff. } } }
最后我们创建一个视图文件resources/views/contact.blade.php
,编辑其内容如下:
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8 col-md-offset-2"> <div class="card"> <div class="card-header">Contact us</div> <div class="card-body"> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>Whoops!</strong> There were some problems with your input.<br /><br /> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action="/contact" method="POST" id="myform"> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">Name</label> <div class="col-md-6"> <input name="name" class="form-control" placeholder="Your Full Name"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">E-Mail Address</label> <div class="col-md-6"> <input name="email" class="form-control" placeholder="Your Email"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">Subject</label> <div class="col-md-6"> <input name="subject" class="form-control" placeholder="Your Subject"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">Message</label> <div class="col-md-6"> <input name="msg" class="form-control" placeholder="Your Message"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">Captcha</label> <div class="col-md-6"> {!! NoCaptcha::display() !!} </div> </div> <div class="form-group row mb-0"> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary"> Submit </button> </div> </div> </form> </div> </div> </div> </div> </div> @endsection {!! NoCaptcha::renderJs() !!}
在浏览器中访问https://laravel.geekai.co/contact
,就可以看到对应的验证码效果了:
10 Comments
我用的laravel5.8版本,按照上面的步骤,到最后一步显示的时候,报如下错误,请大佬指导一下,感谢!!
模板代码是直接复制上面的教程的,代码如下:
<div class="form-group"> <label class="col-md-4 control-label">Captcha</label> <div class="col-md-6"> {!! app('captcha')->display(); !!} </div> </div>
报错如下: Call to undefined method Mews\Captcha\Captcha::display();
我搜了一下谷歌,说5.8版本加载验证码的方式是这样的 {!! NoCaptcha::display() !!} 但是我复制过去,也是报同样的错误。
我已经按照 Laravel 5.8 版本重新修改过了 你再按照教程从头开始试下
Mews\Captcha\Captcha 是另外一种验证码扩展吧?跟谷歌这个同时用好像有冲突