基于 Spring Boot 实现支付宝网站支付、APP 支付、单笔转账给用户以及退款功能的完整集成教程

以下是基于 Spring Boot 实现支付宝网站支付、APP 支付、单笔转账给用户以及退款功能的完整集成教程。我们将使用支付宝提供的 SDK 和接口来完成这些功能。

一、准备工作

1. 注册支付宝开放平台账号

  • 登录支付宝开放平台(支付宝开放平台),创建应用并获取 App ID
  • 配置 RSA2 公私钥对,并将公钥上传到支付宝开放平台。

2. 配置回调地址

  • 在支付宝开放平台的应用详情中,配置异步通知回调地址(notify_url)和同步通知地址(return_url)。

3. 添加依赖

pom.xml 文件中添加支付宝 SDK 依赖:
xml复制
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>最新版本号</version>
</dependency>

4. 配置文件

application.yml 中添加支付宝配置:
yaml复制
alipay:
  app-id: "your_app_id"
  private-key: "your_private_key"
  public-key: "your_alipay_public_key"
  notify-url: "https://yourdomain.com/pay/callback"
  return-url: "https://yourdomain.com/pay/success"
  gateway-url: "https://openapi.alipay.com/gateway.do"

二、实现支付功能

1. 网站支付

创建支付接口,生成支付页面链接:
java复制
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;

@RestController
@RequestMapping("/pay")
public class PayController {
    @Autowired
    private AlipayConfig alipayConfig;

    @GetMapping("/create")
    public String createPayment(@RequestParam String orderId, @RequestParam Double amount) {
        AlipayClient alipayClient = new DefaultAlipayClient(
            alipayConfig.getGatewayUrl(),
            alipayConfig.getAppId(),
            alipayConfig.getPrivateKey(),
            "json",
            "UTF-8",
            alipayConfig.getPublicKey(),
            "RSA2"
        );

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(alipayConfig.getReturnUrl());
        request.setNotifyUrl(alipayConfig.getNotifyUrl());

        request.setBizContent("{" +
            ""out_trade_no":"" + orderId + ""," +
            ""total_amount":" + amount + "," +
            ""subject":"测试商品"," +
            ""product_code":"FAST_INSTANT_TRADE_PAY"" +
            "}");

        try {
            String form = alipayClient.pageExecute(request).getBody();
            return form; // 返回支付页面
        } catch (Exception e) {
            throw new RuntimeException("支付接口调用失败", e);
        }
    }
}

2. APP 支付

APP 支付需要生成支付签名并返回给客户端:
java复制
@GetMapping("/app/create")
public Map<String, String> createAppPayment(@RequestParam String orderId, @RequestParam Double amount) {
    AlipayClient alipayClient = new DefaultAlipayClient(
        alipayConfig.getGatewayUrl(),
        alipayConfig.getAppId(),
        alipayConfig.getPrivateKey(),
        "json",
        "UTF-8",
        alipayConfig.getPublicKey(),
        "RSA2"
    );

    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
    request.setNotifyUrl(alipayConfig.getNotifyUrl());
    request.setBizContent("{" +
        ""out_trade_no":"" + orderId + ""," +
        ""total_amount":" + amount + "," +
        ""subject":"测试商品"," +
        ""product_code":"QUICK_MSECURITY_PAY"" +
        "}");

    try {
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        Map<String, String> result = new HashMap<>();
        result.put("result", response.getBody());
        return result;
    } catch (Exception e) {
        throw new RuntimeException("APP 支付接口调用失败", e);
    }
}

三、单笔转账给用户

使用支付宝的单笔转账接口实现转账功能:
java复制
import com.alipay.api.request.AlipayFundTransToaccountTransferRequest;

@PostMapping("/transfer")
public String transfer(@RequestParam String orderId, @RequestParam Double amount) {
    AlipayClient alipayClient = new DefaultAlipayClient(
        alipayConfig.getGatewayUrl(),
        alipayConfig.getAppId(),
        alipayConfig.getPrivateKey(),
        "json",
        "UTF-8",
        alipayConfig.getPublicKey(),
        "RSA2"
    );

    AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();
    request.setBizContent("{" +
        ""out_biz_no":"" + orderId + ""," +
        ""trans_amount":" + amount + "," +
        ""product_code":"TRANS_ACCOUNT_NO_PWD"," +
        ""payee_info":{" +
        "  "identity":"用户支付宝账号"," +
        "  "identity_type":"ALIPAY_USER_ID"," +
        "  "name":"用户姓名"" +
        "}" +
        "}");

    try {
        AlipayFundTransToaccountTransferResponse response = alipayClient.execute(request);
        return response.getBody();
    } catch (Exception e) {
        return "转账失败:" + e.getMessage();
    }
}

四、退款功能

实现退款接口:
java复制
import com.alipay.api.request.AlipayTradeRefundRequest;

@PostMapping("/refund")
public String refund(@RequestParam String orderId, @RequestParam Double refundAmount) {
    AlipayClient alipayClient = new DefaultAlipayClient(
        alipayConfig.getGatewayUrl(),
        alipayConfig.getAppId(),
        alipayConfig.getPrivateKey(),
        "json",
        "UTF-8",
        alipayConfig.getPublicKey(),
        "RSA2"
    );

    AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
    request.setBizContent("{" +
        ""out_trade_no":"" + orderId + ""," +
        ""refund_amount":" + refundAmount +
        "}");

    try {
        AlipayTradeRefundResponse response = alipayClient.execute(request);
        return response.getBody();
    } catch (Exception e) {
        return "退款失败:" + e.getMessage();
    }
}

五、异步通知处理

处理支付宝异步通知:
java复制
@PostMapping("/callback")
public String handleCallback(HttpServletRequest request) {
    Map<String, String> params = new HashMap<>();
    request.getParameterMap().forEach((key, values) -> params.put(key, values[0]));

    try {
        boolean verified = AlipaySignature.rsaCheckV1(params, alipayConfig.getPublicKey(), "UTF-8", "RSA2");
        if (verified) {
            String orderId = params.get("out_trade_no");
            String tradeStatus = params.get("trade_status");
            if ("TRADE_SUCCESS".equals(tradeStatus)) {
                // 更新订单状态为已支付
            }
            return "success";
        } else {
            return "failure";
        }
    } catch (Exception e) {
        return "failure";
    }
}

六、测试与部署

1. 沙箱环境测试

  • 使用支付宝沙箱环境和测试账号完成支付、退款、回调等流程测试。
  • 确保所有功能正常后,切换到生产环境。

2. 部署注意事项

  • 配置 HTTPS,确保数据传输安全。
  • 保护私钥和配置文件,避免泄露。

通过以上步骤,你可以完整实现基于 Spring Boot 的支付宝支付模块,包括网站支付、APP 支付、单笔转账和退款功能。在生产环境中,建议对系统的安全性和稳定性进行全面优化。

[自动更新内容]

  •    

    腾讯云服务器限时活动

       

    2核2G云服务器 仅需599元/3年!

        立即了解