ThinkPHP 3.1 內建 ORG.Util.Image 類別,提供開箱即用的驗證碼產生功能。本文示範最精簡的接入方式,並針對「圖片不顯示」、「輸出亂碼」等高頻問題給出解決方案。
verify() 方法public function verify() {
import('ORG.Util.Image');
ob_clean(); // 關鍵:清除先前輸出緩衝,避免圖片損壞
Image::buildImageVerify(); // 直接輸出驗證碼圖片並寫入 Session
}
<img src="__APP__/Index/verify/"
onclick="this.src=this.src+'?'+Math.random()"
alt="點擊刷新驗證碼"
style="cursor:pointer;vertical-align:middle;" />
__APP__/Index/verify/ 對應控制器/方法路徑,依實際路由調整。onclick 附加隨機查詢字串,強制瀏覽器重新請求,實現「點擊刷新」。public function login() {
if (session('verify') !== md5(strtoupper($_POST['verify']))) {
$this->error('驗證碼錯誤');
}
// ... 後續登入邏輯
}
注意:ThinkPHP 3.1 預設將驗證碼以 md5(strtoupper($code)) 存入 Session,驗證時需同樣處理。
| 現象 | 原因 | 修正 |
|---|---|---|
| 圖片顯示「圖示破損」或空白 | 方法前有 echo、空白行、BOM 或其他輸出 | 在 Image::buildImageVerify() 前加 ob_clean();確保 PHP 標籤前無任何字元 |
| 瀏覽器顯示一堆亂碼(二進位內容) | 未送出 Content-type: image/... 標頭 | 內建方法已自動送標頭;若手動輸出請補 header('Content-type: image/png') |
| 驗證永遠失敗 | Session 未啟動或跨子域名 | 確認 session_start() 已執行;設定 cookie_domain 共享 Session |
| 字型找不到報錯 | GD 未支援 FreeType 或字型路徑錯誤 | 安裝 php-gd 並啟用 FreeType;或改用內建點陣字型 |
Image::buildImageVerify() 支援陣列參數覆蓋預設值:
Image::buildImageVerify([
'length' => 4, // 字元長度
'width' => 120, // 圖片寬度
'height' => 40, // 圖片高度
'fontSize' => 20, // 字體大小
'useCurve' => true, // 是否畫干擾曲線
'useNoise' => true, // 是否加干擾點
'bg' => [240,240,240], // 背景色 RGB
]);
display())之前輸出。think-captcha 擴充包,用法類似但命名空間不同。掌握上述要點,即可在 ThinkPHP 3.1 專案中穩定接入驗證碼,有效阻擋機器人暴力提交。