Hướng dẫn viết hàm tạo Captcha trong Laravel Framework

 captcha

Hôm nay mình xin giới thiệu một hàm PHP tự code dùng để tạo Captcha Image sử dụng trong Laravel Framework.

Trước tiên các bạn cần kiểm tra xem có bật sử dụng Extension GD2 trong php chưa, vì hàm có sử dụng thư viện để tạo Image.

Các bạn tạo một Route đến Controller chứa hàm getCaptcha bên dưới.

public function getCaptcha(Request $request)
{
	$font = public_path('fonts/arial.ttf'); //đường dẫn font chữ trong public
	$name = $request->name?$request->name:'captchacode'; //lấy tên session từ request, mặc định là captchacode
	$lenght = $request->lenght?$request->lenght:'5'; //số ký tự lấy từ request, mặc định là 5
	$width = $request->width?$request->width:'160'; //chiều rộng hình lấy từ request, mặc định là 160
	$height = $request->height?$request->height:'40'; //chiều cao hình lấy từ request, mặc định là 40
	$code = $this->generateCode($lenght); //Hàm lấy ngẫu nhiên theo số ký tự
	$font_size = $height * 0.75;
	$image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');
	$background_color = imagecolorallocate($image, 255, 255, 255);
	$text_color = imagecolorallocate($image, 20, 40, 100);
	$noise_color = imagecolorallocate($image, 255, 255, 255);
	for( $i=0; $i<($width*$height)/3; $i++ ) {
		imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
	}
	for( $i=0; $i<($width*$height)/150; $i++ ) {
		imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
	}
	$textbox = imagettfbbox($font_size, 0, $font, $code);
	$x = ($width - $textbox[4])/2;
	$y = ($height - $textbox[5])/2;
	imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);
	ob_start();
	header('Content-Type: image/jpeg');
	imagejpeg($image);
	imagedestroy($image);
	$image_data = ob_get_contents();
	ob_end_clean();
	Session::put($name, $code); //Lưu session mã captcha để kiểm tra khi submit
	return Response::make($image_data, 200, ['Content-Type' => 'image/jpeg']);
}

public function GenerateCode($str)
{
	$possible = 'ABCDEFGHJKLMNPRSTUVWXYZ23456789'; //Danh sách các chữ cái được lấy ngẫu nhiên
	$code = '';
	$i = 0;
	while ($i < $str) { 
		$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
		$i++;
	}
	return $code;
}

Tại view các bạn chỉ cần gắn Route trong src của thẻ img sẽ có hình ảnh captcha.

Khi submit form các bạn chỉ cần kiểm tra giá trị trường nhập mã captcha với Session::get('captchacode') có trùng khớp với nhau hay không.

Về phần lập trình tạo form và kiểm tra mình không mô tả chi tiết lên đây, để các bạn độc giả tự viết theo ý của các bạn.

Chúc các bạn thành công!

Chia sẻ: Ngụy Kim Hưng