当前位置: 首页 > news >正文

【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. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后&#xff0c;看到以下页面&#xff0c;下…...

技术速递|Python in Visual Studio Code 2024年9月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展&#xff01; 此版本包括以下公告&#xff1a; Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣&#xff0c;可以在我们的 Pyth…...

数据结构-3.5.队列的顺序实现

一.队列的顺序实现&#xff0c;初始化操作以及判断队列是否为空&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 ​ typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...

preconnect 预解析

preconnect 是一种浏览器优化技术&#xff0c;用于告诉浏览器提前与指定的域名建立连接&#xff0c;包括DNS解析、TCP握手和TLS协商&#xff08;如果适用&#xff09;。这样做可以减少客户端在请求资源时所需的往返时间&#xff08;RTT&#xff09;&#xff0c;从而提高页面加载…...

Leecode热题100-283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

如何高效使用Prompt与AI大模型对话

一、如何与人工智能对话 在人工智能的世界里&#xff0c;提示词&#xff08;Prompt&#xff09;就像是一把钥匙&#xff0c;能够解锁AI智能助手的潜力&#xff0c;帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙&#xff0c;却是一门艺术。本文将带你了解提示词的…...

Java 之深入理解 String、StringBuilder、StringBuffer

前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到&#xff0c;这里就顺便总结一下&#xff1a;本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾&#xff1a;Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…...

vue3项目执行pnpm update后还原package.json文件后运行报错

项目场景&#xff1a; vue官方版本已更新到vue3.5&#xff0c;项目中还在使用vue3.4&#xff0c;因此想要更新项目vue版本。 问题描述 执行了 pnpm update 命令&#xff0c;一键更新了所有包&#xff0c;更新完成后项目不能正常运行。为了还原项目代码&#xff0c;先删除 nod…...

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1&#xff0c;脉冲部分代码2&#xff0c;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&#xff0c;创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目&#xff0c;选择3D模板&#xff0c;更改一下我们的项目名称&#xff0c;选择一下路径&#xff0c;然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane&#xff0c;这样有点视…...

【笔记】数据结构12

文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结&#xff0c;这里记录一下。 知识点汇总 2013年408应用题41 解决方法&#xff1a; 方法一 &#xff08;1&#xff09;算法思想 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元…...

django的URL配置

1 django如何处理一个请求 首先Django要使用根URLconf模块&#xff0c;通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式&#xff0c;并在匹配所请求的…...

精华帖分享 | 因子构建思考1

本文来源于量化小论坛股票量化板块精华帖&#xff0c;作者为z-coffee。 以下为精华帖正文&#xff1a; 一段时间没写帖子&#xff0c;其实一直在研究策略&#xff0c;只是从不同的角度去思考而已。熟悉我的老板其实清楚&#xff0c;我的炉子水平一般&#xff0c;基本不太依托…...

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&#xff1a;简单网络管理协议 SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种用于在计算机网络中管理网络节点&#xff08;如服务器、工作站、路由器、交换机等&#xff09;的标准协议。它属于OSI模型的应用层&#…...

ubuntu20.04系统下,c++图形库Matplot++配置

linux下安装c图形库Matplot&#xff0c;使得c可以可视化编程&#xff1b;安装Matplot之前&#xff0c;需要先安装一个gnuplot&#xff0c;因为Matplot是依赖于此库 gnuplot下载链接&#xff1a; http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过&#xff0c;下面源码…...

[激光原理与应用-126]:南京科耐激光-激光焊接 - 焊中无损检测技术 - 智能制程监测系统IPM介绍 - 26- 频域分析法

目录 一、什么是频域分析法 1、定义 2、基本原理 3、分析步骤 4、应用领域 5、优缺点 二、频域分析法在激光焊接故障监测中的应用 2.1 概述 1、应用背景 2、频域分析法的应用 3、应用优势 4、应用实例 2.2 激光焊接故障检测中光电信号的频谱特征 1、光电信号分类…...

深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践

1. 什么是修饰符&#xff08;Modifier&#xff09;&#xff1f; 1.1 修饰符的定义 在 Solidity 中&#xff0c;修饰符&#xff08;Modifier&#xff09;是一种用于更改函数行为的关键字。它们可以用于控制函数的执行条件、添加前置检查、简化重复逻辑等。修饰符在函数执行之前…...

YOLO11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】

