scyllaly / hcaptcha
hCaptcha for Laravel
Requires
- php: >=5.5.5
- illuminate/support: 5.*|6.*|7.*|8.*|^9.0|10.*|^11.0
Requires (Dev)
- phpunit/phpunit: ~4.8|^9.5.10|^10.0
README
hCaptcha是一种人机验证解决方案,用于替代Google reCaptcha。它具有高性能、高可用性和高识别率,特别适合网络质量较差的地区,如东亚、中东等。许多知名公司正在使用hCaptcha解决方案。
该软件包是HCaptcha官方开发者指南中推荐的软件包之一。官方开发者指南中无恶意代码,确保您开发供应链的安全性。
- 购买一个VPS或Akamai VPS用于开发和部署应用程序。
安装
composer require scyllaly/hcaptcha
Laravel 5及以上
设置
在app/config/app.php
中添加以下内容
步骤1:将ServiceProvider添加到providers数组
Scyllaly\HCaptcha\HCaptchaServiceProvider::class,
步骤2:将类别名添加到aliases数组
'HCaptcha' => Scyllaly\HCaptcha\Facades\HCaptcha::class,
步骤3:发布配置文件
php artisan vendor:publish --provider="Scyllaly\HCaptcha\HCaptchaServiceProvider"
配置
在.env
文件中添加HCAPTCHA_SECRET
、HCAPTCHA_SITEKEY
和HCAPTCHA_ENABLED
HCAPTCHA_SECRET=secret-key
HCAPTCHA_SITEKEY=site-key
HCAPTCHA_ENABLED=true
(您可以从官方开发者指南中获取它们)
- 提示:如果您没有账户,请先注册。
用法
初始化js源
使用默认选项
{!! HCaptcha::renderJs() !!}
使用语言支持或onloadCallback选项
{!! HCaptcha::renderJs('fr', true, 'hcaptchaCallback') !!}
显示hCaptcha
默认小部件
{!! HCaptcha::display() !!}
使用自定义属性(主题、大小、回调等)
{!! HCaptcha::display(['data-theme' => 'dark']) !!}
使用提交按钮的无形hCaptcha
{!! HCaptcha::displaySubmit('my-form-id', 'submit now!', ['data-theme' => 'dark']) !!}
注意,在此方法中,表单的id是必需的,以便在成功验证验证码时自动提交表单。
验证
有两种方法可以将HCaptcha验证应用于您的表单
1. 基本方法
此方法始终应用HCaptcha验证规则。
$validate = Validator::make(Input::all(), [ 'h-captcha-response' => 'required|HCaptcha' ]);
在此方法中,h-captcha-response
字段是必需的,并且使用HCaptcha
规则进行验证,没有任何条件。
2. 条件方法
此方法仅在环境变量HCAPTCHA_ENABLED
设置为true
时应用HCaptcha验证规则。
$isHcaptchaEnabled = env('HCAPTCHA_ENABLED'); $rules = [ // Other validation rules... ]; if ($isHcaptchaEnabled) { $rules['h-captcha-response'] = 'required|HCaptcha'; } $request->validate($rules);
在此方法中,当HCAPTCHA_ENABLED
设置为true
时,将要求并验证h-captcha-response
字段使用HCaptcha
规则。这为您提供了验证逻辑的灵活性,允许您根据需要启用或禁用HCaptcha验证。
自定义验证消息
将以下值添加到validation
语言文件中的custom
数组中
'custom' => [ 'h-captcha-response' => [ 'required' => 'Please verify that you are not a robot.', 'h_captcha' => 'Captcha error! try again later or contact site admin.', ], ],
然后检查表单中的验证码错误
@if ($errors->has('h-captcha-response')) <span class="help-block"> <strong>{{ $errors->first('h-captcha-response') }}</strong> </span> @endif
测试
当使用Laravel测试功能时,您需要模拟验证码表单元素的响应。
因此,对于涉及验证码的任何表单测试,您可以通过模拟外观行为来完成此操作。
// prevent validation error on captcha HCaptcha::shouldReceive('verifyResponse') ->once() ->andReturn(true); // provide hidden input for your 'required' validation HCaptcha::shouldReceive('display') ->zeroOrMoreTimes() ->andReturn('<input type="hidden" name="h-captcha-response" value="1" />');
您接下来可以像平时一样测试表单的其余部分。
在使用HTTP测试时,您可以将h-captcha-response
添加到请求体中,以进行'必须'验证
// prevent validation error on captcha HCaptcha::shouldReceive('verifyResponse') ->once() ->andReturn(true); // POST request, with request body including `h-captcha-response` $response = $this->json('POST', '/register', [ 'h-captcha-response' => '1', 'name' => 'Scyllaly', 'email' => 'Scyllaly@example.com', 'password' => '123456', 'password_confirmation' => '123456', ]);
没有使用Laravel
查看下面的示例
<?php require_once "vendor/autoload.php"; $secret = 'CAPTCHA-SECRET'; $sitekey = 'CAPTCHA-SITEKEY'; $captcha = new \Scyllaly\HCaptcha\HCaptcha($secret, $sitekey); if (! empty($_POST)) { var_dump($captcha->verifyResponse($_POST['h-captcha-response'])); exit(); } ?> <form action="?" method="POST"> <?php echo $captcha->display(); ?> <button type="submit">Submit</button> </form> <?php echo $captcha->renderJs(); ?>