开发者

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

开发者 https://www.devze.com 2025-08-19 10:40 出处:网络 作者: 火皇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 w编程客栈idth = 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 算法不可用"javascript, e);
        }
    }

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

    验证接口

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

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

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

    三、总结

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

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

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号