支付系统必不可少的就是生成二维码,有时我们会需要将支付链接转换为二维码.用户通过移动设备扫描二维码调起支付. 该篇文章主要使用的是hutool自带的二维码生成功能.
1. 引入依赖(hutool 可以按需引入这里就直接使用all了)
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.19</version>
</dependency>
2. hutool的官方已经有很详细的生成方式,可以满足大部分的要求,如下
// 生成指定url对应的二维码到文件,宽和高都是300像素
QrCodeUtil.generate("https://hutool.cn/", 300, 300, FileUtil.file("d:/qrcode.jpg"));
3. 在二维码上添加文字和图片,有时我们会需要在二维码上添加一些logo或者提醒文字,这就需要我们引入字体和图片.因为项目一般都是部署在linux系统,以centos为例,centos本身是不包含中文字体,所以在本地开发时是可以正常显示字体,生成环境全变成了乱码.
- 创建字体和图片对象(字体文件可以在网上或者window计算机中获取),这里有个坑,可以查看我另一篇文章解决Java 自定义字体产生大量+~JF***.tmp文件导致硬盘爆满
private static final String FONT_PATH = "simhei.ttf";
private static Font font;
private static BufferedImage read;
static {
ClassPathResource resource = new ClassPathResource("logo_small.png");
try (InputStream inputStream = resource.getInputStream()) {
font = Font.createFont(Font.TRUETYPE_FONT, new File(FONT_PATH)).deriveFont(20F);
read = ImgUtil.read(inputStream);
} catch (FontFormatException | IOException e) {
log.error("获取字体文件失败", e);
}
}
- 生成二维码
private static String createQRCode(String url) {
// generateFilePath为自定义方法,用于生成二维码存放路径,和二维码线上访问地址
// 主要根据业务编写自己的方法
Dict dict = FileUtils.generateFilePath(FileDirectoryEnum.QRCODE, "jpg");
String imgUrl = dict.getStr("url");
String path = dict.getStr("path");
// 生成二维码,
//参数1 转换为二维码的内容
//参数2 添加二维码中间的小图
//参数3 二维码存放位置
File code = QrCodeUtil.generate(
url,
QrConfig.create().setImg(read),
FileUtil.file(path)
);
// 在图片上添加文字,Imgutil为hutool的工具类
ImgUtil.pressText(
code,
code,
"谨防被骗", Color.RED,
font,
0,
-60,
1f
);
return imgUrl;
}
上述代码使用了hutool的ImgUtil工具类,参数含义如下
完整代码
private static final String FONT_PATH = "simhei.ttf";
private static Font font;
private static BufferedImage read;
static {
ClassPathResource resource = new ClassPathResource("logo_small.png");
try (InputStream inputStream = resource.getInputStream()) {
font = Font.createFont(Font.TRUETYPE_FONT, new File(FONT_PATH)).deriveFont(20F);
read = ImgUtil.read(inputStream);
} catch (FontFormatException | IOException e) {
log.error("获取字体文件失败", e);
}
}
private static String createQRCode(String url) {
Dict dict = FileUtils.generateFilePath(FileDirectoryEnum.QRCODE, "jpg");
String imgUrl = dict.getStr("url");
String path = dict.getStr("path");
File code = QrCodeUtil.generate(
url,
QrConfig.create().setImg(read),
FileUtil.file(path)
);
ImgUtil.pressText(
code,
code,
"谨防被骗", Color.RED,
font,
0,
-60,
1f
);
return imgUrl;
}
调用方式
createQRCode("https://blog.csdn.net/qq_39078783");
样例