目录
- 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();
// 设置异步通知的通知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页面进行测试。
<!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