二维码生成

摘要:开发过程中遇到个需求,将指定的信息保存到二维码中,如何完成这一目的呢?下面记录下载SpringBoot项目中生成二维码的步骤

添加依赖

        首先,需要在项目pom.xml中引入依赖zxing;



  com.google.zxing
  javase
  3.3.0

  二维码工具类

         然后,为二维码生成单独编写一个工具类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对象完成一系列编码和保存图片功能。但是有个遗留问题生成是生成二维码后,需要借助浏览器打开链接完成二维码访问,无法直接手机扫码有空再看看能否实现和前端调试一样,手机与电脑可局域网下直接手机扫码。

你可能感兴趣的:(初入后端,java,spring,boot,开发语言)