生成支付二维码

一、需求



二、谷歌Zxing二维码生成工具

1.添加maven依赖,

<!-- 谷歌zxing 二维码 -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.3.3</version>
</dependency>

2.生成二维码的工具类,

package me.zhangbo.mall.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

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();
        //将text的内容进行编码,以二维码的形式进行展现
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
        //Path用于来表示文件路径和文件
        Path path = FileSystems.getDefault().getPath(filePath);
        //保存二维码到指定的路径
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }   
}

3.测试二维码工具类,

public static void main(String[] args) {
        try {
            generateQRCodeImage("Hello World", 350, 350,
                    "C:/Users/JPF/Desktop/QRtest.png");
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4.测试结果,


5.service

@Override
    public String orderQRCode(String orderNo) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        String address = ip + ":" + request.getLocalPort();
        String payUrl = "http://" + address + "/pay?orderNo=" + orderNo;
        try {
            QRCodeGenerator.generateQRCodeImage(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;
    }

6.controller,

@PostMapping("order/qrcode")
    @ApiOperation("生成支付二维码")
    public ApiGeneralResponse orderQRCode(@RequestParam String orderNo) {
        String pngAdress = orderService.orderQRCode(orderNo);
        return ApiGeneralResponse.success(pngAdress);
    }

7.测试结果,

访问图片的URL,即访问服务器上面的图片资源,在本地找到与URL对应的路径,在客户端中进行显示:

二维码解码得到的是订单的支付链接:

二维码图片在服务器本地的实际位置:

8.后端二维码设计时二维码工具类中ip设置为localhost,只能在本机访问本机时使用,所以得到二维码图片之后,进行解析,得到支付连接在本机中访问支付连接进行支付,如果想用手机扫码,可以将ip设置为局域网ip,在同一个局域网中的手机就可以进行扫码,一般在上线后会设置ip为服务器的外网ip,整个互联网都可以进行扫码支付

参考文献

https://blog.csdn.net/qq_33204709/article/details/80979685

posted @ 2021-05-07 22:57  little_mao  阅读(730)  评论(0编辑  收藏  举报