查看: 933|回复: 0

[PHP代码] ecshop验证码

发表于 2017-1-11 12:00:02
  1. <?php
  2. //仿制ecshop验证码(四位大写字母和数字、背景)
  3. //处理码值(四位大写字母和数字组成)
  4. //所有的可能的字符集合
  5. $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  6. $chars_len = strlen($chars); //集合长度
  7. //随机选取
  8. $code_len = 4;//验证码长度
  9. $code=''; //验证码值初始化
  10. for($i=0;$i<$code_len;++$i){
  11. //随机取得一个字符下标
  12. $rand_index = mt_rand(0,$chars_len-1);
  13. //利用字符串的下标操做,获得选择的字符
  14. $code .= $chars[$rand_index];
  15. }
  16. //echo $code;
  17. //存储于session中(用于校验)
  18. session_start();
  19. $_SESSION['code'] = $code;
  20. //验证码图像(已知的背景图片)
  21. //处理背景
  22. $bg_file= './captcha/captcha_bg' . mt_rand(1,5). '.jpg';
  23. //依据该图片,创建画布
  24. $image = imagecreatefromjpeg($bg_file);
  25. //简单的将字符串写在画布上的函数(imageString();)
  26. //imageString(画布,字体,位置X, 位置y,字符串内容,颜色);
  27. //字体:imagestring函数,使用的内置字体。由1-5表示。位置由字符串左上角的坐标决定。颜色也是需要预先分配好的。imagecolorallocate();
  28. //分配字体颜色(随机分配黑色或者白色)
  29. if(mt_rand(0,1)==1){
  30. $str_color = imagecolorallocate($image,0,0,0); //黑色
  31. }else{
  32. $str_color = imagecolorallocate($image,255,0xff,255);//白色
  33. }
  34. //内置5号字体
  35. $font = 5;
  36. //位置
  37. //画布大小
  38. $image_w = imagesx($image);
  39. $image_h = imagesy($image);
  40. //获得字体的宽和高
  41. $font_w = imagefontwidth($font);
  42. $font_h = imagefontheight($font);
  43. //获得字符串的宽高
  44. $str_w = $font_w * $code_len;
  45. $str_h = $font_h;
  46. //计算位置
  47. $str_x = ($image_w-$str_w) / 2;
  48. $str_y = ($image_h-$str_h) / 2;
  49. //字符串
  50. imagestring($image,$font,$str_x,$str_y,$code,$str_color);
  51. //输出和销毁画布
  52. header("content-type:image/jpeg");
  53. imagejpeg($image);
  54. imagedestroy($image);
复制代码

封装验证码工具类:

  1. <?php
  2. //验证码工具类(将所有和验证码操作相关的全部封装到该类中)
  3. class Captcha{
  4. /*生成验证码*/
  5. public function makeImage($code_len=4){
  6. //仿制ecshop验证码(四位大写字母和数字、背景)
  7. //处理码值(四位大写字母和数字组成)
  8. //所有的可能的字符集合
  9. $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  10. $chars_len = strlen($chars); //集合长度
  11. //随机选取
  12. $code=''; //验证码值初始化
  13. for($i=0;$i<$code_len;++$i){
  14. //随机取得一个字符下标
  15. $rand_index = mt_rand(0,$chars_len-1);
  16. //利用字符串的下标操做,获得选择的字符
  17. $code .= $chars[$rand_index];
  18. }
  19. //echo $code;
  20. //存储于session中(用于校验)
  21. @session_start();
  22. $_SESSION['code'] = $code;
  23. //验证码图像(已知的背景图片)
  24. //处理背景
  25. $bg_file= TOOL . './captcha/captcha_bg' . mt_rand(1,5). '.jpg';
  26. //依据该图片,创建画布
  27. $image = imagecreatefromjpeg($bg_file);
  28. //简单的将字符串写在画布上的函数(imageString();)
  29. //imageString(画布,字体,位置X, 位置y,字符串内容,颜色);
  30. //字体:imagestring函数,使用的内置字体。由1-5表示。位置由字符串左上角的坐标决定。颜色也是需要预先分配好的。imagecolorallocate();
  31. //分配字体颜色(随机分配黑色或者白色)
  32. if(mt_rand(0,1)==1){
  33. $str_color = imagecolorallocate($image,0,0,0); //黑色
  34. }else{
  35. $str_color = imagecolorallocate($image,255,0xff,255);//白色
  36. }
  37. //内置5号字体
  38. $font = 5;
  39. //位置
  40. //画布大小
  41. $image_w = imagesx($image);
  42. $image_h = imagesy($image);
  43. //获得字体的宽和高
  44. $font_w = imagefontwidth($font);
  45. $font_h = imagefontheight($font);
  46. //获得字符串的宽高
  47. $str_w = $font_w * $code_len;
  48. $str_h = $font_h;
  49. //计算位置
  50. $str_x = ($image_w-$str_w) / 2;
  51. $str_y = ($image_h-$str_h) / 2;
  52. //字符串
  53. imagestring($image,$font,$str_x,$str_y,$code,$str_color);
  54. //输出和销毁画布
  55. header("content-type:image/jpeg");
  56. imagejpeg($image);
  57. imagedestroy($image);
  58. }
  59. }
复制代码



回复

使用道具 举报