up:: SpringBoot电商项目订单模块前台取消订单接口

说明:

(1) 本篇博客主要内容是:开发【前台:生成支付二维码】接口;

(2) 本篇博客需要注意的点有:

● 支付url的拼凑;

● 利用zxing生成二维码;

● 二维码图片的存储;真实地址与可访问地址的转换;


一:【前台:生成支付二维码】接口介绍;

1.【前台:生成支付二维码】接口,接口文档;

2.【前台:生成支付二维码】接口,在界面上的表现;

● 点击【去支付】按钮,就对应了 【生成支付二维码】接口 和后面将要介绍的 【前台:支付订单】接口


二:正式开发;

1.在OrderController中,创建处理【前台:生成支付二维码】接口的方法:qrcode()方法;

 
         /**
          * 【前台:生成支付二维码】接口;
          * @param orderNo
          * @return
          */
         @ApiOperation("生成支付二维码")
         @PostMapping("/order/qrcode")
         public ApiRestResponse qrcode(@RequestParam("orderNo") String orderNo) {
             String pngAddress = orderService.qrcode(orderNo);
             return ApiRestResponse.success(pngAddress);
         }

说明:

(1) url,请求方式要正确;

(2) 调用在Service层编写的生成二维码的逻辑方法:qrcode()方法;这个方法会返回二维码图片的访问地址;这方法在下一部分介绍;

2.在OrderServiceImpl中,编写根据订单号生成二维码图片的方法:qrcode()方法;

 
     /**
          * 根据订单号,生成对应的支付二维码
          * @param orderNo
          * @return
          */
         @Override
         public String qrcode(String orderNo) {
 
 //首先,因为这儿是非Controller,所以,通过RequestContextHolder获取HttpServletRequest;
             ServletRequestAttributes attributes = (ServletRequestAttributes)  RequestContextHolder.getRequestAttributes();
             HttpServletRequest request = attributes.getRequest();
             //然后,拼凑订单支付url的一部分:“127.0.0.1:8083”;
             String address = ip + ":" + request.getLocalPort();
             //然后,完整拼凑订单支付url:“http://127.0.0.1:8083//pay?orderNo=订单号”;
             //这个就是将要写到二维码中的信息;其实,也是后面的【前台:支付订单】接口的,附带了orderNo参数的完整url
             String payUrl = "http://" + address + "/pay?orderNo=" + orderNo;
 
             //然后,调用我们在QRCodeGenerator工具类中编写的,生成二维码的方法;
             try {
                 QRCodeGenerator.generateQRCode(payUrl, 350, 350, Constant.FILE_UPLOAD_DIR + orderNo + ".webp");
             } catch (WriterException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
 
             //获取二维码图片的访问地址;(PS:仅仅是访问地址,而是访问地址)
             String pngAddress = "http://" + address + "/images/" + orderNo + ".webp";
             //然后,把这个二维码图片的访问地址返回;
             return pngAddress;
         }

说明:

(1) 要明确两点:

●【前台:生成支付二维码】接口,是生成一个二维码图片;具体,就是返回二维码图片的可访问地址,前端拿到这个地址后,就可以在页面上显示二维码图片了;

● 用户扫码后,会获得二维码的内容;二维码的内容,其实就对应了后面要介绍的【前台:支付订单】的url,而且还是包含了订单号的;

(2) 因为,这儿要拼凑【前台:支付订单】的完整url;所以,需要端口号;所以,需要利用RequestContextHolder去获取HttpServletRequest,进而获取端口号;

关于RequestContextHolder,在【附加RequestContextHolder可以实现在非Controller的方法中获取HttpServletRequest】作了介绍;

(3) 自然,要拼凑【前台:支付订单】的完整url,还需要当前应用所部署服务器的url;这儿因为我们目前是开发阶段,也就是我们在测试的时候,服务是部署在本机,所以此时的url就是127.0.0.1;我们在application.properties中配置了url;

(4) 然后,就是调用我们编写的工具方法,去生成二维码图片;

(5) 生成二维码图片的工具类,在下一部分介绍;

(6) 然后,返回二维码图片的可访问地址;主要不是图片在服务器上的真实地址,而是可访问地址;

● 之所以要返回可访问地址,而不是真实地址,主要是出于安全考虑;

● 如有需要,可以参考【SpringBoot电商项目商品模块增加商品接口之图片上传】;

3.编写生成二维码的工具类:QRCodeGenerator类;

(1)首先,我们需要引入商生成二维码的依赖:zxing;

 
             <dependency>
                 <groupId>com.google.zxing</groupId>
                 <artifactId>javase</artifactId>
                 <version>3.3.0</version>
             </dependency>
 

(2) QRCodeGenerator类;

 
     package com.imooc.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 com.imooc.mall.common.Constant;
 
     import java.io.IOException;
     import java.nio.file.FileSystems;
     import java.nio.file.Path;
 
     /**
      * 描述:工具类,根据订单号生成二维码;
      */
     public class QRCodeGenerator {
         /**
          * 生成二维码
          *
          * @param text:二维码中包含的信息
          * @param width:二维码图片的宽度
          * @param height:二维码图片的高度
          * @param filePath:二维码图片的存放位置
          * @throws WriterException
          * @throws IOException
          */
         public static void generateQRCode(String text, int width, int height, String filePath) throws WriterException, IOException {
             //首先,实例化一个QRCodeWriter对象;
             QRCodeWriter qrCodeWriter = new QRCodeWriter();
             //然后,调用encode()方法:生成一个编码后的结果;其中的第二个参数是格式,这儿我们使用QR_CODE;
             //这个方法,返回的结果是一个比特矩阵,即BitMatrix;
             BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
 
             //然后,根据二维码图片将要存放的路径,得到一个Path类型的地址;
             Path path = FileSystems.getDefault().getPath(filePath);
             //利用matrix的工具,把上面的比特矩阵,转成二维码图片;   其中,第二个参数“PNG”,表示二维码图片是.webp格式的;
             MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
         }
 
         public static void main(String[] args) {
             try {
                 generateQRCode("djhfiukhk", 350, 350, "E:/imooc-mall-upload-file/797.webp");
             } catch (WriterException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }

说明:

(1) 具体参考,代码注释即可;

4.在OrderService中,反向生成qrcode()方法的方法声明;


三:测试;

启动项目;



通过,通过二维码解码工具:去解析这个二维码图片中的信息: