java生成输出验证码图片,并进行验证的代码

  java生成输出验证码图片,并进行验证的代码。包含生成验证码,servlet输出验证码,验证验证码是否正确的代码。

  此代码可以直接使用。

  需要注意的是,调用验证码图片时,最好在url上加上时间戳参数,可避免刷新时由于缓存而不刷新验证码。

  获取验证码图片,进行验证的 servlet代码



  1. package org.houyong.test.servlet;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. import java.util.Random;

  9. import javax.imageio.ImageIO;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletOutputStream;
  12. import javax.servlet.http.HttpServlet;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import javax.servlet.http.HttpSession;

  16. import org.houyong.test.common.RandomValidateCode;


  17. public class ValidateCode extends HttpServlet {

  18. /**
  19. * Constructor of the object.
  20. */
  21. public ValidateCode() {
  22. super();
  23. }

  24. /**
  25. * Destruction of the servlet. 
  26. */
  27. public void destroy() {
  28. super.destroy(); // Just puts "destroy" string in log
  29. // Put your code here
  30. }

  31. /**
  32. * The doGet method of the servlet. 
  33. *
  34. * This method is called when a form has its tag value method equals to get.

  35. * @param request the request send by the client to the server
  36. * @param response the response send by the server to the client
  37. * @throws ServletException if an error occurred
  38. * @throws IOException if an error occurred
  39. */
  40. public void doGet(HttpServletRequest request, HttpServletResponse response)
  41. throws ServletException, IOException {
  42. this.doPost(request, response);
  43. }

  44. /**
  45. * The doPost method of the servlet. 
  46. *
  47. * This method is called when a form has its tag value method equals to post.

  48. * @param request the request send by the client to the server
  49. * @param response the response send by the server to the client
  50. * @throws ServletException if an error occurred
  51. * @throws IOException if an error occurred
  52. */
  53. public void doPost(HttpServletRequest request, HttpServletResponse response)
  54. throws ServletException, IOException {
  55. String action=request.getParameter("action");
  56. try {
  57. if(action.equals("getImgCode")){
  58. response.setContentType("image/jpeg");
  59.    response.setHeader("Pragma", "No-cache");
  60.    response.setHeader("Cache-Control", "no-cache");
  61.    response.setDateHeader("Expire", 0);
  62.    RandomValidateCode randomValidateCode = new RandomValidateCode();
  63.    try {
  64.        randomValidateCode.getRandcode(request, response);
  65.    } catch (Exception e) {
  66.        e.printStackTrace();
  67.    }
  68.    
  69. }else if(action.equals("validateCode")){
  70. PrintWriter out=null;
  71. try {
  72. request.setCharacterEncoding("utf-8");
  73. response.setContentType("text/html;charset=utf-8");
  74. out = response.getWriter();
  75. String inputCode=request.getParameter("inputCode");
  76. HttpSession session = request.getSession();
  77. String code=(String) session.getAttribute("RANDOMVALIDATECODEKEY");
  78. String returnStr="";
  79. if(inputCode.toUpperCase().equals(code.toUpperCase())){
  80. returnStr="success";
  81. }else{
  82. returnStr="failure";
  83. }
  84. out.print(returnStr);
  85. } catch (Exception e) {
  86. // TODO Auto-generated catch block
  87. e.printStackTrace();
  88. }finally{
  89. out.flush();
  90. out.close();
  91. }
  92. }else{
  93. response.sendRedirect("index.jsp");
  94. }
  95. } catch (Exception e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. response.sendRedirect("index.jsp");
  99. }

  100. }
  101. /**
  102. * Initialization of the servlet. 
  103. *
  104. * @throws ServletException if an error occurs
  105. */
  106. public void init() throws ServletException {
  107. // Put your code here
  108. }

  109. }
复制代码





