支付宝支付之SpringBoot整合支付宝创建自定义支付二维码

文章目录

  • 自定义支付二维码
    • pom.xml
    • application.yml
    • 自定义二维码类
    • AlipayService.java
    • AlipayServiceImpl.java
    • AlipayController.java
    • qrCode.html

自定义支付二维码

继:SpringBoot支付入门

pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency><dependency><!--ZXing(Zebra Crossing)核心库,提供了二维码生成和解析的基本功能--><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version>
</dependency>
<!--ZXing 的 JavaSE 扩展库,提供了在 Java 环境中生成和解析二维码的更高级功能,例如将二维码保存为图像文件、从图像文件解析二维码等。
-->
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version>
</dependency>

application.yml

spring:thymeleaf:enabled: true  # 启用Thymeleafcache: false    # 禁用Thymeleaf缓存,方便开发时查看修改的效果prefix: classpath:/static/html/  # Thymeleaf模板文件所在目录,默认classpath:/static/html/suffix: .html   # Thymeleaf模板文件的后缀,默认为.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;/*** @createTime 2024/4/17 10:07* @createAuthor SIN* @use 二维码创建工具类*/
public class QRCodeUtil {private static final int WIDTH = 300; // 二维码宽度private static final int HEIGHT = 300; // 二维码高度private static final String FORMAT = "png"; // 二维码格式/*** 生成二维码* @param text 二维码内容,一定是互联网内容,本地是无法扫的到的* @param filePath 二维码生成地址*/public static void generateQRCode(String text, String filePath) {try {// 创建一个存储编码参数的 HashMap 对象Map<EncodeHintType, Object> hints = new HashMap<>();// 设置字符集为 UTF-8hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 设置容错级别为 Mhints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 设置边距为 2hints.put(EncodeHintType.MARGIN, 2);// 使用 MultiFormatWriter 类将指定文本 text 编码为二维码矩阵BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);// 将二维码矩阵转换为 BufferedImage 对象BufferedImage image = toBufferedImage(bitMatrix);// 创建一个表示目标文件的 File 对象File file = new File(filePath);// 将 BufferedImage 对象保存为图像文件ImageIO.write(image, FORMAT, file);System.out.println("二维码已生成,保存路径:" + filePath);} catch (Exception e) {e.printStackTrace();}}/*** 将二维码矩阵转为可视化图像* @param matrix* @return 生成BufferdImage对象,获得二维码的可视化图像*/private static BufferedImage toBufferedImage(BitMatrix matrix) {// 获取二维码的宽和高int width = matrix.getWidth();int height = matrix.getHeight();// 创建一个新的BufferedImage对象,指定宽和高,已经颜色类型BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {// 获取当前坐标 (x, y) 的像素值(true 表示黑色,false 表示白色)boolean pixel = matrix.get(x, y);// 根据像素值设置对应位置的 RGB 值,将黑色或白色像素点绘制到 BufferedImage 对象中int rgb = pixel ? Color.BLACK.getRGB() : Color.WHITE.getRGB();// 设置x,y坐标和颜色image.setRGB(x, y, rgb);}}// 返回生成的 BufferedImage 对象return image;}
}

AlipayService.java

