目 录CONTENT

文章目录

SpringBoot 生成二维码

在等晚風吹
2025-03-25 / 0 评论 / 0 点赞 / 10 阅读 / 0 字 / 正在检测是否收录...

SpringBoot 生成二维码

前言

嗨,大家好!今天我们来聊聊一个程序员日常中非常实用的小工具——二维码生成。

最近遇到一个需求,需要根据订单号生成支付二维码并提供访问链接。虽然看起来很简单,但其中涉及的一些细节可能会让人踩坑。因此,本文将使用 Spring Boot + ZXing 来完整梳理二维码生成的实现过程,并提供最佳实践。

1. 配置项目依赖

二维码生成通常需要一个工具库,这里我们选用 ZXing(Zebra Crossing),它功能强大且易于使用。

pom.xml 中添加以下依赖:

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

注意: 建议使用最新稳定版本,以避免兼容性问题。

2. 编写二维码工具类

核心功能是生成二维码图片。我们创建一个 QRCodeGenerator 工具类,该类主要分为两步:

  • 编码内容:将文本信息转换为二维码数据矩阵。
  • 生成图片:将数据矩阵转换为二维码图片并保存。

2.1 代码实现

import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;

public class QRCodeGenerator {
    public static void generateQRCodeImage(String text, int width, int height, String filePath)
            throws WriterException, IOException {
        // 生成二维码矩阵
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
        
        // 指定输出路径
        Path path = FileSystems.getDefault().getPath(filePath);
        
        // 将二维码写入文件
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }
}

2.2 代码解析

  • QRCodeWriter:用于生成二维码数据矩阵。
  • MatrixToImageWriter:用于将矩阵转换为二维码图片并保存。
  • 参数解析
    • text:二维码包含的内容,比如支付链接。
    • width & height:二维码图片的尺寸。
    • filePath:二维码图片的保存路径。

2.3 测试二维码生成

public static void main(String[] args) {
    try {
        QRCodeGenerator.generateQRCodeImage("Hello World", 300, 300, "hello_world.png");
        System.out.println("二维码生成成功!");
    } catch (Exception e) {
        System.err.println("生成二维码失败:" + e.getMessage());
    }
}

运行后,可以在项目目录下看到 hello_world.png,效果妥妥的。

3. Service 层实现

有了工具类后,我们在 Service 层 添加业务逻辑,比如根据订单号生成支付二维码。

3.1 核心逻辑

  • 拼接支付链接
  • 调用工具类生成二维码
  • 返回二维码访问地址

3.2 代码实现

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/api")
public class QRCodeService {
    @Value("${file.upload.ip}")
    private String ip;
    
    @Value("${file.upload.path}")
    private String uploadPath;

    @GetMapping("/qrcode")
    public String qrcode(@RequestParam String orderNo, HttpServletRequest request) {
        try {
            // 拼接支付链接
            String address = ip + ":" + request.getLocalPort();
            String payUrl = "http://" + address + "/pay?orderNo=" + orderNo;
            
            // 生成二维码
            String filePath = uploadPath + orderNo + ".png";
            QRCodeGenerator.generateQRCodeImage(payUrl, 350, 350, filePath);
            
            // 返回二维码图片地址
            return "http://" + address + "/images-dev/" + orderNo + ".png";
        } catch (Exception e) {
            return "二维码生成失败:" + e.getMessage();
        }
    }
}

4. 参数配置

为了方便本地和线上调试,我们使用 Spring Boot 配置文件。

application.properties 配置示例

file.upload.ip=127.0.0.1
file.upload.path=/var/uploads/

这样修改 IP 地址或上传目录时,不需要改代码,直接改配置即可,灵活又优雅。

5. 启动验证

启动 Spring Boot 项目后,在浏览器访问:

http://127.0.0.1:8080/api/qrcode?orderNo=123456

如果成功,返回的地址类似于:

http://127.0.0.1:8080/images-dev/123456.png

6. 常见问题 & 优化建议

6.1 图片路径找不到

确保 uploadPath 目录存在,否则会生成失败。可在启动时检查并创建:

File dir = new File(uploadPath);
if (!dir.exists()) {
    dir.mkdirs();
}

6.2 生成带 Logo 的二维码

可以使用 Java 图像处理库(BufferedImage) 来合并二维码和 Logo,提高美观度。

6.3 局域网访问失败

如果需要让局域网访问,可以动态获取本机 IP 地址:

InetAddress localHost = InetAddress.getLocalHost();
String ip = localHost.getHostAddress();

7. 总结

本文详细介绍了 Spring Boot 结合 ZXing 生成二维码 的完整流程,包括:

  • 配置 ZXing 依赖
  • 编写二维码工具类
  • 实现 API 接口
  • 处理参数配置
  • 常见问题及优化方案

二维码生成功能虽然看似简单,但路径、配置、兼容性等问题不容忽视。希望本文对你有所帮助,Happy Coding!🚀

0

评论区