滑塊驗(yàn)證碼的插件實(shí)現(xiàn)方法
本文使用的是第三方驗(yàn)證服務(wù) -極驗(yàn)驗(yàn)證碼4.0
如使用上有問題可聯(lián)系我-將持續(xù)免費(fèi)開源更新
--下載頁可以隱藏當(dāng)前下載地址(支持上傳文件和輸入文件地址)
去官網(wǎng)申請賬號,本插件基于免費(fèi)版開發(fā),https://console.geetest.com/sensbot/management

創(chuàng)建業(yè)務(wù)模塊

新增業(yè)務(wù)場景

獲取到id和key

3、添加極驗(yàn)id和key


功能配置
2024/07/18 更新 下載頁適配
所有代碼下載鏈接回復(fù)后自取:
使用方式:
根目錄解壓縮
主要邏輯文件在dayrui\App\Geetest\Controllers\api.php中
舉例 下載頁驗(yàn)證實(shí)現(xiàn)邏輯:
public function down() { error_reporting(0); // 點(diǎn)擊下載驗(yàn)證后 會(huì)通過get方式獲取到前端極驗(yàn)的別名 $cname = $_GET['cname']; //這里做一個(gè)判斷別名空值 if(!$cname){ \Phpcmf\Service::C()->_json(0, dr_lang('獲取極驗(yàn)別名為空,請檢查')); } //通過別名獲取極驗(yàn)后臺錄入的id以及key $captcha_id = dr_geetest($cname, 2); $captcha_key = dr_geetest($cname, 3); // 定義極驗(yàn)備用服務(wù)器地址 $api_servers = [ "http://gcaptcha4.geetest.com", "http://gcaptcha4.geevisit.com", "http://gcaptcha4.gsensebot.com" ]; // 獲取用戶驗(yàn)證后前端傳過來的驗(yàn)證流水號參數(shù)“這邊是極驗(yàn)回傳的參數(shù)” $lot_number = $_GET['lot_number']; $captcha_output = $_GET['captcha_output']; $pass_token = $_GET['pass_token']; $gen_time = $_GET['gen_time']; // 3. 生成簽名 $sign_token = hash_hmac('sha256', $lot_number, $captcha_key); // 4. 上傳校驗(yàn)參數(shù)到極驗(yàn)二次驗(yàn)證接口,校驗(yàn)用戶驗(yàn)證狀態(tài) $result = $this->validateCaptcha($api_servers, $captcha_id, $lot_number, $captcha_output, $pass_token, $gen_time, $sign_token); // 5. 根據(jù)極驗(yàn)返回的用戶驗(yàn)證狀態(tài),進(jìn)行自定義業(yè)務(wù)邏輯(這里只寫了驗(yàn)證通過,不通過則給提示) $status = $result['result']; $reason = $result['reason']; //二次驗(yàn)證通過 if ($status == 'success') { //通過get方式獲取前端下載頁地址 $currentUrl = \Phpcmf\Service::L('input')->get('currentUrl'); //通過PHP 內(nèi)置的 parse_url 函數(shù),獲???號之后的代碼 “s=api&c=file&m=down&id=fec5ebe1ba6e6d5863ad6aa569cd9078” $queryString = parse_url($currentUrl, PHP_URL_QUERY); //arse_str函數(shù),是把后面的地址,解析成一個(gè)數(shù)組 “s=api c=file...” parse_str($queryString, $params); //把“id=fec5ebe1ba6e6d5863ad6aa569cd9078”賦值給id,下面是官方的一個(gè)讀取附件的代碼 $id = $params['id']; //判斷 $id 是否是數(shù)字 if (is_numeric($id)) { //純數(shù)字就是你跳轉(zhuǎn)過來的內(nèi)容頁的id $rt = [ 'id' => $id, 'name' => dr_safe_replace(\Phpcmf\Service::L('input')->get('name')), ]; } //判斷是否32位的字符串 “id=fec5ebe1ba6e6d5863ad6aa569cd9078” elseif (strlen((string)$id) == 32) { //是的話就找緩存文件(上傳文件都是有一個(gè)緩存文件存儲) $rt = \Phpcmf\Service::L('cache')->get_auth_data('down-file-'.$id); if (!$rt) { $this->_msg(0, dr_lang('此附件下載鏈接已經(jīng)失效')); } } //如果都不是,直接返回id else { $rt = [ 'id' => dr_safe_replace(urldecode($id)), 'name' => dr_safe_replace(\Phpcmf\Service::L('input')->get('name')), ]; } //然后通過把上面獲取到的id賦值 $id = trim($rt['id']); //通過上傳文件緩存獲取對應(yīng)的url下載鏈接 $data = \Phpcmf\Service::L('cache')->get_file('attach-info-'. $id, 'attach'); 判斷是否有文件緩存文件 if($data){ //有的話返回出緩存文件內(nèi)的url地址 $url = $data['url']; }else{ //如果沒有的話直接返回id(這個(gè)位置是根據(jù)官方附件獲取邏輯寫的,沒有獲取緩存文件的地址,代表可能是你手動(dòng)輸入的地址,而這里的id會(huì)直接獲取到文件下載地址) $url = $rt['id']; } // 獲取驗(yàn)證成功后的 URL 返回后前端使用ajax獲取下載地址 echo sprintf('{"status":"%s","url":"%s"}', $status, $url); } else { // 在驗(yàn)證失敗時(shí)執(zhí)行的代碼,只返回狀態(tài)碼 echo sprintf('{"status":"%s","reason":"%s"}', $status, $reason); } }其他自己開發(fā)業(yè)務(wù),只需要自己中間驗(yàn)證成功后寫api,前端回傳即可
public function test() { error_reporting(0); // 點(diǎn)擊下載驗(yàn)證后 會(huì)通過get方式獲取到前端極驗(yàn)的別名 $cname = $_GET['cname']; //這里做一個(gè)判斷別名空值 if(!$cname){ \Phpcmf\Service::C()->_json(0, dr_lang('獲取極驗(yàn)別名為空,請檢查')); } //通過別名獲取極驗(yàn)后臺錄入的id以及key $captcha_id = dr_geetest($cname, 2); $captcha_key = dr_geetest($cname, 3); // 定義極驗(yàn)備用服務(wù)器地址 $api_servers = [ "http://gcaptcha4.geetest.com", "http://gcaptcha4.geevisit.com", "http://gcaptcha4.gsensebot.com" ]; // 獲取用戶驗(yàn)證后前端傳過來的驗(yàn)證流水號參數(shù)“這邊是極驗(yàn)回傳的參數(shù)” $lot_number = $_GET['lot_number']; $captcha_output = $_GET['captcha_output']; $pass_token = $_GET['pass_token']; $gen_time = $_GET['gen_time']; // 3. 生成簽名 $sign_token = hash_hmac('sha256', $lot_number, $captcha_key); // 4. 上傳校驗(yàn)參數(shù)到極驗(yàn)二次驗(yàn)證接口,校驗(yàn)用戶驗(yàn)證狀態(tài) $result = $this->validateCaptcha($api_servers, $captcha_id, $lot_number, $captcha_output, $pass_token, $gen_time, $sign_token); // 5. 根據(jù)極驗(yàn)返回的用戶驗(yàn)證狀態(tài),進(jìn)行自定義業(yè)務(wù)邏輯(這里只寫了驗(yàn)證通過,不通過則給提示) $status = $result['result']; $reason = $result['reason']; //二次驗(yàn)證通過 if ($status == 'success') { //自己的業(yè)務(wù)代碼 } else { // 在驗(yàn)證失敗時(shí)執(zhí)行的代碼,只返回狀態(tài)碼 echo sprintf('{"status":"%s","reason":"%s"}', $status, $reason); } }