【支付系统】java springboot 生成二维码,二维码中文乱码

        支付系统必不可少的就是生成二维码,有时我们会需要将支付链接转换为二维码.用户通过移动设备扫描二维码调起支付. 该篇文章主要使用的是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本身是不包含中文字体,所以在本地开发时是可以正常显示字体,生成环境全变成了乱码.

	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");

猜你喜欢

转载自blog.csdn.net/qq_39078783/article/details/131430372