使用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);
}
}該方法通過將 secretKey 和 subId 拼接后生成簽名,用于二維碼驗證時的參數(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ā)送 reservationId 和 clientSign 到服務(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)文章
Netty核心功能之數(shù)據(jù)容器ByteBuf詳解
這篇文章主要為大家介紹了Netty核心功能之數(shù)據(jù)容器ByteBuf詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
java abstract class interface之間的區(qū)別介紹
含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實例對象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法2012-11-11

