Geetest 極驗是國內主流行為式驗證碼,支援滑動拼圖、點選文字、無感驗證。本文詳細講解 PHP 接入全流程:前端初始化、後端註冊/驗證、SDK 封裝、常見問題。
captcha_id、private_key。vendor/geetest/。pre_process($userId);
$_SESSION['gtserver'] = $status; // 1: 正常模式, 0: 故障模式
$_SESSION['user_id'] = $userId;
// 返回前端所需配置
echo $gt->get_response_str(); // JSON: {gt, challenge, success}
success_validate($challenge, $validate, $seccode, $userId);
} else {
// 故障模式:離線驗證
$passed = $gt->fail_validate($challenge, $validate, $seccode);
}
if (!$passed) {
exit(json_encode(['code' => 400, 'msg' => '驗證碼驗證失敗']));
}
// 極驗通過,進行業務驗證(如登錄)
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// ... 你的登錄邏輯 ...
if ($loginSuccess) {
exit(json_encode(['code' => 0, 'msg' => '登錄成功']));
} else {
exit(json_encode(['code' => 401, 'msg' => '用戶名或密碼錯誤']));
}
| 方法 | 參數 | 返回 | 說明 |
|---|---|---|---|
| pre_process($user_id) | string | int (0/1) | 向極驗註冊,返回服務狀態 |
| get_response_str() | - | string(JSON) | 前端初始化所需參數 |
| success_validate($challenge, $validate, $seccode, $user_id) | string,string,string,string | bool | 正常模式二次驗證 |
| fail_validate($challenge, $validate, $seccode) | string,string,string | bool | 故障模式離線驗證 |
| 問題 | 原因 | 解決 |
|---|---|---|
| 驗證碼不顯示/報錯 | gt.js 加載失敗/域名未授權 | 極驗後台添加授權域名、檢查 CSP 策略、HTTPS 下引用 HTTPS gt.js |
| 二次驗證總失敗 | user_id 不一致/Session 丟失 | 確保 register/verify 使用同一 user_id,Session 未過期、域名一致 |
| 彈出式不彈出 | bindOn 綁定錯誤/按鈕被遮擋 | 確保 bindOn 選擇器正確、按鈕可見、z-index 足夠 |
| 離線模式頻繁觸發 | 極驗服務器不可達/防火牆攔截 | 服務器放行出站 443 到 api.geetest.com、檢查 DNS 解析 |
| 移動端體驗差 | product 類型不適配 | 移動端建議用 "embed" 嵌入式或 "float" 懸浮式 |
vendor/ 或 extend/,配置自動加載。GeetestService::register($userId)、GeetestService::validate($data)。captcha_id、private_key,環境區分(測試/正式)。Geetest 接入核心三步:前端 gt.js 初始化 → 後端 pre_process 註冊 → 業務提交時 success_validate 二次驗證。關鍵細節:user_id 一致性、Session 管理、正常/故障模式分支。封裝 Service 類統一項目調用,配合極驗後台策略配置(難度、頻率限制),構建安全友好的驗證體驗。