网站首页 > java教程 正文
最近遇到一个需求:根据订单号生成支付二维码并提供访问链接。看起来简单,但其中的坑还是不少。为了让大家少踩雷,我用 SpringBoot+ZXing 给你完整捋一遍实现过程。
# 效果图
1. 配置好依赖
首先,生成二维码离不开一个工具库。这里我们用的是 ZXing,功能强大且易用。记得在 pom.xml 里加上下面的依赖:
com.google.zxing
javase
3.3.0
版本注意事项:建议用最新稳定版,避免踩到版本兼容性的坑。
2. 编写工具类
工具类是重头戏,核心功能是生成二维码图片。我们写一个 QRCodeGenerator,方法分两步:编码内容、生成图片。
核心方法:generateQRCodeImage
这个方法负责生成二维码并保存为 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,成品效果妥妥的。
3. Service 层实现
工具类搞定后,就轮到业务逻辑上场了。这里的需求是根据订单号生成支付二维码。
方法:qrcode
这个方法逻辑清晰:先拼接支付链接,再调用工具类生成二维码图片,最后返回访问地址。
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();
}
}
}
4. 参数配置
为了支持灵活的本地/线上调试,我们引入配置文件。比如:
# application.properties
file.upload.ip=127.0.0.1
file.upload.path=/var/uploads/
这样写的好处是,切换 IP 地址或上传目录的时候不用改代码,直接改配置就行。省事又优雅!
5. 启动验证
一切搞定,启动项目试试:
- 打开浏览器访问:http://127.0.0.1:8080/api/qrcode?orderNo=123456
- 成功的话会返回类似:http://127.0.0.1:8080/images-dev/123456.png
6. 常见问题 & 优化建议
问题 1:路径找不到
图片保存路径 uploadPath 一定要存在,否则生成会报错。可以在项目启动时检查目录是否存在:
File dir = new File(uploadPath);
if (!dir.exists()) {
dir.mkdirs();
}
问题 2:二维码内容不够多样化
除了支付链接,你可以拓展生成带 Logo 的二维码。这需要先合并二维码图片和 Logo 图片,可以用 Java 图像处理库如 BufferedImage。
问题 3:局域网访问失败
如果本机是局域网环境,可以通过 InetAddress 获取内网 IP:
InetAddress localHost = InetAddress.getLocalHost();
String ip = localHost.getHostAddress();
小结
二维码生成功能虽然简单,但处理细节时一点都不能马虎。像路径、配置、兼容性等问题,如果不注意就很容易踩坑。希望这份教程能帮到大家,码农的快乐,有时候就来自这些小工具!
你有更好的实现方法吗?评论区交个朋友吧!
猜你喜欢
- 2025-04-01 微信小程序扫码登录的实现(微信小程序扫码登录的实现方法)
- 2025-04-01 Java微服务统一授权认证架构设计及实现
- 2025-04-01 自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!
- 2025-04-01 Spring Boot3 扫码登录实现全解析:从基础到实战
- 2025-04-01 走进二维码(QR Code)的世界之初体验
- 2025-04-01 Mac不借助第三方软件实现二维码分享文件
- 2025-04-01 SpringBoot2 二维码扫码登录原理与代码实战详解
- 2025-04-01 x-cmd pkg | qrencode - 命令行生成二维码,小白也能轻松上手!
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)