一、需求
二、谷歌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,整個互聯網都可以進行掃碼支付