生成随机验证码图片的java代码


  1. package org.houyong.test.common;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.util.Random;

  7. import javax.imageio.ImageIO;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;

  11. /*生成验证码*/
  12. public class RandomValidateCode {

  13.     public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
  14.     private Random random = new Random();
  15.     private String randString = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";//随机产生的字符串
  16.     
  17.     private int width = 80;//图片宽
  18.     private int height = 26;//图片高
  19.     private int lineSize = 20;//干扰线数量
  20.     private int stringNum = 4;//随机产生字符数量
  21.     /*
  22.      * 获得字体
  23.      */
  24.     private Font getFont(){
  25.         return new Font("Fixedsys",Font.CENTER_BASELINE,18);
  26.     }
  27.     /*
  28.      * 获得颜色
  29.      */
  30.     private Color getRandColor(int fc,int bc){
  31.         if(fc > 255)
  32.             fc = 255;
  33.         if(bc > 255)
  34.             bc = 255;
  35.         int r = fc + random.nextInt(bc-fc-16);
  36.         int g = fc + random.nextInt(bc-fc-14);
  37.         int b = fc + random.nextInt(bc-fc-18);
  38.         return new Color(r,g,b);
  39.     }
  40.     /**
  41.      * 生成随机图片
  42.      */
  43.     public void getRandcode(HttpServletRequest request,
  44.             HttpServletResponse response) {
  45.         HttpSession session = request.getSession();
  46.         //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  47.         BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  48.         Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  49.         g.fillRect(0, 0, width, height);
  50.         g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
  51.         g.setColor(getRandColor(110, 133));
  52.         //绘制干扰线
  53.         for(int i=0;i<=lineSize;i++){
  54.             drowLine(g);
  55.         }
  56.         //绘制随机字符
  57.         String randomString = "";
  58.         for(int i=1;i<=stringNum;i++){
  59.             randomString=drowString(g,randomString,i);
  60.         }
  61.         session.removeAttribute(RANDOMCODEKEY);
  62.         session.setAttribute(RANDOMCODEKEY, randomString);
  63.         //System.out.println(randomString);
  64.         g.dispose();
  65.         try {
  66.             ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         }
  70.     }
  71.     /*
  72.      * 绘制字符串
  73.      */
  74.     private String drowString(Graphics g,String randomString,int i){
  75.         g.setFont(getFont());
  76.         g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
  77.         String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
  78.         randomString +=rand;
  79.         g.translate(random.nextInt(3), random.nextInt(3));
  80.         g.drawString(rand, 13*i, 16);
  81.         return randomString;
  82.     }
  83.     /*
  84.      * 绘制干扰线
  85.      */
  86.     private void drowLine(Graphics g){
  87.         int x = random.nextInt(width);
  88.         int y = random.nextInt(height);
  89.         int xl = random.nextInt(13);
  90.         int yl = random.nextInt(15);
  91.         g.drawLine(x, y, x+xl, y+yl);
  92.     }
  93.     /*
  94.      * 获取随机的字符
  95.      */
  96.     public String getRandomString(int num){
  97.         return String.valueOf(randString.charAt(num));
  98.     }
  99. }
