自定义支付二维码
继:支付宝支付之入门支付
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
application.yml
spring:
thymeleaf:
enabled: true
cache: false
prefix: classpath:/static/html/
suffix: .html
自定义二维码类
package com.sin.demo.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class QRCodeUtil {
private static final int WIDTH = 300;
private static final int HEIGHT = 300;
private static final String FORMAT = "png";
public static void generateQRCode(String text, String filePath) {
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
hints.put(EncodeHintType.MARGIN, 2);
BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
BufferedImage image = toBufferedImage(bitMatrix);
File file = new File(filePath);
ImageIO.write(image, FORMAT, file);
System.out.println("二维码已生成,保存路径:" + filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
private static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
boolean pixel = matrix.get(x, y);
int rgb = pixel ? Color.BLACK.getRGB() : Color.WHITE.getRGB();
image.setRGB(x, y, rgb);
}
}
return image;
}
}
AlipayService.java
package com.sin.demo.service;
import com.alipay.api.AlipayApiException;
public interface AlipayService {
public String getgenerateQrCode(String outTradeNo,double totalAmount,String subject) throws AlipayApiException;
}
AlipayServiceImpl.java
package com.sin.demo.service.impl;
import com.alipay.api.AlipayApiException;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.sin.demo.service.AlipayService;
import com.sin.demo.utils.QRCodeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class AlipayServiceImpl implements AlipayService {
@Value("${alipay.appId}")
private String appId;
@Value("${alipay.privateKey}")
private String privateKey;
@Value("${alipay.publicKey}")
private String publicKey;
@Value("${alipay.gatewayUrl}")
private String gatewayUrl;
@Override
public String getgenerateQrCode(String outTradeNo, double totalAmount, String subject) throws AlipayApiException {
DefaultAlipayClient client = new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", "UTF-8", publicKey, "RSA2");
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizContent(
"{\"out_trade_no\":\"" + outTradeNo + "\","
+ "\"total_amount\":\"" + totalAmount + "\","
+ "\"subject\":\"" + subject + "\"}"
);
AlipayTradePrecreateResponse response = client.execute(request);
if (response.isSuccess()) {
final String qrCode = response.getQrCode();
System.out.println("二维码信息:" + qrCode);
log.info("生成支付二维码成功:{}", response.getBody());
QRCodeUtil.generateQRCode(qrCode,"src/main/resources/static/image/qrcode.png");
return "支付宝支付二维码地址:" + qrCode;
} else {
log.error("生成支付二维码失败:{}", response.getSubMsg());
return "生成支付二维码失败:" + response.getSubMsg();
}
}
}
AlipayController.java
package com.sin.demo.controller;
import com.alipay.api.AlipayApiException;
import com.sin.demo.service.AlipayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class AlipayController {
@Autowired
private AlipayService alipayService;
@ResponseBody
@GetMapping("/generateQrCode/{outTradeNo}/{totalAmount}/{subject}")
public String getGenerateQrCode(@PathVariable("outTradeNo") String outTradeNo,
@PathVariable("totalAmount") double totalAmount,
@PathVariable("subject")String subject) throws AlipayApiException {
String s = alipayService.getgenerateQrCode(outTradeNo, totalAmount, subject);
return s;
}
@GetMapping("/getQrCode")
public String getQrCode(){
return "qrCode";
}
}
qrCode.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>支付页面</title>
</head>
<body>
<h1>支付页面</h1>
<div>
<h2>扫描下方二维码进行支付:</h2>
<img id="qrCode" src="../image/qrcode.png" alt="支付二维码">
</div>
</body>
</html>
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d94ab1766c0c476a80d1e5b37c61f4ee.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1690c7c1de964449949026c727778f24.png)