若依框架整合支付宝SDK实现支付功能

2025-06发布4次浏览

若依框架(RuoYi)是一个基于Spring Boot和Spring Cloud的开源快速开发平台,其提供了丰富的功能模块和良好的扩展性。通过整合支付宝SDK,可以轻松实现支付功能。本文将详细解析如何在若依框架中集成支付宝SDK,并实现支付功能。

1. 环境准备

在开始之前,请确保以下环境已经准备好:

  • Java开发环境(JDK 8或更高版本)
  • Maven构建工具
  • 若依框架项目代码
  • 支付宝开放平台账号及应用信息(App ID、公钥、私钥)

2. 引入支付宝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命令更新依赖。

3. 配置支付宝参数

在若依框架中,通常使用application.ymlapplication.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

4. 创建支付宝服务类

为了封装支付宝的逻辑,我们可以创建一个名为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();
    }
}

5. 处理异步通知与同步返回

支付宝支付完成后会向notify-url发送异步通知,同时用户也会被重定向到return-url。因此需要分别处理这两种情况。

5.1 异步通知处理

创建一个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";
        }
    }
}

5.2 同步返回处理

当用户支付完成后,支付宝会将用户重定向到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 "支付失败,请稍后再试!";
    }
}

6. 前端调用示例

在前端页面中,可以通过调用后端接口生成支付链接并跳转到支付宝支付页面:

<!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>

7. 流程图

以下是整个支付流程的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: 更新订单状态