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()方法的方法声明;
三:测试;
启动项目;
通过,通过二维码解码工具:去解析这个二维码图片中的信息: