thinkphp驗(yàn)證碼(支持圖片和base64)

<?php


namespace captcha\src;


use Exception;
use Firebase\JWT\JWT;
use think\Config;
use think\Response;

class Captcha
{
    private $im = null; // 驗(yàn)證碼圖片實(shí)例

    /**
     * @var Config|null
     */
    private ?Config $config = null;
    protected string $encodeStr = '';
    // 驗(yàn)證碼字符集合
    protected string $codeSet = '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY';
    // 使用中文驗(yàn)證碼
    protected bool $useZh = false;
    // 中文驗(yàn)證碼字符串
    protected string $zhSet = '們以我到他會作時(shí)要?jiǎng)訃a(chǎn)的一是工就年階義發(fā)成部民可出能方進(jìn)在了不和有大這主中人上為來分生對于學(xué)下級地個(gè)用同行面說種過命度革而多子后自社加小機(jī)也經(jīng)力線本電高量長黨得實(shí)家定深法表著水理化爭現(xiàn)所二起政三好十戰(zhàn)無農(nóng)使性前等反體合斗路圖把結(jié)第里正新開論之物從當(dāng)兩些還天資事隊(duì)批點(diǎn)育重其思與間內(nèi)去因件日利相由壓員氣業(yè)代全組數(shù)果期導(dǎo)平各基或月毛然如應(yīng)形想制心樣干都向變關(guān)問比展那它最及外沒看治提五解系林者米群頭意只明四道馬認(rèn)次文通但條較克又公孔領(lǐng)軍流入接席位情運(yùn)器并飛原油放立題質(zhì)指建區(qū)驗(yàn)活眾很教決特此常石強(qiáng)極土少已根共直團(tuán)統(tǒng)式轉(zhuǎn)別造切九你取西持總料連任志觀調(diào)七么山程百報(bào)更見必真保熱委手改管處己將修支識病象幾先老光專什六型具示復(fù)安帶每東增則完風(fēng)回南廣勞輪科北打積車計(jì)給節(jié)做務(wù)被整聯(lián)步類集號列溫裝即毫知軸研單色堅(jiān)據(jù)速防史拉世設(shè)達(dá)爾場織歷花受求傳口斷況采精金界品判參層止邊清至萬確究書術(shù)狀廠須離再目海交權(quán)且兒青才證低越際八試規(guī)斯近注辦布門鐵需走議縣兵固除般引齒千勝細(xì)影濟(jì)白格效置推空配刀葉率述今選養(yǎng)德話查差半敵始片施響收華覺備名紅續(xù)均藥標(biāo)記難存測士身緊液派準(zhǔn)斤角降維板許破述技消底床田勢端感往神便賀村構(gòu)照容非搞亞磨族火段算適講按值美態(tài)黃易彪服早班麥削信排臺聲該擊素張密害侯草何樹肥繼右屬市嚴(yán)徑螺檢左頁抗蘇顯苦英快稱壞移約巴材省黑武培著河帝僅針怎植京助升王眼她抓含苗副雜普談圍食射源例致酸舊卻充足短劃劑宣環(huán)落首尺波承粉踐府魚隨考刻靠夠滿夫失包住促枝局菌桿周護(hù)巖師舉曲春元超負(fù)砂封換太模貧減陽揚(yáng)江析畝木言球朝醫(yī)校古呢稻宋聽唯輸滑站另衛(wèi)字鼓剛寫劉微略范供阿塊某功套友限項(xiàng)余倒卷創(chuàng)律雨讓骨遠(yuǎn)幫初皮播優(yōu)占死毒圈偉季訓(xùn)控激找叫云互跟裂糧粒母練塞鋼頂策雙留誤礎(chǔ)吸阻故寸盾晚絲女散焊功株親院冷徹彈錯(cuò)散商視藝滅版烈零室輕血倍缺厘泵察絕富城沖噴壤簡否柱李望盤磁雄似困鞏益洲脫投送奴側(cè)潤蓋揮距觸星松送獲興獨(dú)官混紀(jì)依未突架寬冬章濕偏紋吃執(zhí)閥礦寨責(zé)熟穩(wěn)奪硬價(jià)努翻奇甲預(yù)職評讀背協(xié)損棉侵灰雖矛厚羅泥辟告卵箱掌氧恩愛停曾溶營終綱孟錢待盡俄縮沙退陳討奮械載胞幼哪剝迫旋征槽倒握擔(dān)仍呀鮮吧卡粗介鉆逐弱腳怕鹽末陰豐霧冠丙街萊貝輻腸付吉滲瑞驚頓擠秒懸姆爛森糖圣凹陶詞遲蠶億矩康遵牧遭幅園腔訂香肉弟屋敏恢忘編印蜂急拿擴(kuò)傷飛露核緣游振操央伍域甚迅輝異序免紙夜鄉(xiāng)久隸缸夾念蘭映溝乙嗎儒殺汽磷艱晶插埃燃?xì)g鐵補(bǔ)咱芽永瓦傾陣碳演威附牙芽永瓦斜灌歐獻(xiàn)順豬洋腐請透司危括脈宜笑若尾束壯暴企菜穗楚漢愈綠拖牛份染既秋遍鍛玉夏療尖殖井費(fèi)州訪吹榮銅沿替滾客召旱悟刺腦措貫藏敢令隙爐殼硫煤迎鑄粘探臨薄旬善福縱擇禮愿伏殘雷延煙句純漸耕跑澤慢栽魯赤繁境潮橫掉錐希池?cái)〈倭林^托伙哲懷割擺貢呈勁財(cái)儀沉煉麻罪祖息車穿貨銷齊鼠抽畫飼龍庫守筑房歌寒喜哥洗蝕廢納腹乎錄鏡婦惡脂莊擦險(xiǎn)贊鐘搖典柄辯竹谷賣亂虛橋奧伯趕垂途額壁網(wǎng)截野遺靜謀弄掛課鎮(zhèn)妄盛耐援扎慮鍵歸符慶聚繞摩忙舞遇索顧膠羊湖釘仁音跡碎伸燈避泛亡答勇頻皇柳哈揭甘諾概憲濃島襲誰洪謝炮澆斑訊懂靈蛋閉孩釋乳巨徒私銀伊景坦累勻霉杜樂勒隔彎績招紹胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗堿殊崗?fù)谑先袆《押蘸尚睾馇谀て邱v案刊秧緩?fù)挂奂舸ㄑ╂湞O啦臉戶洛孢勃盟買楊宗焦賽旗濾硅炭股坐蒸凝竟陷槍黎救冒暗洞犯筒您宋弧爆謬涂味津臂障褐陸啊健尊豆拔莫抵桑坡縫警挑污冰柬嘴啥飯塑寄趙喊墊丹渡耳刨虎筆稀昆浪薩茶滴淺擁穴覆倫娘噸浸袖珠雌媽紫戲塔錘震歲貌潔剖牢鋒疑霸閃埔猛訴刷狠忽災(zāi)鬧喬唐漏聞沈熔氯荒莖男凡搶像漿旁玻亦忠唱蒙予紛捕鎖尤乘烏智淡允叛畜俘摸銹掃畢璃寶芯爺鑒秘凈蔣鈣肩騰枯拋軌堂拌爸循誘祝勵(lì)肯酒繩窮塘燥泡袋朗喂鋁軟渠顆慣貿(mào)糞綜墻趨彼屆墨礙啟逆卸航衣孫齡嶺騙休借';
    // 使用背景圖片
    protected bool $useImgBg = false;
    // 驗(yàn)證碼字體大小(px)
    protected int $fontSize = 25;
    // 是否畫混淆曲線
    protected bool $useCurve = true;
    // 是否添加雜點(diǎn)
    protected bool $useNoise = true;
    // 驗(yàn)證碼圖片高度
    protected int $imageH = 0;
    // 驗(yàn)證碼圖片寬度
    protected int $imageW = 0;
    // 驗(yàn)證碼位數(shù)
    protected int $length = 5;
    // 驗(yàn)證碼字體,不設(shè)置隨機(jī)獲取
    protected string $fontttf = '';
    // 背景顏色
    protected array $bg = [243, 251, 254];
    //算術(shù)驗(yàn)證碼
    protected bool $math = false;
    //干擾線數(shù)量
    protected int $grx = 3;

    /**
     * 架構(gòu)方法 設(shè)置參數(shù)
     * @access public
     * @param Config $config
     */
    public function __construct(Config $config)
    {
        $this->config = $config;
    }

    /**
     * 配置驗(yàn)證碼
     * @param string|null $config
     */
    protected function configure(string $config = null): void
    {
        if (is_null($config)) {
            $config = $this->config->get('captcha', []);
        } else {
            $config = $this->config->get('captcha.' . $config, []);
        }

        foreach ($config as $key => $val) {
            if (property_exists($this, $key)) {
                $this->{$key} = $val;
            }
        }
    }


    /**
     * 創(chuàng)建驗(yàn)證碼
     * @return array
     * @throws Exception
     */
    protected function generate(): array
    {
        $bag = '';
        if ($this->math) {
            $this->useZh = false;
            $this->length = 5;
            $key = '';
            switch (random_int(1, 3)) {
                case 1:
                    $x = random_int(100, 300);
                    $y = random_int(1, 100);
                    $bag = "{$x}+{$y} = ";
                    $key = $x + $y;
                    $key .= '';
                    break;
                case 2:
                    $x = random_int(100, 300);
                    $y = random_int(10, 90);
                    $bag = "{$x}-{$y} = ";
                    $key = $x - $y;
                    $key .= '';
                    break;
                case 3:
                    $x = random_int(1, 10);
                    $y = random_int(1, 10);
                    $bag = "{$x}*{$y} = ";
                    $key = $x * $y;
                    $key .= '';
                    break;
            }
            $hash = JWT::encode(['key' => $key], $this->encodeStr);
        } else {
            if ($this->useZh) {
                $characters = preg_split('/(?<!^)(?!$)/u', $this->zhSet);
            } else {
                $characters = str_split($this->codeSet);
            }

            for ($i = 0; $i < $this->length; $i++) {
                $bag .= $characters[rand(0, count($characters) - 1)];
            }

            $bag = mb_strtolower($bag, 'UTF-8');
            $hash = JWT::encode(['key' => $bag], $this->encodeStr);
        }

        return [
            'value' => $bag,
            'key' => $hash,
            'is_math' => false
        ];
    }

    /**
     * 驗(yàn)證驗(yàn)證碼是否正確
     * @access public
     * @param string $code 用戶驗(yàn)證碼
     * @param string $hash 加密串
     * @return bool 用戶驗(yàn)證碼是否正確
     */
    public function check(string $code, string $hash): bool
    {
        $decode = JWT::decode($hash, $code, ['HS256']);
        if (!empty($d)) {
            if ($decode->key == $this->encodeStr) {
                return true;
            }
        }
        return false;
    }

    /**
     * @return false|int
     * 隨機(jī)生成顏色
     */
    public function getColor()
    {
        return imagecolorallocate($this->im, mt_rand(1, 150), mt_rand(1, 150), mt_rand(1, 150));
    }


    /**
     * @param string      $returnImageType
     * @param string|null $config
     * @return array|Response
     * @throws Exception
     */
    public function create(string $returnImageType = 'image', string $config = null): array|Response
    {
        $this->configure($config);
        $generator = $this->generate();
        // 圖片寬(px)
        $this->imageW || $this->imageW = $this->length * $this->fontSize * 1.5 + $this->length * $this->fontSize / 2;
        // 圖片高(px)
        $this->imageH || $this->imageH = $this->fontSize * 2.5;
        // 建立一幅 $this->imageW x $this->imageH 的圖像
        $this->im = imagecreate($this->imageW, $this->imageH);
        // 設(shè)置背景
        imagecolorallocate($this->im, $this->bg[0], $this->bg[1], $this->bg[2]);

        // 驗(yàn)證碼使用隨機(jī)字體
        $ttfPath = __DIR__ . '/../assets/' . ($this->useZh ? 'zhttfs' : 'ttfs') . '/';

        if (empty($this->fontttf)) {
            $dir = dir($ttfPath);
            $ttfs = [];
            while (false !== ($file = $dir->read())) {
                if ('.' != $file[0] && substr($file, -4) == '.ttf') {
                    $ttfs[] = $file;
                }
            }
            $dir->close();
            $this->fontttf = $ttfs[array_rand($ttfs)];
        }

        $fontttf = $ttfPath . $this->fontttf;

        if ($this->useImgBg) {
            $this->background();
        }

        if ($this->useNoise) {
            // 繪雜點(diǎn)
            $this->writeNoise();
        }
        if ($this->useCurve) {
            // 繪干擾線
            for ($i = 1; $i <= $this->grx; $i++) {
                $this->writeCurve();
            }
        }

        // 繪驗(yàn)證碼
        $text = $this->useZh ? preg_split('/(?<!^)(?!$)/u', $generator['value']) : str_split($generator['value']); // 驗(yàn)證碼

        foreach ($text as $index => $char) {

            $x = $this->fontSize * ($index + 1) * mt_rand(1.2, 1.6) * ($this->math ? 1 : 1.5);
            $y = $this->fontSize + mt_rand(10, 20);
            $angle = $this->math ? 0 : mt_rand(-40, 40);

            imagettftext($this->im, $this->fontSize, $angle, $x, $y, $this->getColor(), $fontttf, $char);
        }

        ob_start();
        // 輸出圖像
        imagepng($this->im);
        $content = ob_get_clean();
        imagedestroy($this->im);
        if ($returnImageType == 'image') {
            return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');
        } else {
            return [
                'captchaKey' => $generator['key'],
                'captcha' => 'data:image/png;base64,' . base64_encode($content)
            ];
        }
    }


    /**
     * 畫一條由兩條連在一起構(gòu)成的隨機(jī)正弦函數(shù)曲線作干擾線(你可以改成更帥的曲線函數(shù))
     *      高中的數(shù)學(xué)公式咋都忘了涅,寫出來
     *        正弦型函數(shù)解析式:y=Asin(ωx+φ)+b
     *      各常數(shù)值對函數(shù)圖像的影響:
     *        A:決定峰值(即縱向拉伸壓縮的倍數(shù))
     *        b:表示波形在Y軸的位置關(guān)系或縱向移動距離(上加下減)
     *        φ:決定波形與X軸位置關(guān)系或橫向移動距離(左加右減)
     *        ω:決定周期(最小正周期T=2π/∣ω∣)
     */
    protected function writeCurve(): void
    {
        $px = $py = 0;
        $color = $this->getColor();
        // 曲線前部分
        $A = mt_rand(1, $this->imageH / 2);                  // 振幅
        $b = mt_rand(-$this->imageH / 4, $this->imageH / 4); // Y軸方向偏移量
        $f = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X軸方向偏移量
        $T = mt_rand($this->imageH, $this->imageW * 2);      // 周期
        $w = (2 * M_PI) / $T;

        $px1 = 0;                                               // 曲線橫坐標(biāo)起始位置
        $px2 = mt_rand($this->imageW / 2, $this->imageW * 0.8); // 曲線橫坐標(biāo)結(jié)束位置

        for ($px = $px1; $px <= $px2; $px = $px + 1) {
            if (0 != $w) {
                $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b
                $i = (int)($this->fontSize / 5);
                while ($i > 0) {
                    imagesetpixel($this->im, $px + $i, $py + $i, $color); // 這里(while)循環(huán)畫像素點(diǎn)比imagettftext和imagestring用字體大小一次畫出(不用這while循環(huán))性能要好很多
                    $i--;
                }
            }
        }

        // 曲線后部分
        $A = mt_rand(1, $this->imageH / 2);                     // 振幅
        $f = mt_rand(-$this->imageH / 4, $this->imageH / 4);    // X軸方向偏移量
        $T = mt_rand($this->imageH, $this->imageW * 2);         // 周期
        $w = (2 * M_PI) / $T;
        $b = $py - $A * sin($w * $px + $f) - $this->imageH / 2;
        $px1 = $px2;
        $px2 = $this->imageW;

        for ($px = $px1; $px <= $px2; $px = $px + 1) {
            if (0 != $w) {
                $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b
                $i = (int)($this->fontSize / 5);
                while ($i > 0) {
                    imagesetpixel($this->im, $px + $i, $py + $i, $color);
                    $i--;
                }
            }
        }
    }

