SpringBoot 生成二维码

360影视 2025-01-17 08:39 2

摘要:最近遇到一个需求:根据订单号生成支付二维码并提供访问链接。看起来简单,但其中的坑还是不少。为了让大家少踩雷,我用 SpringBoot+ZXing 给你完整捋一遍实现过程。

最近遇到一个需求:根据订单号生成支付二维码并提供访问链接。看起来简单,但其中的坑还是不少。为了让大家少踩雷,我用 SpringBoot+ZXing 给你完整捋一遍实现过程。

# 效果图

首先,生成二维码离不开一个工具库。这里我们用的是 ZXing,功能强大且易用。记得在 pom.xml 里加上下面的依赖:

com.google.zxing Javase 3.3.0

⚠️ 版本注意事项:建议用最新稳定版,避免踩到版本兼容性的坑。

工具类是重头戏,核心功能是生成二维码图片。我们写一个 QRCodeGenerator,方法分两步:编码内容、生成图片。

这个方法负责生成二维码并保存为 PNG 图片。代码如下:

import com.google.zxing.*;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;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); }}**QRCodeWriter**:用来生成二维码矩阵。**MatrixToImageWriter**:将矩阵转化为图片并保存。参数解析:text:二维码包含的内容,比如支付链接。width 和 height:二维码图片尺寸。filePath:保存路径。

测试一下,给个 “Hello World” 内容生成二维码:

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,成品效果妥妥的。

工具类搞定后,就轮到业务逻辑上场了。这里的需求是根据订单号生成支付二维码。

这个方法逻辑清晰:先拼接支付链接,再调用工具类生成二维码图片,最后返回访问地址。

import org.springframework.beans.factory.annotation.Value;@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; } }}

为了支持灵活的本地/线上调试,我们引入配置文件。比如:

# application.propertiesfile.upload.ip=127.0.0.1file.upload.path=/var/uploads/

这样写的好处是,切换 IP 地址或上传目录的时候不用改代码,直接改配置就行。省事又优雅!✨

一切搞定,启动项目试试:

打开浏览器访问:http://127.0.0.1:8080/api/qrcode?orderNo=123456成功的话会返回类似:http://127.0.0.1:8080/images-dev/123456.png

图片保存路径 uploadPath 一定要存在,否则生成会报错。可以在项目启动时检查目录是否存在:

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

除了支付链接,你可以拓展生成带 Logo 的二维码。这需要先合并二维码图片和 Logo 图片,可以用 Java 图像处理库如 BufferedImage。

如果本机是局域网环境,可以通过 InetAddress 获取内网 IP:

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

二维码生成功能虽然简单,但处理细节时一点都不能马虎。像路径、配置、兼容性等问题,如果不注意就很容易踩坑。希望这份教程能帮到大家,码农的快乐,有时候就来自这些小工具!

你有更好的实现方法吗?评论区交个朋友吧!

来源:散文随风想

相关推荐