最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java實現(xiàn)二維碼生成與掃碼驗證功能

 更新時間:2025年08月19日 09:43:33   作者:火皇405  
在現(xiàn)代軟件開發(fā)中,二維碼被廣泛應(yīng)用于各種場景,例如支付、預(yù)約、身份驗證等,本篇文章將以 Java 為例,介紹如何實現(xiàn)二維碼的生成以及掃碼驗證的功能,需要的朋友可以參考下

在現(xiàn)代軟件開發(fā)中,二維碼被廣泛應(yīng)用于各種場景,例如支付、預(yù)約、身份驗證等。本篇文章將以 Java 為例,介紹如何實現(xiàn)二維碼的生成以及掃碼驗證的功能。

項目依賴

在項目中,我們使用了 zxing 庫來生成二維碼,以下是 Maven 依賴:

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

請確保將其添加到項目的 pom.xml 文件中。

一、二維碼生成

首先,我們編寫了一個工具類,用于生成二維碼。

代碼實現(xiàn)

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); // 設(shè)置容錯級別
    hints.put(EncodeHintType.CHARACTER_SET, charSet); // 設(shè)置字符集
    hints.put(EncodeHintType.MARGIN, 1); // 設(shè)置二維碼邊距
 
    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;
}

以上代碼中,調(diào)用 MultiFormatWriter 來生成二維碼圖像,并設(shè)置字符集、容錯級別和邊距。

二維碼生成業(yè)務(wù)邏輯

接下來,我們整合二維碼生成邏輯到具體業(yè)務(wù)中:

private void generateQrCode(Long reservationId) {
    // 生成簽名
    String sign = CreateSignUtil.createSign(vehicleProperties.getCodeUrl(), reservationId);
    System.err.println("生成的簽名 = " + sign);
 
    // 構(gòu)建完整的 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();
    }
}

二、掃碼驗證

生成二維碼后,我們可以通過掃碼驗證來實現(xiàn)數(shù)據(jù)校驗。驗證邏輯主要依賴于簽名比對。

簽名生成方法

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 拼接后生成簽名,用于二維碼驗證時的參數(shù)匹配。

驗證接口

通過 Spring Boot 創(chuàng)建一個驗證接口:

@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("驗證失?。?shù)不匹配。");
    }
}

當客戶端掃碼后,發(fā)送 reservationIdclientSign 到服務(wù)端。服務(wù)端根據(jù)相同的規(guī)則生成簽名并進行比對,從而驗證參數(shù)的正確性。

三、總結(jié)

通過以上步驟,我們實現(xiàn)了一個完整的二維碼生成和驗證功能。其中:

  • 二維碼生成使用了 zxing 庫,并支持自定義內(nèi)容和大小。
  • 驗證功能通過簽名算法實現(xiàn)參數(shù)的有效性校驗,確保了系統(tǒng)的安全性。

到此這篇關(guān)于使用Java實現(xiàn)二維碼生成與掃碼驗證功能的文章就介紹到這了,更多相關(guān)Java二維碼生成與掃碼驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java算法之數(shù)組冒泡排序代碼實例講解

    Java算法之數(shù)組冒泡排序代碼實例講解

    這篇文章主要介紹了Java算法之數(shù)組冒泡排序代碼實例講解,文中用代碼舉例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-03-03
  • Java中注解與原理分析詳解

    Java中注解與原理分析詳解

    注解即標注與解析,在Java的代碼工程中,注解的使用幾乎是無處不在,甚至多到被忽視。本文就來和大家詳細說說Java中注解的原理與實現(xiàn),需要的可以參考一下
    2022-11-11
  • Netty核心功能之數(shù)據(jù)容器ByteBuf詳解

    Netty核心功能之數(shù)據(jù)容器ByteBuf詳解

    這篇文章主要為大家介紹了Netty核心功能之數(shù)據(jù)容器ByteBuf詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 使用 Java 類 實現(xiàn)Http協(xié)議

    使用 Java 類 實現(xiàn)Http協(xié)議

    這篇文章主要介紹了用幾個Java類簡單的實現(xiàn)了Http協(xié)議相關(guān)資料,感興趣的的朋友可以參考下面具體的文章內(nèi)容
    2021-09-09
  • 淺析Alibaba Nacos注冊中心源碼剖析

    淺析Alibaba Nacos注冊中心源碼剖析

    這篇文章主要介紹了淺析Alibaba Nacos注冊中心源碼剖析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • spring boot 日志配置詳解

    spring boot 日志配置詳解

    本篇文章主要介紹了spring boot 日志配置 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Spring Boot攔截器實現(xiàn)步驟及測試實例

    Spring Boot攔截器實現(xiàn)步驟及測試實例

    這篇文章主要介紹了Spring Boot攔截器實現(xiàn)步驟及測試實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Spring中的InitializingBean接口的使用

    Spring中的InitializingBean接口的使用

    這篇文章主要介紹了Spring中的InitializingBean接口的使用,需要的朋友可以參考下
    2018-04-04
  • java abstract class interface之間的區(qū)別介紹

    java abstract class interface之間的區(qū)別介紹

    含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實例對象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法
    2012-11-11
  • java短路邏輯運算符實例用法詳解

    java短路邏輯運算符實例用法詳解

    在本篇文章里小編給大家分享的是一篇關(guān)于java短路邏輯運算符實例用法內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-04-04

最新評論

镇原县| 蓝山县| 凤山市| 龙州县| 应用必备| 汝城县| 渝北区| 崇仁县| 阿拉尔市| 额尔古纳市| 巴楚县| 夏津县| 东乌| 长沙县| 晋城| 夹江县| 望都县| 那曲县| 繁昌县| 铜梁县| 台南市| 含山县| 电白县| 曲水县| 邛崃市| 青阳县| 渑池县| 万州区| 肇东市| 辉县市| 长沙县| 长治市| 包头市| 合肥市| 灌云县| 安福县| 孟州市| 吉木乃县| 滨海县| 屯留县| 台江县|