    /**
     * 畫雜點(diǎn)
     * 往圖片上寫不同顏色的字母或數(shù)字
     */
    protected function writeNoise(): void
    {
        $codeSet = '2345678abcdefhijkmnpqrstuvwxyz';
        for ($i = 0; $i < 10; $i++) {
            //雜點(diǎn)顏色
            $noiseColor = imagecolorallocate($this->im, mt_rand(150, 225), mt_rand(150, 225), mt_rand(150, 225));
            for ($j = 0; $j < 5; $j++) {
                // 繪雜點(diǎn)
                imagestring($this->im, 5, mt_rand(-10, $this->imageW), mt_rand(-10, $this->imageH), $codeSet[mt_rand(0, 29)], $noiseColor);
            }
        }
    }

    /**
     * 繪制背景圖片
     * 注:如果驗(yàn)證碼輸出圖片比較大,將占用比較多的系統(tǒng)資源
     */
    protected function background(): void
    {
        $path = __DIR__ . '/../assets/bgs/';
        $dir = dir($path);

        $bgs = [];
        while (false !== ($file = $dir->read())) {
            if ('.' != $file[0] && substr($file, -4) == '.jpg') {
                $bgs[] = $path . $file;
            }
        }
        $dir->close();

        $gb = $bgs[array_rand($bgs)];

        [$width, $height] = @getimagesize($gb);
        // Resample
        $bgImage = @imagecreatefromjpeg($gb);
        @imagecopyresampled($this->im, $bgImage, 0, 0, 0, 0, $this->imageW, $this->imageH, $width, $height);
        @imagedestroy($bgImage);
    }

}

配置
config文件夾下新建captcha.php 加入配置信息

 <?php
    // +----------------------------------------------------------------------
    // | Captcha配置文件
    // +----------------------------------------------------------------------

