增加极验模块
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user