.net 项目git地址 注意 .net 版本 4.6.2
项目介绍:# LazyCaptcha v2(基于SkiaSharp) 仿EasyCaptcha和SimpleCaptcha,基于.Net Standard 2.0 的图形验证码模块。 v2是指版本号>=2.0.0的版本,<2.0.0则称为v1。 v1基于ImageSharp,v2基于SkiaSharp 。SkiaSharp性能更好,但发布到linux时需要安装对应NativeAssets(ImageSharp则不需要)。 v1文档地址
本地需要先启动.net 验证码服务
- 需要先配置.net 服务 win系统 需要下载 指定版本
- 安装完毕后再 cmd 中输入命令验证是否安装成功
dotnet --version
会输出对应版本号 - 下载验证码项目
git clone https://github.com/pojianbing/LazyCaptcha.git
- 进入到指定目录
LazyCaptcha\Sample.NetCore
运行dotnet restore
- 这个命令会自动下载项目所需的所有依赖包(包括Lazy.Captcha.Core
本身)。 - 在同一个命令行中输入
dotnet run
程序开始编译并运行。会输出类似下面的命令info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:5001 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5000 info: Microsoft.Hosting.Lifetime[14] Application started. Press Ctrl+C to shut down.
6.在浏览器中查看验证码 输入地址 http://localhost:5000/captcha?id=123
TP6 后端代码:
css
路由部分
// 验证码测试
Route::group(function () {
Route::get('getCaptcha', 'v1.CaptchaController/getCaptcha');
Route::get('image', 'v1.CaptchaController/captchaImage');
Route::post('verify', 'v1.CaptchaController/verify');
});
控制器
php
<?php
namespace app\databoardapi\controller\v1;
use think\facade\Log;
use think\facade\Request;
class CaptchaController
{
private $netCaptchaUrl = 'http://localhost:5220/captcha';
private $netValidateUrl = 'http://localhost:5220/captcha/validate';
public function index()
{
return "index";
}
public function getCaptcha()
{
$captchaId = uniqid('cap_');
// 手动拼接 URL,确保返回字符串
$imageUrl = 'http://192.168.1.119/databoardapi/image?id=' . urlencode($captchaId);
return json([
'success' => true,
'data' => [
'captcha_id' => $captchaId,
'captcha_image' => $imageUrl
]
]);
}
public function captchaImage()
{
$id = request()->param('id', '', 'trim');
if (empty($id)) {
return abort(400, 'Missing captcha id');
}
$url = $this->netCaptchaUrl . '?id=' . urlencode($id);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$imageData = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($imageData === false || $httpCode !== 200) {
Log::error('Failed to fetch captcha: ' . $url);
return abort(500, '验证码服务错误');
}
return response($imageData, 200, ['Content-Type' => 'image/png']);
}
public function verify(\app\Request $request)
{
$data = $request->getMore([
['captcha_id', ''],
['captcha_code','']
]);
$captchaId = $data['captcha_id'] ?? '';
$userInput = $data['captcha_code'] ?? '';
if (empty($captchaId) || empty($userInput)) {
return json(['success' => false, 'message' => '参数缺失'], 400);
}
$url = $this->netValidateUrl . '?id=' . urlencode($captchaId) . '&code=' . urlencode($userInput);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$result = curl_exec($ch);
curl_close($ch);
if ($result === false) {
Log::error('验证请求失败: ' . $url);
return json(['success' => false, 'message' => '验证码服务不可用'], 500);
}
$isValid = trim($result) === 'True' || trim($result) === 'true';
return json([
'success' => $isValid,
'message' => $isValid ? '验证码正确' : '验证码错误'
]);
}
}
在postman中访问 :http://127.0.0.1/databoardapi/getCaptcha 获取下面返回值
json
{
"success": true,
"data": {
"captcha_id": "cap_68f88ff18b15b",
"captcha_image": "http://192.168.1.119/databoardapi/image?id=cap_68f88ff18b15b"
}
}
验证接口 post 方式请求 http://127.0.0.1/databoardapi/verify
请求值:
json
{
"captcha_id":"cap_68f8955224443",
"captcha_code":"象进地但"
}
返回值:
json
{
"success": true,
"message": "验证码正确"
}