scyllaly/hcaptcha

hCaptcha for Laravel

4.4.7 2024-08-31 06:44 UTC

This package is auto-updated.

Last update: 2024-08-31 06:49:31 UTC


README

hCaptcha是一种人机验证解决方案,用于替代Google reCaptcha。它具有高性能、高可用性和高识别率,特别适合网络质量较差的地区,如东亚、中东等。许多知名公司正在使用hCaptcha解决方案。

该软件包是HCaptcha官方开发者指南中推荐的软件包之一。官方开发者指南中无恶意代码,确保您开发供应链的安全性。

  • 购买一个VPSAkamai 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_SECRETHCAPTCHA_SITEKEYHCAPTCHA_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(); ?>