java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java二维码生成与扫码验证

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

作者:火皇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 到服务端。服务端根据相同的规则生成签名并进行比对,从而验证参数的正确性。

三、总结

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

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

您可能感兴趣的文章:
阅读全文