tp/app/utils/Geetest.php
2026-02-26 17:38:11 +08:00

86 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\utils;
// 引入极验 SDK 的核心类
use geetest\GeetestLib;
use app\model\System\SystemSiteSettings;
class Geetest
{
/**
* 极验 3.0 的 ID 和 KEY
* 优先从系统配置表 SystemSiteSettings 中读取 geetest3ID / geetest3KEY
*/
private $captchaId;
private $privateKey;
public function __construct()
{
// 默认值可以为空,避免硬编码
$this->captchaId = null;
$this->privateKey = null;
try {
// 从系统设置表中读取极验3.0配置
$settings = SystemSiteSettings::where('delete_time', null)
->whereIn('label', ['geetest3ID', 'geetest3KEY'])
->column('value', 'label');
if (!empty($settings['geetest3ID']) && !empty($settings['geetest3KEY'])) {
$this->captchaId = $settings['geetest3ID'];
$this->privateKey = $settings['geetest3KEY'];
}
} catch (\Throwable $e) {
// 读取配置失败时,不抛出致命错误,留给上层决定是否启用极验
error_log('加载极验配置失败: ' . $e->getMessage());
}
}
/**
* 初始化极验验证(前端获取验证参数)
* @return string JSON 字符串
*/
public function init()
{
$gtLib = new GeetestLib($this->captchaId, $this->privateKey);
// 用户唯一标识可传用户ID、IP等不能为空
$userId = request()->ip();
// 预处理验证
$status = $gtLib->pre_process($userId);
// 保存状态到 session
session('gtserver', $status);
session('gt_user_id', $userId);
// 返回前端需要的验证参数
return $gtLib->get_response_str();
}
/**
* 验证前端提交的极验数据
* @param array $data 前端提交的 geetest_challenge/validate/seccode
* @return bool 验证结果
*/
public function verify(array $data)
{
$gtLib = new GeetestLib($this->captchaId, $this->privateKey);
$userId = session('gt_user_id');
$status = session('gtserver');
if ($status == 1) {
// 正常模式验证
$result = $gtLib->success_validate(
$data['geetest_challenge'],
$data['geetest_validate'],
$data['geetest_seccode'],
$userId
);
} else {
// 宕机模式验证
$result = $gtLib->fail_validate(
$data['geetest_challenge'],
$data['geetest_validate'],
$data['geetest_seccode']
);
}
return $result;
}
}