使用Java实现二维码生成与扫码验证功能

 更新时间:2025年08月19日 09:43:33   作者:火皇405  
在现代软件开发中,二维码被广泛应用于各种场景,例如支付、预约、身份验证等,本篇文章将以 Java 为例,介绍如何实现二维码的生成以及扫码验证的功能,需要的朋友可以参考下

在现代软件开发中,二维码被广泛应用于各种场景,例如支付、预约、身份验证等。本篇文章将以 Java 为例,介绍如何实现二维码的生成以及扫码验证的功能。

项目依赖

在项目中,我们使用了 zxing 库来生成二维码,以下是 Maven 依赖:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.3.3</version>
</dependency>

请确保将其添加到项目的 pom.xml 文件中。

一、二维码生成

首先,我们编写了一个工具类,用于生成二维码。

代码实现

public static BufferedImage createImage(String charSet, String content, int qrWidth, int qrHeight) {
    Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 设置容错级别
    hints.put(EncodeHintType.CHARACTER_SET, charSet); // 设置字符集
    hints.put(EncodeHintType.MARGIN, 1); // 设置二维码边距
 
    BitMatrix bitMatrix;
    try {
        bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, qrWidth, qrHeight, hints);
    } catch (WriterException e) {
        throw new RuntimeException("生成二维码失败", e);
    }
 
    int width = bitMatrix.getWidth();
    int height = bitMatrix.getHeight();
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
        }
    }
 
    return image;
}

以上代码中,调用 MultiFormatWriter 来生成二维码图像,并设置字符集、容错级别和边距。

二维码生成业务逻辑

接下来,我们整合二维码生成逻辑到具体业务中:

private void generateQrCode(Long reservationId) {
    // 生成签名
    String sign = CreateSignUtil.createSign(vehicleProperties.getCodeUrl(), reservationId);
    System.err.println("生成的签名 = " + sign);
 
    // 构建完整的 URL
    String url = vehicleProperties.getCodeUrl() + reservationId;
    System.err.println("生成的URL: " + url);
 
    // 生成二维码
    BufferedImage bufferedImage = QrCodeUtil.createImage("utf-8", url, 300, 300);
 
    // 上传二维码
    try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
        ImageIO.write(bufferedImage, "jpg", outputStream);
        InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        minioService.uploadFile(CustomConstant.BUCKET_NAME_QRCODE, inputStream, "image/jpg", reservationId, CustomConstant.NUM_100_LONG, "QrCode.jpg", CustomConstant.FILE_TYPE_QRCODE);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

二、扫码验证

生成二维码后,我们可以通过扫码验证来实现数据校验。验证逻辑主要依赖于签名比对。

签名生成方法

public static String createSign(String secretKey, Long subId) {
    String text = secretKey + subId + secretKey;
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(text.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("MD5 算法不可用", e);
    }
}

该方法通过将 secretKeysubId 拼接后生成签名,用于二维码验证时的参数匹配。

验证接口

通过 Spring Boot 创建一个验证接口:

@GetMapping("/qrcode")
public ResultApi<?> handleQrCode(@RequestParam Long reservationId, @RequestParam String clientSign) {
    // 重新计算签名
    String serverSign = CreateSignUtil.createSign(vehicleProperties.getCodeUrl(), reservationId);
 
    // 比较签名
    if (serverSign.equals(clientSign)) {
        GroundReservationVO.ReservationDetail byId = groundReservationService.getById(reservationId);
        return ResultApi.success("查询成功", byId);
    } else {
        return ResultApi.success("验证失败!参数不匹配。");
    }
}

当客户端扫码后,发送 reservationIdclientSign 到服务端。服务端根据相同的规则生成签名并进行比对,从而验证参数的正确性。

三、总结

通过以上步骤,我们实现了一个完整的二维码生成和验证功能。其中:

  • 二维码生成使用了 zxing 库,并支持自定义内容和大小。
  • 验证功能通过签名算法实现参数的有效性校验,确保了系统的安全性。

到此这篇关于使用Java实现二维码生成与扫码验证功能的文章就介绍到这了,更多相关Java二维码生成与扫码验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java算法之数组冒泡排序代码实例讲解

    Java算法之数组冒泡排序代码实例讲解

    这篇文章主要介绍了Java算法之数组冒泡排序代码实例讲解,文中用代码举例讲解的很清晰,有感兴趣的同学可以研究下
    2021-03-03
  • Java中注解与原理分析详解

    Java中注解与原理分析详解

    注解即标注与解析,在Java的代码工程中,注解的使用几乎是无处不在,甚至多到被忽视。本文就来和大家详细说说Java中注解的原理与实现,需要的可以参考一下
    2022-11-11
  • Netty核心功能之数据容器ByteBuf详解

    Netty核心功能之数据容器ByteBuf详解

    这篇文章主要为大家介绍了Netty核心功能之数据容器ByteBuf详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 使用 Java 类 实现Http协议

    使用 Java 类 实现Http协议

    这篇文章主要介绍了用几个Java类简单的实现了Http协议相关资料,感兴趣的的朋友可以参考下面具体的文章内容
    2021-09-09
  • 浅析Alibaba Nacos注册中心源码剖析

    浅析Alibaba Nacos注册中心源码剖析

    这篇文章主要介绍了浅析Alibaba Nacos注册中心源码剖析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • spring boot 日志配置详解

    spring boot 日志配置详解

    本篇文章主要介绍了spring boot 日志配置 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Spring Boot拦截器实现步骤及测试实例

    Spring Boot拦截器实现步骤及测试实例

    这篇文章主要介绍了Spring Boot拦截器实现步骤及测试实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring中的InitializingBean接口的使用

    Spring中的InitializingBean接口的使用

    这篇文章主要介绍了Spring中的InitializingBean接口的使用,需要的朋友可以参考下
    2018-04-04
  • java abstract class interface之间的区别介绍

    java abstract class interface之间的区别介绍

    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象,abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法
    2012-11-11
  • java短路逻辑运算符实例用法详解

    java短路逻辑运算符实例用法详解

    在本篇文章里小编给大家分享的是一篇关于java短路逻辑运算符实例用法内容,有需要的朋友们可以学习参考下。
    2021-04-04

最新评论