一、项目背景 随着城市化进程的加速和交通网络的不断扩展&#xff0c;道路维护成为城市管理中的一个重要环节。道路缺陷&#xff08;如裂缝、坑洞、路面破损等&#xff09;不仅影响行车安全&#xff0c;还会增加车辆的磨损和维修成本。传统的道路缺陷检测方法主要依赖人工巡检…...

5步掌握OpenCore Configurator:黑苹果配置终极可视化指南

5步掌握OpenCore Configurator&#xff1a;黑苹果配置终极可视化指南 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 如果你正在为黑苹果系统的复杂配置而烦恼…...

FaaS承载AI Agent的性能断崖真相,实测AWS Lambda vs Cloudflare Workers响应延迟对比(含17项压测数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;FaaS承载AI Agent的性能断崖真相 当AI Agent被部署至函数即服务&#xff08;FaaS&#xff09;平台时&#xff0c;其推理延迟常出现非线性跃升——从本地毫秒级响应骤增至数秒甚至超时失败。这一“性能断…...

AI和大模型——拟合

一、拟合 Fitting,中文翻译成拟合&#xff0c;这个翻译还是比较贴切的。怎么理解拟合呢&#xff1f;其实非常好理解&#xff0c;如果接受过九年义务教育&#xff0c;基本都有极限或微积分的概念。有没有想起过积分中用高低不等的小矩形来拼凑出曲线面的面积&#xff0c;那个过程…...

3步诊断Reloaded-II模组依赖无限下载循环:新手友好修复指南

3步诊断Reloaded-II模组依赖无限下载循环&#xff1a;新手友好修复指南 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II 如果你在使用Reloaded-I…...

告别手动配网!用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解

告别手动配网&#xff01;用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解 想象一下&#xff0c;当你需要为三层别墅部署全屋Wi-Fi覆盖&#xff0c;或是为小型办公室搭建多AP无线网络时&#xff0c;传统方式需要逐个登录每个AP的后台&#xff0c;重复输入SSID、密码、…...

Claude Code 代码保存全攻略:告别丢失,高效管理开发成果

日常开发中&#xff0c;用 Claude Code 生成代码后&#xff0c;很多人都会遇到这些糟心事&#xff1a;生成的代码片段零散复制&#xff0c;换个会话就找不到&#xff1b;手动保存步骤繁琐&#xff0c;遗漏文件或格式错乱&#xff1b;切换不同 AI 模型时&#xff0c;代码记录无法…...

LaTeX排版避坑指南:为什么你的多图caption编号对不齐?一个案例讲清subfig、minipage和tabular的选择

LaTeX多图排版实战&#xff1a;从编号错乱到完美对齐的解决方案 第一次在学术论文中遇到多图排版问题时&#xff0c;我盯着那个歪歪扭扭的(c)编号看了整整十分钟——它本该和(a)(b)整齐排列&#xff0c;却像迷路的孩子一样缩在角落。更糟的是&#xff0c;当我引用这些子图时&am…...

npcpy:模块化AI智能体框架,从角色构建到团队协作的工程实践

1. 项目概述&#xff1a;一个为AI应用构建者准备的“瑞士军刀”如果你和我一样&#xff0c;在过去几年里尝试过用大语言模型&#xff08;LLM&#xff09;构建点什么东西&#xff0c;那你大概率经历过这样的循环&#xff1a;从LangChain、LlamaIndex这类框架开始&#xff0c;被它…...

从硬盘拷贝文件到内存,CPU真的在‘摸鱼’吗?聊聊DMA背后的性能优化实战

从硬盘拷贝文件到内存&#xff0c;CPU真的在‘摸鱼’吗&#xff1f;聊聊DMA背后的性能优化实战 当你在服务器上执行一个简单的文件读取操作时&#xff0c;是否曾好奇过背后发生了什么&#xff1f;传统认知中&#xff0c;CPU需要亲自搬运每个字节的数据&#xff0c;但实际上现代…...

好用的AI软件开发选哪家

在当今数字化飞速发展的时代&#xff0c;AI软件已经成为众多企业和个人提升效率、创新业务的重要工具。然而&#xff0c;面对市场上众多的AI软件开发公司&#xff0c;如何选择一家靠谱且好用的公司成为了许多人的困扰。今天&#xff0c;我就为大家推荐广州飞进信息科技有限公司…...