若依框架(RuoYi)是一个基于Spring Boot和Spring Cloud的开源快速开发平台,其提供了丰富的功能模块和良好的扩展性。通过整合支付宝SDK,可以轻松实现支付功能。本文将详细解析如何在若依框架中集成支付宝SDK,并实现支付功能。
在开始之前,请确保以下环境已经准备好:
首先,在pom.xml
文件中添加支付宝SDK的Maven依赖:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.20.0.ALL</version>
</dependency>
然后执行mvn clean install
命令更新依赖。
在若依框架中,通常使用application.yml
或application.properties
文件来配置外部服务参数。在这里,我们需要添加支付宝的相关配置:
alipay:
app-id: your_app_id_here
merchant-private-key: your_merchant_private_key_here
alipay-public-key: your_alipay_public_key_here
notify-url: http://yourdomain.com/alipay/notify
return-url: http://yourdomain.com/alipay/return
charset: UTF-8
sign-type: RSA2
gateway-url: https://openapi.alipay.com/gateway.do
为了封装支付宝的逻辑,我们可以创建一个名为AlipayService
的服务类。以下是该类的基本结构:
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
@Service
public class AlipayService {
@Value("${alipay.app-id}")
private String appId;
@Value("${alipay.merchant-private-key}")
private String merchantPrivateKey;
@Value("${alipay.alipay-public-key}")
private String alipayPublicKey;
@Value("${alipay.notify-url}")
private String notifyUrl;
@Value("${alipay.return-url}")
private String returnUrl;
@Value("${alipay.charset}")
private String charset;
@Value("${alipay.sign-type}")
private String signType;
@Value("${alipay.gateway-url}")
private String gatewayUrl;
public String createOrder(String outTradeNo, String totalAmount, String subject) throws AlipayApiException {
// 初始化AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, merchantPrivateKey, "json", charset, alipayPublicKey, signType);
// 创建请求对象
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(returnUrl);
alipayRequest.setNotifyUrl(notifyUrl);
// 设置业务参数
Map<String, Object> bizContent = new HashMap<>();
bizContent.put("out_trade_no", outTradeNo);
bizContent.put("total_amount", totalAmount);
bizContent.put("subject", subject);
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
alipayRequest.setBizContent(JSON.toJSONString(bizContent));
// 获取跳转链接
return alipayClient.pageExecute(alipayRequest).getBody();
}
}
支付宝支付完成后会向notify-url
发送异步通知,同时用户也会被重定向到return-url
。因此需要分别处理这两种情况。
创建一个Controller来接收支付宝的通知:
@RestController
@RequestMapping("/alipay")
public class AlipayNotifyController {
@PostMapping("/notify")
public String handleNotify(@RequestBody String notifyData, HttpServletRequest request) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
"your_app_id",
"your_merchant_private_key",
"json",
"UTF-8",
"your_alipay_public_key",
"RSA2");
boolean verifyResult = alipayClient.verifyNotification(request.getParameterMap(), request.getInputStream());
if (verifyResult) {
// 验证成功,处理订单状态更新等逻辑
System.out.println("异步通知验证成功!");
return "success";
} else {
System.out.println("异步通知验证失败!");
return "fail";
}
}
}
当用户支付完成后,支付宝会将用户重定向到return-url
。此时可以在页面上显示支付结果:
@GetMapping("/return")
public String handleReturn(@RequestParam Map<String, String> params) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
"your_app_id",
"your_merchant_private_key",
"json",
"UTF-8",
"your_alipay_public_key",
"RSA2");
boolean verifyResult = alipayClient.verifyReturn(params);
if (verifyResult) {
// 验证成功,展示支付成功页面
return "支付成功!";
} else {
return "支付失败,请稍后再试!";
}
}
在前端页面中,可以通过调用后端接口生成支付链接并跳转到支付宝支付页面:
<!DOCTYPE html>
<html>
<head>
<title>支付宝支付</title>
</head>
<body>
<button id="payButton">立即支付</button>
<script>
document.getElementById('payButton').addEventListener('click', function() {
fetch('/api/createOrder', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
outTradeNo: '202310010001',
totalAmount: '0.01',
subject: '测试商品'
})
}).then(response => response.text())
.then(payUrl => window.location.href = payUrl);
});
</script>
</body>
</html>
以下是整个支付流程的Mermaid代码表示:
sequenceDiagram participant User as 用户 participant Frontend as 前端 participant Backend as 后端 participant Alipay as 支付宝 Note over User,Frontend: 用户点击支付按钮 Frontend->>Backend: 调用创建订单接口 Backend->>Alipay: 发起支付请求 Alipay-->>Backend: 返回支付链接 Backend-->>Frontend: 返回支付链接 Frontend-->>User: 跳转至支付宝支付页面 User->>Alipay: 完成支付操作 Alipay->>Backend: 发送异步通知 Alipay-->>User: 跳转至同步返回URL Backend->>Frontend: 更新订单状态