摘要:开发过程中遇到个需求,将指定的信息保存到二维码中,如何完成这一目的呢?下面记录下载SpringBoot项目中生成二维码的步骤
添加依赖
首先,需要在项目pom.xml中引入依赖zxing;
<!-- ZXing 是一个开源的条码/二维码处理库,可以用于生成和解析各种格式的条码和二维码。
javase模块是ZXing库的一个子模块,提供了在Java SE环境中使用 ZXing 的功能。
-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
二维码工具类
然后,为二维码生成单独编写一个工具类QRCodeGenerator.java。QRCodeGenerator类包含一个静态方法generatorQRCodeImage,用于生成二维码图像。
- generatorQRCodeImage方法接受四个参数:要编码的文本、二维码的宽度和高度、二维码图像写入路径;
- 在方法中,先创建了一个 QRCodeWriter 对象,用于将字符串编码为二维码图像;
- 然后,通过 QRCodeWriter.encode() 方法将文本内容编码为 QRCode 的 BitMatrix 矩阵;
- 接着,创建一个 Path 对象,用于指定二维码图片的保存路径;
- 最后,通过MatrixToImageWriter.writeToPath()方法将BitMatrix矩阵写入到指定路径的PNG文件中。
工具类中增加测试方法,测试代码直接运行会产生二维码图片,可使用网站在线生成 QR Code (oschina.net) ,解码二维码中信息是否为“Hello World”。具体实现过程如下
/**
* 描述: 生成二维码工具
*/
public class QRCodeGenerator {
public static void generatorQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {
// 实例化qrCodeWriter
QRCodeWriter qrCodeWriter = new QRCodeWriter();
// 调用encode方法生成编码后的结果为BitMatrix 矩阵
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
// 传入String拿到对应的地址
Path path = FileSystems.getDefault().getPath(filePath);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
}
// 调试方法: 调用generatorQRCodeImage方法,生成一个包含文本"Hello World"的二维码图像,并将其保存在一个PNG文件中。
public static void main(String[] args) {
try {
// 测试类中未使用Spring的能力注入地址,直接写了本地的路径
generatorQRCodeImage("Hello World", 350, 350, "/Users/cainiao/Desktop/Learn/imooc-mall-prepare-static/QRTesr.png");
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
应用工具类生成二维码
下面将完成一个方法,利用工具类QRCodeGenerator.java将目标字符串(此处payUrl)生成二维码,并返回二维码图片访问地址,具体过程
- 首先,通过RequestContextHolder.getRequestAttributes()获取当前请求的属性。
- 然后,将请求对象转换为ServletRequestAttributes对象,以便获取请求相关信息。
- 通过ServletRequestAttributes.getRequest()获取HttpServletRequest对象,从中获取本地端口号和IP地址(需要单独配置)。
- 构建一个包含IP地址和本地端口号的字符串,命名为address。
- 根据传入的 orderNo 参数拼接出二维码的链接地址 payUrl,格式为 "http://address/pay?orderNo=xx"。
- 调用QRCodeGenerator.generatorQRCodeImage()方法生成二维码图片,并保存到指定路径下的文件中。
- 将生成的二维码图片的地址拼接为完整的URL地址,并命名为pngAddress。
- 返回 pngAddress,即生成的二维码图片的地址。
@Value("${file.uplod.ip}")
String ip;
public String qrcode(String orderNo) {
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 此处,由于应用部署后IP进行多层,不能直接通过request获取,因此需要配置,并在此处导入即可
String address = ip + ":" + request.getLocalPort();
// try {
// // 获取本机电脑的局域网IP,复杂网络环境下此方法获取的IP并不准确,调试使用,部署前删除
// ip = InetAddress.getLocalHost().getHostAddress();
// } catch (UnknownHostException e) {
// e.printStackTrace();
// }
// 生成二维码的字符串
String payUrl = "http://" + address + "/pay?orderNo=" + orderNo;
try {
QRCodeGenerator.generatorQRCodeImage(payUrl, 350, 350, Constant.FILE_UPLOAD_DIR + orderNo + ".png");
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String pngAddress = "http://" + address + "/images/" + orderNo + ".png";
return pngAddress;
}
这样获取了二维码的地址后,就可以对二维码进一步进行处理,例如,将二维码展示,扫码访问后结合数据库操作,完成扫码支付等功能。
总结
上述,二维码生成主要借助QRCodeWriter对象完成一系列编码和保存图片功能。但是有个遗留问题生成是生成二维码后,需要借助浏览器打开链接完成二维码访问,无法直接手机扫码有空再看看能否实现和前端调试一样,手机与电脑可局域网下直接手机扫码。