欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

項(xiàng)目依賴

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

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

請(qǐng)確保將其添加到項(xiàng)目的 pom.xml 文件中。

一、二維碼生成

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

代碼實(shí)現(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è)置容錯(cuò)級(jí)別
    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è)置字符集、容錯(cuò)級(jí)別和邊距。

二維碼生成業(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();
    }
}

二、掃碼驗(yàn)證

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

簽名生成方法

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

驗(yàn)證接口

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

@GetMapping("/qrcode")
public ResultApi<?> handleQrCode(@RequestParam Long reservationId, @RequestParam String clientSign) {
    // 重新計(jì)算簽名
    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("驗(yàn)證失??!參數(shù)不匹配。");
    }
}

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

三、總結(jié)

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

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

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

相關(guān)文章

  • Java全面細(xì)致講解final的使用

    Java全面細(xì)致講解final的使用

    關(guān)于final關(guān)鍵字,它也是我們一個(gè)經(jīng)常用的關(guān)鍵字,可以修飾在類上、或者修飾在變量、方法上,以此看來定義它的一些不可變性!像我們經(jīng)常使用的String類中,它便是final來修飾的類,并且它的字符數(shù)組也是被final所修飾的。但是一些final的一些細(xì)節(jié)你真的了解過嗎
    2022-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)(單向、雙向鏈表及鏈表反轉(zhuǎn))

    Java數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)(單向、雙向鏈表及鏈表反轉(zhuǎn))

    這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)的相關(guān)資料,其中包括單向鏈表、雙向鏈表及鏈表反轉(zhuǎn)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2021-06-06
  • Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實(shí)現(xiàn)Html分頁

    Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實(shí)現(xiàn)Html分頁

    本文主要介紹了Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實(shí)現(xiàn)Html分頁,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Mybatis?SqlSession案例詳解

    Mybatis?SqlSession案例詳解

    這篇文章主要介紹了Mybatis?SqlSession詳解,本文我們講了如何創(chuàng)建SqlSession的幾個(gè)步驟,最后我們獲得一個(gè)DefaultSqlSession對(duì)象,里面包含了執(zhí)行器Executor和配置對(duì)象Configuration,需要的朋友可以參考下
    2023-04-04
  • MybatisPlus多條件?or()的使用問題小結(jié)

    MybatisPlus多條件?or()的使用問題小結(jié)

    這篇文章主要介紹了MybatisPlus多條件?or()的使用問題小結(jié),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Spring MVC中使用Controller如何進(jìn)行重定向

    Spring MVC中使用Controller如何進(jìn)行重定向

    這篇文章主要介紹了Spring MVC中使用Controller如何進(jìn)行重定向操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java面試必考之如何在項(xiàng)目中優(yōu)雅的拋出異常

    Java面試必考之如何在項(xiàng)目中優(yōu)雅的拋出異常

    這篇文章主要為大家詳細(xì)介紹了Java中的幾種異常關(guān)鍵字和異常類相關(guān)知識(shí),本文比較適合剛?cè)肟覬ava的小白以及準(zhǔn)備秋招的大佬閱讀,需要的可以收藏一下
    2023-06-06
  • java中Optional的使用詳細(xì)解析

    java中Optional的使用詳細(xì)解析

    這篇文章主要介紹了java新特性之Optional的詳細(xì)解析,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解

    springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解

    這篇文章主要為大家介紹了springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java日期工具類操作字符串Date和LocalDate互轉(zhuǎn)

    Java日期工具類操作字符串Date和LocalDate互轉(zhuǎn)

    這篇文章主要介紹了Java日期工具類操作字符串Date和LocalDate互轉(zhuǎn),文章首先通過需要先引入坐標(biāo)展開主題的相關(guān)內(nèi)容介紹,需要的朋友可以參一下
    2022-06-06

最新評(píng)論