# Alipay-Spring-Boot-Starter
**Repository Path**: tool_list/alipay-spring-boot-starter
## Basic Information
- **Project Name**: Alipay-Spring-Boot-Starter
- **Description**: Alipay-Spring-Boot-Starter 是一个轻量级的支付宝支付集成组件,基于 Spring Boot 自动配置特性,无需复杂配置即可快速实现支付宝电脑网站支付、手机网站支付、退款等核心功能,简化支付宝 SDK 的集成流程。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-19
- **Last Updated**: 2026-01-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Alipay Spring Boot Starter 使用文档
## 简介
Alipay Spring Boot Starter 是一个轻量级的支付宝支付集成组件,基于 Spring Boot 自动配置特性,无需复杂配置即可快速实现支付宝**电脑网站支付、手机网站支付、退款**等核心功能,简化支付宝 SDK 的集成流程。
## 版本要求
* JDK 8+
* Spring Boot 2.3.x \~ 2.7.x(兼容 Spring Boot 3.x,需调整依赖适配)
* 支付宝商户账号(已开通支付 / 退款权限)
## 快速开始
### 1. 引入依赖
在 Maven 项目的 `pom.xml` 中添加依赖
```
edu.nf.alipay.spring.boot
alipay-spring-boot-starter
1.0
```
### 2. 配置支付宝参数
在 `application.yml` 或 `application.properties` 中配置支付宝核心参数(从支付宝商户后台获取):
#### YML 格式(推荐)
```yaml
alipay:
# 应用ID(必填)
app-id: your-alipay-app-id
# 商户私钥(必填,PKCS8格式,去除换行)
private-key: your-merchant-private-key
# 支付宝公钥(必填,从支付宝开放平台获取)
public-key: alipay-public-key
# 支付回调通知地址(必填,公网可访问)
notify-url: https://your-domain.com/alipay/notify
# 支付跳转同步回调地址(可选,前端跳转页面)
return-url: https://your-domain.com/alipay/return
# 字符编码(默认UTF-8,无需修改)
charset: UTF-8
# 签名算法(默认RSA2,支付宝推荐)
sign-type: RSA2
# 支付宝网关(沙箱环境:https://openapi.alipaydev.com/gateway.do;正式环境:https://openapi.alipay.com/gateway.do)
gateway-url: https://openapi.alipaydev.com/gateway.do
```
#### Properties 格式
```properties
alipay.app-id=your-alipay-app-id
alipay.private-key=your-merchant-private-key
alipay.public-key=alipay-public-key
alipay.notify-url=https://your-domain.com/alipay/notify
alipay.return-url=https://your-domain.com/alipay/return
alipay.charset=UTF-8
alipay.sign-type=RSA2
alipay.gateway-url=https://openapi.alipaydev.com/gateway.do
```
### 3. 核心 API 注入
在 Spring Boot 组件(Controller/Service)中注入 `AlipayTemplate`,即可调用支付、退款等功能:
```java
import com.yourcompany.alipay.template.AlipayTemplate;
import com.yourcompany.alipay.request.PayRequest;
import com.yourcompany.alipay.response.PayResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class AlipayController {
// 注入支付宝模板(自动配置,无需手动创建)
@Autowired
private AlipayTemplate alipayTemplate;
// 示例:发起电脑网站支付
@GetMapping("/alipay/pay")
public String doPay() {
// 1. 构建支付请求参数
PayRequest payRequest = new PayRequest();
payRequest.setOutTradeNo("MERCHANT\_20240520001"); // 商户订单号(唯一)
payRequest.setTotalAmount("0.01"); // 支付金额(单位:元)
payRequest.setSubject("测试商品"); // 订单标题
payRequest.setBody("测试商品描述"); // 订单描述(可选)
payRequest.setProductCode("FAST\_INSTANT\_TRADE\_PAY"); // 产品码(电脑网站支付固定值)
// 2. 发起支付,获取支付宝跳转链接(或表单HTML)
PayResponse response = alipayTemplate.pay(payRequest);
if (response.isSuccess()) {
// 电脑网站支付返回表单HTML,直接返回给前端渲染
return response.getFormHtml();
} else {
return "支付发起失败:" + response.getErrorMessage();
}
}
}
```
## 核心功能使用
### 一、支付功能
支持**电脑网站支付、手机网站支付**,核心差异在于 `productCode` 参数:
| 支付类型 | productCode 固定值 | 场景说明 |
| ------ | ------------------------- | --------- |
| 电脑网站支付 | FAST\_INSTANT\_TRADE\_PAY | 电脑端网页支付 |
| 手机网站支付 | QUICK\_WAP\_WAY | 移动端 H5 支付 |
#### 1. 电脑网站支付(示例)
```Java
// 构建支付请求
PayRequest payRequest = new PayRequest();
payRequest.setOutTradeNo("MERCHANT\_20240520001"); // 商户唯一订单号
payRequest.setTotalAmount("99.00"); // 支付金额(精确到分)
payRequest.setSubject("Java编程思想(书籍)"); // 订单标题
payRequest.setProductCode("FAST\_INSTANT\_TRADE\_PAY"); // 电脑网站支付产品码
payRequest.setReturnUrl("https://your-domain.com/pay/success"); // 同步回调地址(支付成功后跳转)
// 发起支付,返回表单HTML(前端直接渲染即可跳转支付宝)
PayResponse response = alipayTemplate.pay(payRequest);
if (response.isSuccess()) {
return response.getFormHtml(); // 前端渲染该HTML自动跳转支付宝
}
```
#### 2. 手机网站支付(示例)
```Java
PayRequest payRequest = new PayRequest();
payRequest.setOutTradeNo("MERCHANT\_20240520002");
payRequest.setTotalAmount("199.00");
payRequest.setSubject("手机端会员充值");
payRequest.setProductCode("QUICK\_WAP\_WAY"); // 手机网站支付产品码
payRequest.setBody("年度会员充值");
PayResponse response = alipayTemplate.pay(payRequest);
return response.getFormHtml(); // 移动端H5页面渲染后跳转支付宝
```
### 二、退款功能
支持全额退款或部分退款,需传入原订单号和退款单号(唯一)。
#### 1. 发起退款(示例)
```Java
import com.yourcompany.alipay.request.RefundRequest;
import com.yourcompany.alipay.response.RefundResponse;
// 构建退款请求
RefundRequest refundRequest = new RefundRequest();
refundRequest.setOutTradeNo("MERCHANT\_20240520001"); // 原商户订单号
refundRequest.setOutRequestNo("REFUND\_20240520001"); // 商户退款单号(唯一,区分同一订单的多次退款)
refundRequest.setRefundAmount("0.01"); // 退款金额(不能超过原订单金额)
refundRequest.setRefundReason("用户取消订单"); // 退款原因(可选)
// 发起退款
RefundResponse response = alipayTemplate.refund(refundRequest);
if (response.isSuccess()) {
System.out.println("退款成功!退款金额:" + response.getRefundAmount());
System.out.println("退款时间:" + response.getGmtRefundPay());
} else {
System.out.println("退款失败:" + response.getErrorMessage());
}
```
#### 2. 退款注意事项
* 退款单号 `outRequestNo` 必须唯一,同一订单多次退款需使用不同的退款单号;
* 退款金额不能超过原订单的实际支付金额;
* 退款申请提交后,支付宝会异步处理,建议通过 “退款查询” 接口确认最终退款状态。
### 三、支付回调处理
支付宝支付成功后,会向配置的 `notify-url` 发起异步通知(POST 请求),需验证通知的真实性并更新订单状态。
#### 回调处理示例(Controller)
```java
import com.yourcompany.alipay.util.AlipayNotifyUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@RequestMapping("/alipay")
public class AlipayNotifyController {
@Resource
private AlipayTemplate alipayTemplate;
// 支付宝异步通知接收地址(需与 application.yml 中配置的 notify-url 一致)
@PostMapping("/notify")
public String handleNotify(HttpServletRequest request) {
try {
// 1. 获取支付宝通知参数(Map格式)
Map\ notifyParams = AlipayNotifyUtil.getNotifyParams(request);
// 2. 验证通知的真实性(核心:防止伪造通知)
boolean verifyResult = alipayTemplate.verifyNotify(notifyParams);
if (!verifyResult) {
return "fail"; // 验证失败,返回fail告知支付宝
}
// 3. 验证通知状态(支付成功的状态为 TRADE\_SUCCESS)
String tradeStatus = notifyParams.get("trade\_status");
if (!"TRADE\_SUCCESS".equals(tradeStatus)) {
return "success"; // 非支付成功状态,返回success避免支付宝重复通知
}
// 4. 处理业务逻辑(更新订单状态、记录支付日志等)
String outTradeNo = notifyParams.get("out\_trade\_no"); // 商户订单号
String tradeNo = notifyParams.get("trade\_no"); // 支付宝交易号
String totalAmount = notifyParams.get("total\_amount"); // 支付金额
// TODO: 此处编写你的业务逻辑(如:更新订单为“已支付”状态)
System.out.println("订单支付成功:商户订单号=" + outTradeNo + ",支付宝交易号=" + tradeNo);
// 5. 处理成功,返回success告知支付宝(无需重复通知)
return "success";
} catch (Exception e) {
// 异常处理(记录日志)
e.printStackTrace();
return "fail";
}
}
}
```
#### 回调验证说明
* 必须通过 `alipayTemplate.verifyNotify(notifyParams)` 验证通知签名,防止恶意伪造;
* 通知参数中的 `trade_status` 为 `TRADE_SUCCESS` 时,才表示支付成功;
* 处理完成后必须返回 `success`(纯字符串,无多余字符),否则支付宝会每隔一段时间重复发送通知。
## 配置参数详解
| 配置项 | 类型 | 是否必填 | 说明 |
| ------------------ | ------ | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| alipay.app-id | String | 是 | 支付宝开放平台创建应用后获取的 AppID |
| alipay.private-key | String | 是 | 商户私钥(PKCS8 格式,需去除换行符,可通过支付宝密钥生成工具生成) |
| alipay.public-key | String | 是 | 支付宝公钥(从支付宝开放平台 “应用详情 - 开发设置” 中获取) |
| alipay.notify-url | String | 是 | 支付异步通知地址(公网可访问,用于接收支付宝支付结果通知) |
| alipay.return-url | String | 否 | 支付同步回调地址(支付成功后跳转的前端页面,仅用于页面跳转,不做业务处理) |
| alipay.charset | String | 否 | 字符编码,默认 UTF-8 |
| alipay.sign-type | String | 否 | 签名算法,默认 RSA2(支付宝推荐,支持 RSA 和 RSA2,优先使用 RSA2) |
| alipay.gateway-url | String | 是 | 支付宝网关地址:沙箱环境([https://openapi.alipaydev.com/gateway.do](https://openapi.alipaydev.com/gateway.do))、正式环境([https://openapi.alipay.com/gateway.do](https://openapi.alipay.com/gateway.do)) |
## 常见问题(FAQ)
### 1. 支付发起失败,提示 “签名验证失败”?
* 检查 `private-key` 和 `public-key` 是否正确(私钥是商户的,公钥是支付宝的,不要混淆);
* 私钥需为 PKCS8 格式(去除 `-----BEGIN PRIVATE KEY-----` 和 `-----END PRIVATE KEY-----` 及换行);
* 签名算法 `sign-type` 需与支付宝开放平台配置一致(默认 RSA2)。
### 2. 回调通知接收不到?
* 检查 `notify-url` 是否为公网可访问(可通过 ngrok 等工具内网穿透测试);
* 检查服务器是否有防火墙拦截支付宝的请求(支付宝 IP 段需放行);
* 检查回调接口是否返回 `success` 字符串(无多余空格或 HTML 标签)。
### 3. 退款失败,提示 “订单不存在”?
* 检查 `outTradeNo` 是否为已支付成功的订单号;
* 确认订单是否已过退款有效期(支付宝普通订单退款有效期为支付成功后 3 个月);
* 检查退款金额是否超过原订单支付金额。
## 联系与反馈
* 项目地址:https://gitee.com/tu-fangsheng/alipay-spring-boot-starter.git
* 问题反馈: 提交或发送邮件至 1474088532@qq.com || rsl808084@gmail.com