return [
    // 驗(yàn)證碼加密字符串
    'encodeStr' => env('captcha.encode_string', '123456789'),
    //驗(yàn)證碼位數(shù)
    'length' => 5,
    // 驗(yàn)證碼字符集合
    'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',
    //
    'zhSet' => '們以我到他會作時(shí)要?jiǎng)訃a(chǎn)的一是工就年階義發(fā)成部民可出能方進(jìn)在了不和有大這主中人上為來分生對于學(xué)下級地個(gè)用同行面說種過命度革而多子后自社加小機(jī)也經(jīng)力線本電高量長黨得實(shí)家定深法表著水理化爭現(xiàn)所二起政三好十戰(zhàn)無農(nóng)使性前等反體合斗路圖把結(jié)第里正新開論之物從當(dāng)兩些還天資事隊(duì)批點(diǎn)育重其思與間內(nèi)去因件日利相由壓員氣業(yè)代全組數(shù)果期導(dǎo)平各基或月毛然如應(yīng)形想制心樣干都向變關(guān)問比展那它最及外沒看治提五解系林者米群頭意只明四道馬認(rèn)次文通但條較克又公孔領(lǐng)軍流入接席位情運(yùn)器并飛原油放立題質(zhì)指建區(qū)驗(yàn)活眾很教決特此常石強(qiáng)極土少已根共直團(tuán)統(tǒng)式轉(zhuǎn)別造切九你取西持總料連任志觀調(diào)七么山程百報(bào)更見必真保熱委手改管處己將修支識病象幾先老光專什六型具示復(fù)安帶每東增則完風(fēng)回南廣勞輪科北打積車計(jì)給節(jié)做務(wù)被整聯(lián)步類集號列溫裝即毫知軸研單色堅(jiān)據(jù)速防史拉世設(shè)達(dá)爾場織歷花受求傳口斷況采精金界品判參層止邊清至萬確究書術(shù)狀廠須離再目海交權(quán)且兒青才證低越際八試規(guī)斯近注辦布門鐵需走議縣兵固除般引齒千勝細(xì)影濟(jì)白格效置推空配刀葉率述今選養(yǎng)德話查差半敵始片施響收華覺備名紅續(xù)均藥標(biāo)記難存測士身緊液派準(zhǔn)斤角降維板許破述技消底床田勢端感往神便賀村構(gòu)照容非搞亞磨族火段算適講按值美態(tài)黃易彪服早班麥削信排臺聲該擊素張密害侯草何樹肥繼右屬市嚴(yán)徑螺檢左頁抗蘇顯苦英快稱壞移約巴材省黑武培著河帝僅針怎植京助升王眼她抓含苗副雜普談圍食射源例致酸舊卻充足短劃劑宣環(huán)落首尺波承粉踐府魚隨考刻靠夠滿夫失包住促枝局菌桿周護(hù)巖師舉曲春元超負(fù)砂封換太模貧減陽揚(yáng)江析畝木言球朝醫(yī)校古呢稻宋聽唯輸滑站另衛(wèi)字鼓剛寫劉微略范供阿塊某功套友限項(xiàng)余倒卷創(chuàng)律雨讓骨遠(yuǎn)幫初皮播優(yōu)占死毒圈偉季訓(xùn)控激找叫云互跟裂糧粒母練塞鋼頂策雙留誤礎(chǔ)吸阻故寸盾晚絲女散焊功株親院冷徹彈錯(cuò)散商視藝滅版烈零室輕血倍缺厘泵察絕富城沖噴壤簡否柱李望盤磁雄似困鞏益洲脫投送奴側(cè)潤蓋揮距觸星松送獲興獨(dú)官混紀(jì)依未突架寬冬章濕偏紋吃執(zhí)閥礦寨責(zé)熟穩(wěn)奪硬價(jià)努翻奇甲預(yù)職評讀背協(xié)損棉侵灰雖矛厚羅泥辟告卵箱掌氧恩愛停曾溶營終綱孟錢待盡俄縮沙退陳討奮械載胞幼哪剝迫旋征槽倒握擔(dān)仍呀鮮吧卡粗介鉆逐弱腳怕鹽末陰豐霧冠丙街萊貝輻腸付吉滲瑞驚頓擠秒懸姆爛森糖圣凹陶詞遲蠶億矩康遵牧遭幅園腔訂香肉弟屋敏恢忘編印蜂急拿擴(kuò)傷飛露核緣游振操央伍域甚迅輝異序免紙夜鄉(xiāng)久隸缸夾念蘭映溝乙嗎儒殺汽磷艱晶插埃燃?xì)g鐵補(bǔ)咱芽永瓦傾陣碳演威附牙芽永瓦斜灌歐獻(xiàn)順豬洋腐請透司危括脈宜笑若尾束壯暴企菜穗楚漢愈綠拖牛份染既秋遍鍛玉夏療尖殖井費(fèi)州訪吹榮銅沿替滾客召旱悟刺腦措貫藏敢令隙爐殼硫煤迎鑄粘探臨薄旬善??v擇禮愿伏殘雷延煙句純漸耕跑澤慢栽魯赤繁境潮橫掉錐希池?cái)〈倭林^托伙哲懷割擺貢呈勁財(cái)儀沉煉麻罪祖息車穿貨銷齊鼠抽畫飼龍庫守筑房歌寒喜哥洗蝕廢納腹乎錄鏡婦惡脂莊擦險(xiǎn)贊鐘搖典柄辯竹谷賣亂虛橋奧伯趕垂途額壁網(wǎng)截野遺靜謀弄掛課鎮(zhèn)妄盛耐援扎慮鍵歸符慶聚繞摩忙舞遇索顧膠羊湖釘仁音跡碎伸燈避泛亡答勇頻皇柳哈揭甘諾概憲濃島襲誰洪謝炮澆斑訊懂靈蛋閉孩釋乳巨徒私銀伊景坦累勻霉杜樂勒隔彎績招紹胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗堿殊崗?fù)谑先袆《押蘸尚睾馇谀て邱v案刊秧緩?fù)挂奂舸ㄑ╂湞O啦臉戶洛孢勃盟買楊宗焦賽旗濾硅炭股坐蒸凝竟陷槍黎救冒暗洞犯筒您宋弧爆謬涂味津臂障褐陸啊健尊豆拔莫抵桑坡縫警挑污冰柬嘴啥飯塑寄趙喊墊丹渡耳刨虎筆稀昆浪薩茶滴淺擁穴覆倫娘噸浸袖珠雌媽紫戲塔錘震歲貌潔剖牢鋒疑霸閃埔猛訴刷狠忽災(zāi)鬧喬唐漏聞沈熔氯荒莖男凡搶像漿旁玻亦忠唱蒙予紛捕鎖尤乘烏智淡允叛畜俘摸銹掃畢璃寶芯爺鑒秘凈蔣鈣肩騰枯拋軌堂拌爸循誘祝勵(lì)肯酒繩窮塘燥泡袋朗喂鋁軟渠顆慣貿(mào)糞綜墻趨彼屆墨礙啟逆卸航衣孫齡嶺騙休借',
    // 驗(yàn)證碼過期時(shí)間
    'expire' => 1800,
    // 是否使用中文驗(yàn)證碼
    'useZh' => false,
    // 是否使用算術(shù)驗(yàn)證碼
    'math' => false,
    // 是否使用背景圖
    'useImgBg' => false,
    //驗(yàn)證碼字符大小
    'fontSize' => 25,
    // 是否使用混淆曲線
    'useCurve' => true,
    //是否添加雜點(diǎn)
    'useNoise' => true,
    // 驗(yàn)證碼字體 不設(shè)置則隨機(jī)
    'fontttf' => '',
    //背景顏色
    'bg' => [243, 251, 254],
    // 驗(yàn)證碼圖片高度
    'imageH' => 0,
    // 驗(yàn)證碼圖片寬度
    'imageW' => 0,
    //干擾線數(shù)量
    'grx' => 3,
    'loginConfig' => [
        // 是否使用算術(shù)驗(yàn)證碼
        'math' => true,
        //背景顏色
        'bg' => [243, 251, 254],
        //干擾線數(shù)量
        'grx' => 0,
        'imageW' => 267,
        'imageH' => 0,
        'encodeStr' => env('captcha.encode_string', '123456789'),
    ]
];

調(diào)用加密并生成驗(yàn)證碼(在thinkphp的驗(yàn)證碼基礎(chǔ)上修改的)

use captcha\src\facade\Captcha;
public function captcha()
{
    $captcha = Captcha::create('base64', 'loginConfig');
}

調(diào)用解密

    JWT::decode('生成驗(yàn)證碼時(shí)生成的驗(yàn)證碼的值的加密串', env('captcha.encode_string', '123456789'), ['HS256'])

加密包 firebase/php-jwt
原插件地址 https://github.com/top-think/think-captcha/tree/3.0/src

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容