package com.sin.demo.service;import com.alipay.api.AlipayApiException;/*** @createTime 2024/4/17 8:20* @createAuthor SIN* @use*/
public interface AlipayService {/*** 创建支付订单* @param outTradeNo 订单号* @param totalAmount 支付金额* @param subject 支付标题* @return 返回二维码信息* @throws AlipayApiException*/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;/*** @createTime 2024/4/17 8:23* @createAuthor SIN* @use*/
@Service
@Slf4j
public class AlipayServiceImpl implements AlipayService {// 从配置文件中获取参数值@Value("${alipay.appId}")private String appId; // 支付宝应用ID@Value("${alipay.privateKey}")private String privateKey; // 商户应用私钥@Value("${alipay.publicKey}")private String publicKey; // 支付宝公钥@Value("${alipay.gatewayUrl}")private String gatewayUrl; // 支付宝网关URL@Overridepublic 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;/*** @createTime 2024/4/17 8:28* @createAuthor SIN* @use*/
@Controller
public class AlipayController {@Autowiredprivate 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>

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端开发该不该“跳槽”到鸿蒙?

前言 面对互联网行业的激烈竞争&#xff0c;许多人都深感2023年已是不易&#xff0c;而展望2024年&#xff0c;似乎更是难上加难。这一切的根源&#xff0c;皆因行业多年发展后&#xff0c;人才市场的饱和现象愈发严重。那么&#xff0c;作为前端开发者&#xff0c;我们究竟该…

【尚硅谷】Git与GitLab的企业实战 学习笔记

目录 第1章 Git概述 1. 何为版本控制 2. 为什么需要版本控制 3. 版本控制工具 4. Git简史 5. Git工作机制 6. Git和代码托管中心 第2章 Git安装 第3章 Git常用命令 1. 设置用户签名 1.1 基本语法 1.2 案例实操 2. 初始化本地库 2.1 基本语法 2.2 案例实操 3. 查…

【运输层】TCP 的流量控制和拥塞控制

目录 1、流量控制 2、TCP 的拥塞控制 &#xff08;1&#xff09;拥塞控制的原理 &#xff08;2&#xff09;拥塞控制的具体方法 1、流量控制 一般说来&#xff0c;我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快&#xff0c;接收方就可能来不及接收&#x…

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机 文章目录 Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机1.安装virtualbox2.下载Window.iso文件并载入3.问题解决3.1 Kernel driver not installed (rc-1908)3.2 VT-x is disabled in the BIOS for all CPU modes 4.安装Wi…

带你实现一个github注册页面的星空顶

带你实现一个github注册页面的星空顶 github的注册页面可以说是非常的好看&#xff0c;如果没有看过的可以看下面的图片&#xff1a; 那么要如何实现下面的这个效果呢&#xff1f; 首先我们研究一下他的这个官网 首先我看到的后面的这个背景&#xff0c;是不是一个纯色的背景…

Linux安装Docker完整教程及配置阿里云镜像源

官网文档地址 安装方法 1、查看服务器内核版本 Docker要求CentOS系统的内核版本高于3.10 uname -r #通过 uname -r 命令查看你当前的内核版本2、首先卸载已安装的Docker&#xff08;如果有&#xff09; 2.1 确保yum包更新到最新 yum update2.2 清除原有的docker&#xff0c…

02_Fixture定位,Caliper卡尺工具,几何学工具

Fixture定位工具 需求: 测量工件的尺寸 使用Caliper(卡尺)工具 这个时候需要借助Fixture工具 VisionPro中的图像空间 “” 图像的当前空间&#xff0c;即CogImage中的“SelectedSpaceName”表示的名字空间 “#” 像素空间&#xff0c;即坐标原点为图片左上角的坐标空间&am…

TCP/IP协议—MQTT

TCP/IP协议—MQTT MQTT协议MQTT协议特点MQTT通信流程MQTT协议概念 MQTT报文固定报头可变报头有效载荷 MQTT协议 消息队列遥测传输&#xff08;Message Queuing Telemetry Transport&#xff0c;MQTT&#xff09;是一个基于客户端-服务器的消息发布/订阅传输协议。它的设计思想…

windows上安装make

下载地址 https://sourceforge.net/projects/gnuwin32/ 点击框中的下载&#xff0c;下载后安装。把安装路径添加到环境变量 PATH 中. 打开cmd&#xff0c;验证是否生效 安装包下载地址&#xff1a; https://download.csdn.net/download/qq_36314864/89163210

python读取DBF数据

DBF文件通常是由数据库软件&#xff08;如FoxPro或dBASE&#xff09;创建的数据库文件。Python中并没有直接读取DBF文件的内置库&#xff0c;但你可以使用第三方库如dbfread来读取DBF文件。 首先&#xff0c;你需要安装dbfread库。你可以使用pip来安装&#xff1a; pip insta…

【人工智能书籍分享】从ChatGPT到AIGC:人工智能重塑千行百业

今天又来给大家推荐一本人工智能方面的书籍<从ChatGPT到AIGC&#xff1a;人工智能重塑千行百业>。本书介绍了ChatGPT的前世今生&#xff0c;重点聚焦普通人如何使用ChatGPT获得工作和生活效率的提升&#xff0c;各行各业如何通过ChatGPT来改变自己的赛道状态。 使用Chat…

免费SSL证书的不香吗?四步轻松搞定

随着技术的发展和普及&#xff0c;现在有许多机构提供免费的SSL证书&#xff0c;使得即便是拥有有限预算的网站也能够享受到基本的加密服务。几乎所有的公有云服务商都提供了免费版ssl&#xff0c;如阿里云曾推出免费型DV SSL证书&#xff0c;腾讯云和百度云也有类似的免费SSL证…

平衡车设计——硬件篇

在本文开始之前我忍不住想吐槽一个事情&#xff0c;就在前两天晚上&#xff0c;我满意地装完平衡车&#xff0c;给他取了个名字叫瓦力&#xff08;没错&#xff0c;就是机器人总动员里的瓦力&#xff09;&#xff0c;他长这个样子。 把他放到桌子上放了一夜&#xff0c;第二天早…

ffmpeg buffer管理

除了内存管理之外&#xff0c;数据的前后级流转也涉及到buffer管理. 个人觉得ffmpeg里面的buffer管理实现极为巧妙&#xff0c;也很值得借鉴. 概述 重要数据结构 AVBufferPool 在libavutil/buffer_internal.h中定义&#xff0c;为内部数据结构&#xff0c;不能在应用程序中直…

基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例

目录 前言 一、信息网站介绍 1、网站介绍 2、 地震历史信息 3、 历史信息接口分析 二、XxlCrawler组件 1、关于XxlCrawler 2、核心概念介绍 三、实际信息爬取 1、新建maven项目 2、新建model层对象 3、实际爬取 总结 前言 如今&#xff0c;只要谈起网络信息爬取也就…

TCP/IP协议—HTTP

TCP/IP协议—HTTP HTTP协议HTTP通讯特点HTTP通讯流程 HTTP请求报文请求方法 HTTP应答报文状态码 HTTP协议 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一种请求-响应的协议&#xff0c;用户可以通过HTTP向服务器上传、下载数据。HT…

Java调用WebServices接口

当拿到一个WebServices接口时&#xff0c;首先用接口测试工具调用一下接口&#xff0c;看是否可以正常发送请求和获取返回接口&#xff0c;确保接口是没有问题的&#xff0c;可以用SoapUI工具进行测试。 下面以一个免费的天气预报接口为例&#xff0c;记录整个接口的调用过程。…

初学python记录:力扣2007. 从双倍数组中还原原数组

题目&#xff1a; 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双倍 数组&#xff0c;那么请你返…

如何解决PPT中获取加载项是灰色的,无法链接到Power BI的问题?

问题描述&#xff1a; 最近有朋友留言询问:“在尝试之前我发布的如何在PPT中展示Power BI报告的操作步骤的时候&#xff0c;想要在PPT中展示Power BI报告&#xff1f;只需这样做&#xff01; (qq.com) 碰到在PowerPoint中【获取加载项选项】是灰色&#xff0c;无法链加载Powe…

【数据库】Oracle11g与Oceanbase3.2.3对比

一、数据库体系结构对比 数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理&#xff0c;以及数据在数据库中的组织与管理机制。 Oracle11g作为传统关系数据库的代表、Oceanbase作为分布式关系数据库的代表&#xff0c;体系结构上的设计差别很大。 &a…