复制代码

  1. package org.houyong.test.servlet;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. import java.util.Random;

  9. import javax.imageio.ImageIO;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletOutputStream;
  12. import javax.servlet.http.HttpServlet;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import javax.servlet.http.HttpSession;

  16. import org.houyong.test.common.RandomValidateCode;


  17. public class ValidateCode extends HttpServlet {

  18. /**
  19. * Constructor of the object.
  20. */
  21. public ValidateCode() {
  22. super();
  23. }

  24. /**
  25. * Destruction of the servlet. 
  26. */
  27. public void destroy() {
  28. super.destroy(); // Just puts "destroy" string in log
  29. // Put your code here
  30. }

  31. /**
  32. * The doGet method of the servlet. 
  33. *
  34. * This method is called when a form has its tag value method equals to get.

  35. * @param request the request send by the client to the server
  36. * @param response the response send by the server to the client
  37. * @throws ServletException if an error occurred
  38. * @throws IOException if an error occurred
  39. */
  40. public void doGet(HttpServletRequest request, HttpServletResponse response)
  41. throws ServletException, IOException {
  42. this.doPost(request, response);
  43. }

  44. /**
  45. * The doPost method of the servlet. 
  46. *
  47. * This method is called when a form has its tag value method equals to post.

  48. * @param request the request send by the client to the server
  49. * @param response the response send by the server to the client
  50. * @throws ServletException if an error occurred
  51. * @throws IOException if an error occurred
  52. */
  53. public void doPost(HttpServletRequest request, HttpServletResponse response)
  54. throws ServletException, IOException {
  55. String action=request.getParameter("action");
  56. try {
  57. if(action.equals("getImgCode")){
  58. response.setContentType("image/jpeg");
  59.    response.setHeader("Pragma", "No-cache");
  60.    response.setHeader("Cache-Control", "no-cache");
  61.    response.setDateHeader("Expire", 0);
  62.    RandomValidateCode randomValidateCode = new RandomValidateCode();
  63.    try {
  64.        randomValidateCode.getRandcode(request, response);
  65.    } catch (Exception e) {
  66.        e.printStackTrace();
  67.    }
  68.    
  69. }else if(action.equals("validateCode")){
  70. PrintWriter out=null;
  71. try {
  72. request.setCharacterEncoding("utf-8");
  73. response.setContentType("text/html;charset=utf-8");
  74. out = response.getWriter();
  75. String inputCode=request.getParameter("inputCode");
  76. HttpSession session = request.getSession();
  77. String code=(String) session.getAttribute("RANDOMVALIDATECODEKEY");
  78. String returnStr="";
  79. if(inputCode.toUpperCase().equals(code.toUpperCase())){
  80. returnStr="success";
  81. }else{
  82. returnStr="failure";
  83. }
  84. out.print(returnStr);
  85. } catch (Exception e) {
  86. // TODO Auto-generated catch block
  87. e.printStackTrace();
  88. }finally{
  89. out.flush();
  90. out.close();
  91. }
  92. }else{
  93. response.sendRedirect("index.jsp");
  94. }
  95. } catch (Exception e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. response.sendRedirect("index.jsp");
  99. }

  100. }
  101. /**
  102. * Initialization of the servlet. 
  103. *
  104. * @throws ServletException if an error occurs
  105. */
  106. public void init() throws ServletException {
  107. // Put your code here
  108. }

  109. }
复制代码





生成随机验证码图片的java代码


  1. package org.houyong.test.common;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.util.Random;

  7. import javax.imageio.ImageIO;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;

  11. /*生成验证码*/
  12. public class RandomValidateCode {

  13.     public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
  14.     private Random random = new Random();
  15.     private String randString = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";//随机产生的字符串
  16.     
  17.     private int width = 80;//图片宽
  18.     private int height = 26;//图片高
  19.     private int lineSize = 20;//干扰线数量
  20.     private int stringNum = 4;//随机产生字符数量
  21.     /*
  22.      * 获得字体
  23.      */
  24.     private Font getFont(){
  25.         return new Font("Fixedsys",Font.CENTER_BASELINE,18);
  26.     }
  27.     /*
  28.      * 获得颜色
  29.      */
  30.     private Color getRandColor(int fc,int bc){
  31.         if(fc > 255)
  32.             fc = 255;
  33.         if(bc > 255)
  34.             bc = 255;
  35.         int r = fc + random.nextInt(bc-fc-16);
  36.         int g = fc + random.nextInt(bc-fc-14);
  37.         int b = fc + random.nextInt(bc-fc-18);
  38.         return new Color(r,g,b);
  39.     }
  40.     /**
  41.      * 生成随机图片
  42.      */
  43.     public void getRandcode(HttpServletRequest request,
  44.             HttpServletResponse response) {
  45.         HttpSession session = request.getSession();
  46.         //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  47.         BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  48.         Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  49.         g.fillRect(0, 0, width, height);
  50.         g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
  51.         g.setColor(getRandColor(110, 133));
  52.         //绘制干扰线
  53.         for(int i=0;i<=lineSize;i++){
  54.             drowLine(g);
  55.         }
  56.         //绘制随机字符
  57.         String randomString = "";
  58.         for(int i=1;i<=stringNum;i++){
  59.             randomString=drowString(g,randomString,i);
  60.         }
  61.         session.removeAttribute(RANDOMCODEKEY);
  62.         session.setAttribute(RANDOMCODEKEY, randomString);
  63.         //System.out.println(randomString);
  64.         g.dispose();
  65.         try {
  66.             ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         }
  70.     }
  71.     /*
  72.      * 绘制字符串
  73.      */
  74.     private String drowString(Graphics g,String randomString,int i){
  75.         g.setFont(getFont());
  76.         g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
  77.         String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
  78.         randomString +=rand;
  79.         g.translate(random.nextInt(3), random.nextInt(3));
  80.         g.drawString(rand, 13*i, 16);
  81.         return randomString;
  82.     }
  83.     /*
  84.      * 绘制干扰线
  85.      */
  86.     private void drowLine(Graphics g){
  87.         int x = random.nextInt(width);
  88.         int y = random.nextInt(height);
  89.         int xl = random.nextInt(13);
  90.         int yl = random.nextInt(15);
  91.         g.drawLine(x, y, x+xl, y+yl);
  92.     }
  93.     /*
  94.      * 获取随机的字符
  95.      */
  96.     public String getRandomString(int num){
  97.         return String.valueOf(randString.charAt(num));
  98.     }
  99. }
