【springboot】整合沙箱支付

目录

  • [1. 配置沙箱应用环境](#1. 配置沙箱应用环境)
  • [2. 配置springboot项目](#2. 配置springboot项目)
    • [1. 引入依赖](#1. 引入依赖)
    • [2. 配置文件](#2. 配置文件)
    • [3. 创建支付宝支付服务类](#3. 创建支付宝支付服务类)
    • [4. 支付界面模板](#4. 支付界面模板)
    • [5. 控制类实现支付](#5. 控制类实现支付)
    • [6. 测试](#6. 测试)

1. 配置沙箱应用环境

使用支付宝账号登录到开放平台控制台

使用支付宝登录后,看到以下页面,下滑找到 开发工具推荐-》沙箱。

查看到沙箱应用信息,点击查看,可以查看到沙箱应用的appid,app私钥,支付宝公钥。然后配置接口加签方式,使用系统默认密钥。

查看沙箱账号信息,可以看到商家/买家信息等。

2. 配置springboot项目

1. 引入依赖

xml 复制代码
        <!--        支付宝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

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. 创建支付宝支付服务类

java 复制代码
@Data
public class AliPay {
    private String traceNo;// 商户订单号
    private double totalAmount;// 支付总金额
    private String subject;// 商品名称
    private String alipayTraceNo;// 支付宝流水号
}

4. 支付界面模板

支付跳转界面

html 复制代码
<!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>

异常界面

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模板,需要导入相关的依赖。

xml 复制代码
<!--        thymeleaf模板引擎依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

5. 控制类实现支付

java 复制代码
@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();
        // 设置异步通知的通知url
        request.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页面进行测试。

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

相关推荐
Milk夜雨3 分钟前
Java旅程(五)Spring 框架与微服务架构 & 了解 JVM 内部原理和调优
java·开发语言·spring
美美的海顿19 分钟前
spring boot 火车售票微信小程序LW
spring boot·后端·微信小程序·小程序·毕业设计
小金的学习笔记22 分钟前
隐藏指定文件/文件夹和自动提示功能消失解决方案
java·idea
Q_192849990623 分钟前
基于Spring Boot的个性化推荐外卖点餐系统
java·spring boot·后端
J不A秃V头A31 分钟前
Spring Boot开发编译后读取不到@spring.profiles.active@的问题
spring boot
会说法语的猪36 分钟前
IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理
java·ide·intellij-idea
brzhang1 小时前
十年磨一剑:那些关于长期软件开发的思考,架构设计中如何做好技术选型
前端·后端·架构
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
MyBatis执行完sql后,返回的数值代表的意思
java·开发语言
CodeClimb1 小时前
【华为OD-E卷-寻找密码 100分(python、java、c++、js、c)】
java·python·华为od
爱上语文1 小时前
宠物管理系统:Service层
java·开发语言·宠物