【springboot】整合沙箱支付
目录
- 1. 配置沙箱应用环境
- 2. 配置springboot项目
- 1. 引入依赖
- 2. 配置文件
- 注册下载ngrok
- 3. 创建支付宝支付服务类
- 4. 支付界面模板
- 5. 控制类实现支付
- 6. 测试
1. 配置沙箱应用环境
使用支付宝账号登录到开放平台控制台。
使用支付宝登录后,看到以下页面,下滑找到 开发工具推荐-》沙箱。
查看到沙箱应用信息,点击查看,可以查看到沙箱应用的appid,app私钥,支付宝公钥。然后配置接口加签方式,使用系统默认密钥。
查看沙箱账号信息,可以看到商家/买家信息等。
2. 配置springboot项目
1. 引入依赖
<!-- 支付宝SDK的依赖--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.2.0</version></dependency>
2. 配置文件
application.yml
# 支付宝配置
alipay:
# 支付宝应用id,识别应用appId: your_app_id
# 应用私钥,用于对请求进行签名,确保请求的真实性和完整性appPrivateKey: your_app_private_key
# 支付宝的公钥,用于验证支付宝返回的数据的签名,确保数据的真实性和完整性alipayPublicKey: your_alipay_public_key
# 支付宝支付结果通知的回调地址,当支付完成后,支付宝会向这个地址发送支付结果通知。notifyUrl: your_notify_url
# 支付宝沙箱网关地址,开发者在沙箱环境调用 OpenAPI 发送 http(s) 请求的目标地址,需配置在AlipayClient中gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
application.properties
alipay.appId=your_app_id
alipay.appPrivateKey=your_app_private_key
alipay.alipayPublicKey=your_alipay_public_key
alipay.notifyUrl=your_notify_url
alipay.gatewayUrl=https://openapi-sandbox.dl.alipaydev.com/gateway.do
同时需要在支付宝开放平台配置回调地址。
注意:配置回调地址(notifyUrl)为本地测试环境时需要使用内网穿透,内网穿透是一种技术,它允许外部网络(如互联网)上的用户访问位于内部网络(例如家庭或公司局域网)中的设备或服务。如:ngrok,将本地服务器映射到外网,再配置回调地址为外网地址。
下面以ngrok为例,实现内网穿透。
注册下载ngrok
访问ngrok官网注册用户。
邮箱认证后,跳转到下载页面,直接跳过即可。
下载完成后,解压,双击ngrok.exe,使用下述命令输入token,即可使用,下载地址。
ngrok config add-authtoken your_token
使用命令行启动ngrok,监听本地8080端口。
ngrok http http://localhost:8080
命令成功执行后,会出现以下内容,其中包含外网地址,用于配置回调地址。
3. 创建支付宝支付服务类
@Data
public class AliPay {private String traceNo;// 商户订单号private double totalAmount;// 支付总金额private String subject;// 商品名称private String alipayTraceNo;// 支付宝流水号
}
4. 支付界面模板
支付跳转界面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>支付二维码</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<!--跳转界面-->
<h1>支付二维码</h1>
<p>订单号: <span th:text="${traceNo}"></span></p>
<p>支付金额: <span th:text="${totalAmount}"></span></p>
<p>商品名称: <span th:text="${subject}"></span></p>
<div th:utext="${qrCode}"></div>
</body>
</html>
异常界面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>这是error 页面</h1><p th:text="${error}"></p>
</body>
</html>
这里使用了thymeleaf模板,需要导入相关的依赖。
<!-- thymeleaf模板引擎依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
5. 控制类实现支付
@Controller
@RequestMapping("alipay")
public class AliPayController {@Value("${alipay.appId}")private String appId;@Value("${alipay.appPrivateKey}")private String appPrivateKey;@Value("${alipay.alipayPublicKey}")private String alipayPublicKey;@Value("${alipay.gatewayUrl}")private String gatewayUrl;@Value("${alipay.notifyUrl}")private String notifyUrl;@PostMapping("/pay")public String pay(AliPay aliPay,Model model) {// 使用必要的凭证和配置初始化一个AlipayClient对象AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, appPrivateKey,"json", "UTF-8", alipayPublicKey, "RSA2");// 创建一个AlipayTradePagePayRequest对象,用于封装支付请求参数AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();// 设置异步通知的通知urlrequest.setNotifyUrl(notifyUrl);// 设置业务参数,这里是JSON格式 包括订单号(out_trade_no)、支付金额(total_amount)、商品名称(subject)和产品代码(product_code)。request.setBizContent("{" +"\"out_trade_no\":\"" + aliPay.getTraceNo() + "\"," +"\"total_amount\":\"" + aliPay.getTotalAmount() + "\"," +"\"subject\":\"" + aliPay.getSubject() + "\"," +"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" +"}");try {// 调用execute方法发送请求并获取响应AlipayTradePagePayResponse response = alipayClient.pageExecute(request);// 判断是否调用成功if (response.isSuccess()) {System.out.println(response.getBody());model.addAttribute("qrCode", response.getBody());model.addAttribute("traceNo", aliPay.getTraceNo());model.addAttribute("totalAmount", aliPay.getTotalAmount());model.addAttribute("subject", aliPay.getSubject());return "pay";} else {model.addAttribute("error", "支付请求失败:" + response.getMsg());return "error";}} catch (AlipayApiException e) {model.addAttribute("error", "调用支付宝接口异常:" + e.getMessage());return "error";}}
}
6. 测试
在浏览器中,使用以下html页面进行测试。
<!DOCTYPE html>
<html>
<head><title>支付测试</title>
</head>
<body><form action="http://localhost:7070/alipay/pay" method="post"><label for="subject">交易标题:</label><input type="text" id="subject" name="subject"><br><br><label for="traceNo">订单号:</label><input type="text" id="traceNo" name="traceNo"><br><br><label for="totalAmount">支付金额:</label><input type="text" id="totalAmount" name="totalAmount"><br><br><input type="submit" value="支付"></form>
</body>
</html>
输入订单号、交易标题、支付金额,点击支付,跳转到跳转界面。
进入支付宝支付页面,输入用户名和密码,完成支付。
链接:
支付宝文档链接:https://opendocs.alipay.com/open/203/105285
相关文章:
【springboot】整合沙箱支付
目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后,看到以下页面,下…...
技术速递|Python in Visual Studio Code 2024年9月发布
排版:Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣,可以在我们的 Pyth…...
数据结构-3.5.队列的顺序实现
一.队列的顺序实现,初始化操作以及判断队列是否为空: 1.图解: 2.代码: #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...
preconnect 预解析
preconnect 是一种浏览器优化技术,用于告诉浏览器提前与指定的域名建立连接,包括DNS解析、TCP握手和TLS协商(如果适用)。这样做可以减少客户端在请求资源时所需的往返时间(RTT),从而提高页面加载…...
Leecode热题100-283.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...
如何高效使用Prompt与AI大模型对话
一、如何与人工智能对话 在人工智能的世界里,提示词(Prompt)就像是一把钥匙,能够解锁AI智能助手的潜力,帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙,却是一门艺术。本文将带你了解提示词的…...
Java 之深入理解 String、StringBuilder、StringBuffer
前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到,这里就顺便总结一下:本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾:Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…...
vue3项目执行pnpm update后还原package.json文件后运行报错
项目场景: vue官方版本已更新到vue3.5,项目中还在使用vue3.4,因此想要更新项目vue版本。 问题描述 执行了 pnpm update 命令,一键更新了所有包,更新完成后项目不能正常运行。为了还原项目代码,先删除 nod…...
蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555
蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1,脉冲部分代码2,ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …...
SolveigMM Video Splitter方便快捷视频分割合并软件 V3.6.1309.3-供大家学习研究参考
视频分割功能(Splitter)支持各种编码格式的AVI(DivX、DV、MJPEG、XVID、MPEG-4)、WMV、ASF(DivX、MJPEG、XVID、MPEG-4、WM Video 7/9)F、MPEG(*.mpg、*.mpeg、*.mpv、*.m2v、*.vob)文件、也支持受损的WMV、ASF格式的分割。视频合并功能(Joiner)则支持AVI、WMV/ASF、WMA、MP3、…...
Unity3D 创建一个人物,实现人物的移动
1,创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目,选择3D模板,更改一下我们的项目名称,选择一下路径,然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane,这样有点视…...
【笔记】数据结构12
文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结,这里记录一下。 知识点汇总 2013年408应用题41 解决方法: 方法一 (1)算法思想 算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元…...
django的URL配置
1 django如何处理一个请求 首先Django要使用根URLconf模块,通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式,并在匹配所请求的…...
精华帖分享 | 因子构建思考1
本文来源于量化小论坛股票量化板块精华帖,作者为z-coffee。 以下为精华帖正文: 一段时间没写帖子,其实一直在研究策略,只是从不同的角度去思考而已。熟悉我的老板其实清楚,我的炉子水平一般,基本不太依托…...
kubernetes笔记(四)
一、Pod调度策略 1.基于节点的调度 spec->nodeName [rootmaster ~]# vim myhttp.yaml --- kind: Pod apiVersion: v1 metadata:name: myhttp spec:nodeName: node-0001 # 基于节点名称进行调度containers:- name: apacheimage: myos:httpd[rootmaster ~]# kubectl a…...
通信工程学习:什么是SNMP简单网络管理协议
SNMP:简单网络管理协议 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于在计算机网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议。它属于OSI模型的应用层&#…...
ubuntu20.04系统下,c++图形库Matplot++配置
linux下安装c图形库Matplot,使得c可以可视化编程;安装Matplot之前,需要先安装一个gnuplot,因为Matplot是依赖于此库 gnuplot下载链接: http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过,下面源码…...
[激光原理与应用-126]:南京科耐激光-激光焊接 - 焊中无损检测技术 - 智能制程监测系统IPM介绍 - 26- 频域分析法
目录 一、什么是频域分析法 1、定义 2、基本原理 3、分析步骤 4、应用领域 5、优缺点 二、频域分析法在激光焊接故障监测中的应用 2.1 概述 1、应用背景 2、频域分析法的应用 3、应用优势 4、应用实例 2.2 激光焊接故障检测中光电信号的频谱特征 1、光电信号分类…...
深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践
1. 什么是修饰符(Modifier)? 1.1 修饰符的定义 在 Solidity 中,修饰符(Modifier)是一种用于更改函数行为的关键字。它们可以用于控制函数的执行条件、添加前置检查、简化重复逻辑等。修饰符在函数执行之前…...
YOLO11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】
一、项目背景 随着城市化进程的加速和交通网络的不断扩展,道路维护成为城市管理中的一个重要环节。道路缺陷(如裂缝、坑洞、路面破损等)不仅影响行车安全,还会增加车辆的磨损和维修成本。传统的道路缺陷检测方法主要依赖人工巡检…...
怎么屏蔽统计系统统计到的虚假ip
屏蔽统计系统中的虚假IP是保护网站分析数据准确性的重要措施。以下是一些有效的策略和步骤,可以帮助您过滤掉虚假IP: 1. 识别虚假IP的特征 了解虚假IP的常见特征可以帮助您识别和屏蔽它们: 短时间内高频率访问:虚假IP可能会在短…...
前端开发设计模式——策略模式
目录 一、策略模式的定义和特点 1.定义: 2.特点: 二、策略模式的实现方式 1.定义策略接口: 2.创建具体策略类: 3.定义上下文类: 三、策略模式的应用场景 1.表单验证场景: 2.动画效果切换场景&…...
SysML案例-潜艇
DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>...
车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27
[2] Denoising Diffusion Probabilistic Models 作者:Jonathan Ho Ajay Jain Pieter Abbeel 单位:加州大学伯克利分校 摘要: 我们提出了高质量的图像合成结果使用扩散概率模型,一类潜变量模型从非平衡热力学的考虑启发。我们的最…...
基于深度学习的任务序列中的快速适应
基于深度学习的任务序列中的快速适应是指模型在接连处理不同任务时,能够迅速调整和优化自身以适应新任务的能力。这种能力在动态环境和多任务学习中尤为重要,旨在减少训练时间和资源需求。以下是这一主题的关键要素: 1. 快速适应的背景 动态…...
虚拟机三种网络模式详解
在电脑里开一台虚拟机,是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏,还是用来学习Linux、跑跑应用程序都是很好的。而这其中,虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模…...
[leetcode]674_最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l < i < r,都有 nums[i] < nums[i 1] &am…...
【无人机设计与技术】四旋翼无人机,UAV仿真,轨迹跟踪PID控制
摘要 本文探讨了四旋翼无人机(UAV)在轨迹跟踪中的PID控制仿真方法。通过设计三轴方向的PID控制器,调节无人机的姿态与位置,使其能够准确跟踪预设轨迹。本文使用MATLAB/Simulink进行了建模与仿真,验证了PID控制算法在无…...
回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测
回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测 文章目录 一、基本原理原理流程总结 二、实验结果三、核心代码四、代码获取五、总结 回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提…...
javaScript基础知识汇总
一、基础语法 1、区分大小写:无论是变量、函数名还是操作符,都区分大小写。 2、标识符:就是变量、函数、属性或函数参数的名称。标识符可以由一个或多个字符构成,但需要满足以下条件: 第一个字符必须是一个字母、下…...
网站制作怎么做下拉菜单/重庆seo网络优化咨询热线
1.启动类加上EnableAsync 2.在方法上加上Async 3.注意对static方法修饰无效! 4.调用与被修饰方法不能写在同一个函数中。 5.调用者和被调用者不能在同一个类中,否则不生效。 6.返回值只能为Future或者Void, Future的使用方式. Async public Future…...
巫山那家做网站/2023年10月爆发新冠
当前,计算机行业是个飞速发展的行业,日新月异,因此,不断加强理论学习,拓展知识领域,进行知识更新,是我们当前最为迫切的任务,下面是关于学习计算机的体会,希望对大家有帮助。学习计算机心得体会篇一随着信息技术的高速发展并迅速渗透到社会生活的各个方面࿰…...
Office网站开发框架/帮别人推广app赚钱
本博文属于 ncnn 模型部署阶段,模型转换内容,笔记成文 文章目录❤️ yolov5s6.pt export onnx💛 onnxsim 对其进行 simplifier 处理💛 yolov5s6_sim.onnx 转 ncnn💛 对 ncnn.param 进行修正💛 对 ncnn.para…...
如何做网站的链接结构/长沙县网络营销咨询
volatile关键字的作用、原理 在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例。而发挥神奇作用的volatile,可以当之无愧的被称为Java并…...
迪庆企业网站建设/淘宝搜索关键词查询工具
清算结算 :一笔交易并进入纪录的过程,这一过程可以不需实际货币的有形交换。 清分(Clearing)是清算的数据准备阶段, 主要是将当日的全部网络交易数据按照各成员行之间本代他、他代本、贷记、借记、笔数、金额、轧差净额等进行汇总、整理、分类。 银行卡…...
男和女做暖暖网站/保定百度推广优化排名
2019独角兽企业重金招聘Python工程师标准>>> 这是个关系到技术能力成长的问题。 要搞明白这个问题,那要先清除,技术是怎么来的? 技术是怎么来的?那是因为需要解决某些问题,才发明的。 因此,如果…...