复制代码

(文章来源:http://www.nei-mao.com/


  1. package org.houyong.test.servlet;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. import java.util.Random;

  9. import javax.imageio.ImageIO;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletOutputStream;
  12. import javax.servlet.http.HttpServlet;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import javax.servlet.http.HttpSession;

  16. import org.houyong.test.common.RandomValidateCode;


  17. public class ValidateCode extends HttpServlet {

  18. /**
  19. * Constructor of the object.
  20. */
  21. public ValidateCode() {
  22. super();
  23. }

  24. /**
  25. * Destruction of the servlet. 
  26. */
  27. public void destroy() {
  28. super.destroy(); // Just puts "destroy" string in log
  29. // Put your code here
  30. }

  31. /**
  32. * The doGet method of the servlet. 
  33. *
  34. * This method is called when a form has its tag value method equals to get.

  35. * @param request the request send by the client to the server
  36. * @param response the response send by the server to the client
  37. * @throws ServletException if an error occurred
  38. * @throws IOException if an error occurred
  39. */
  40. public void doGet(HttpServletRequest request, HttpServletResponse response)
  41. throws ServletException, IOException {
  42. this.doPost(request, response);
  43. }

  44. /**
  45. * The doPost method of the servlet. 
  46. *
  47. * This method is called when a form has its tag value method equals to post.

  48. * @param request the request send by the client to the server
  49. * @param response the response send by the server to the client
  50. * @throws ServletException if an error occurred
  51. * @throws IOException if an error occurred
  52. */
  53. public void doPost(HttpServletRequest request, HttpServletResponse response)
  54. throws ServletException, IOException {
  55. String action=request.getParameter("action");
  56. try {
  57. if(action.equals("getImgCode")){
  58. response.setContentType("image/jpeg");
  59.    response.setHeader("Pragma", "No-cache");
  60.    response.setHeader("Cache-Control", "no-cache");
  61.    response.setDateHeader("Expire", 0);
  62.    RandomValidateCode randomValidateCode = new RandomValidateCode();
  63.    try {
  64.        randomValidateCode.getRandcode(request, response);
  65.    } catch (Exception e) {
  66.        e.printStackTrace();
  67.    }
  68.    
  69. }else if(action.equals("validateCode")){
  70. PrintWriter out=null;
  71. try {
  72. request.setCharacterEncoding("utf-8");
  73. response.setContentType("text/html;charset=utf-8");
  74. out = response.getWriter();
  75. String inputCode=request.getParameter("inputCode");
  76. HttpSession session = request.getSession();
  77. String code=(String) session.getAttribute("RANDOMVALIDATECODEKEY");
  78. String returnStr="";
  79. if(inputCode.toUpperCase().equals(code.toUpperCase())){
  80. returnStr="success";
  81. }else{
  82. returnStr="failure";
  83. }
  84. out.print(returnStr);
  85. } catch (Exception e) {
  86. // TODO Auto-generated catch block
  87. e.printStackTrace();
  88. }finally{
  89. out.flush();
  90. out.close();
  91. }
  92. }else{
  93. response.sendRedirect("index.jsp");
  94. }
  95. } catch (Exception e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. response.sendRedirect("index.jsp");
  99. }

  100. }
  101. /**
  102. * Initialization of the servlet. 
  103. *
  104. * @throws ServletException if an error occurs
  105. */
  106. public void init() throws ServletException {
  107. // Put your code here
  108. }

  109. }
复制代码





生成随机验证码图片的java代码


  1. package org.houyong.test.common;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.util.Random;

  7. import javax.imageio.ImageIO;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;

  11. /*生成验证码*/
  12. public class RandomValidateCode {

  13.     public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
  14.     private Random random = new Random();
  15.     private String randString = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";//随机产生的字符串
  16.     
  17.     private int width = 80;//图片宽
  18.     private int height = 26;//图片高
  19.     private int lineSize = 20;//干扰线数量
  20.     private int stringNum = 4;//随机产生字符数量
  21.     /*
  22.      * 获得字体
  23.      */
  24.     private Font getFont(){
  25.         return new Font("Fixedsys",Font.CENTER_BASELINE,18);
  26.     }
  27.     /*
  28.      * 获得颜色
  29.      */
  30.     private Color getRandColor(int fc,int bc){
  31.         if(fc > 255)
  32.             fc = 255;
  33.         if(bc > 255)
  34.             bc = 255;
  35.         int r = fc + random.nextInt(bc-fc-16);
  36.         int g = fc + random.nextInt(bc-fc-14);
  37.         int b = fc + random.nextInt(bc-fc-18);
  38.         return new Color(r,g,b);
  39.     }
  40.     /**
  41.      * 生成随机图片
  42.      */
  43.     public void getRandcode(HttpServletRequest request,
  44.             HttpServletResponse response) {
  45.         HttpSession session = request.getSession();
  46.         //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  47.         BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  48.         Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  49.         g.fillRect(0, 0, width, height);
  50.         g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
  51.         g.setColor(getRandColor(110, 133));
  52.         //绘制干扰线
  53.         for(int i=0;i<=lineSize;i++){
  54.             drowLine(g);
  55.         }
  56.         //绘制随机字符
  57.         String randomString = "";
  58.         for(int i=1;i<=stringNum;i++){
  59.             randomString=drowString(g,randomString,i);
  60.         }
  61.         session.removeAttribute(RANDOMCODEKEY);
  62.         session.setAttribute(RANDOMCODEKEY, randomString);
  63.         //System.out.println(randomString);
  64.         g.dispose();
  65.         try {
  66.             ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         }
  70.     }
  71.     /*
  72.      * 绘制字符串
  73.      */
  74.     private String drowString(Graphics g,String randomString,int i){
  75.         g.setFont(getFont());
  76.         g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
  77.         String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
  78.         randomString +=rand;
  79.         g.translate(random.nextInt(3), random.nextInt(3));
  80.         g.drawString(rand, 13*i, 16);
  81.         return randomString;
  82.     }
  83.     /*
  84.      * 绘制干扰线
  85.      */
  86.     private void drowLine(Graphics g){
  87.         int x = random.nextInt(width);
  88.         int y = random.nextInt(height);
  89.         int xl = random.nextInt(13);
  90.         int yl = random.nextInt(15);
  91.         g.drawLine(x, y, x+xl, y+yl);
  92.     }
  93.     /*
  94.      * 获取随机的字符
  95.      */
  96.     public String getRandomString(int num){
  97.         return String.valueOf(randString.charAt(num));
  98.     }
  99. }
复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值