1. 安裝 gregwar/captcha
圖片驗證碼接口的流程是:
生成圖片驗證碼
生成隨機的 key,將驗證碼文本存入緩存。
返回隨機的 key,以及驗證碼圖片
# 不限于 laravel 普通 php 項目也可以使用額
$ composer require gregwar/captcha
2. 開發接口
1). 新建路由
routes/web.php
oute::prefix('auth')->group(function (){Route::post('captchas', [CaptchasController::class, 'store']);
});
2). 新建控制器和表單驗證類
創建 CaptchasController 以及 CaptchaRequest
$ php artisan make:controller CaptchasController
$ php artisan make:request Api/CaptchaRequest
修改文件如下
app/Http/Requests/Api/CaptchaRequest.php
<?phpnamespace App\Http\Requests\Api;use Illuminate\Foundation\Http\FormRequest;class CaptchaRequest extends FormRequest
{/*** Determine if the user is authorized to make this request.** @return bool*/public function authorize(){return true;}/*** Get the validation rules that apply to the request.** @return array*/public function rules(){return [// 'phone' => 'required|regex:/^1[34578]\d{9}$/|unique:users',];}
}
app/Http/Controllers/CaptchasController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Gregwar\Captcha\CaptchaBuilder;
use App\Http\Requests\Api\CaptchaRequest;
class CaptchasController extends Controller
{public function store(CaptchaRequest $request, CaptchaBuilder $captchaBuilder){ // $key = 'captcha-'.str_random(15);$key = 'captcha-'.time();$phone = $request->phone;$captcha = $captchaBuilder->build();$expiredAt = now()->addMinutes(2);\Cache::put($key, ['phone' => $phone, 'code' => $captcha->getPhrase()], $expiredAt);$result = ['captcha_key' => $key,'expired_at' => $expiredAt->toDateTimeString(),'captcha_image_content' => $captcha->inline()];return $result;return $this->response->$result->setStatusCode(201);}
}
代碼分析
use Gregwar\Captcha\CaptchaBuilder;
創建驗證碼實例: $captcha = $captchaBuilder->build();
獲取驗證碼值: $captcha->getPhrase(); // abcd…
獲取驗證碼圖片的 base64: $captcha->inline() // base64 xxxxx
3). 代碼分解
分析一下代碼:
增加了 CaptchaRequest 要求用戶必須通過手機號調用圖片驗證碼接口。
controller 中,注入CaptchaBuilder,通過它的 build 方法,創建出來驗證碼圖片
使用 getPhrase 方法獲取驗證碼文本,跟手機號一同存入緩存。
返回 captcha_key,過期時間以及 inline 方法獲取的 base64 圖片驗證碼
這里給圖片驗證碼設置為 2 分鐘過期,