Spring Boot 3.4 实现支付宝支付集成,轻松搞定支付功能

开发 开发工具
在本地开发时,我们通常会遇到接口请求的问题:如果外部系统需要调用我们的接口(比如支付宝返回支付结果),那么我们需要一个公网地址来接收这些回调请求。

支付宝支付集成是电商应用中常见的功能之一,今天我们将通过 Spring Boot 3.4 来实现这一功能,包括支付宝沙箱环境配置、内网穿透配置、支付请求参数的设置等步骤,确保你能快速上手并完成支付功能的集成。

支付宝沙箱环境配置

为了进行支付功能的测试,我们需要使用支付宝提供的沙箱环境。这是一个虚拟的支付环境,专门用于测试和调试。访问沙箱环境:支付宝沙箱 https://openhome.alipay.com/platform/appDaily.htm。使用沙箱时,可以采用默认的密钥进行测试,我们只需要获取以下几个关键数据:

  • 支付宝的公钥和私钥
  • 支付的网关地址
  • 支付的APP ID

内网穿透配置

在本地开发时,我们通常会遇到接口请求的问题:如果外部系统需要调用我们的接口(比如支付宝返回支付结果),那么我们需要一个公网地址来接收这些回调请求。此时,内网穿透技术便派上了用场,它可以帮助我们将本地服务器暴露到公网。

通过使用如 Ngrok https://ngrok.com/ 或 Natapp https://natapp.cn 等工具,你可以为本地服务配置一个公网地址。免费版通常会提供一个随机生成的地址,这样你就能在外网测试接口了。

配置支付宝支付 SDK

在集成支付宝支付前,我们需要引入支付宝的 SDK。以下是添加依赖的 Maven 配置:

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.9.28.ALL</version>
</dependency>

接下来,我们在 application.yml 文件中配置支付宝相关信息:

server:
  port: 9090

alipay:
  appId: 9021000135634074
  appPrivateKey: <your-app-private-key>
  alipayPublicKey: <your-alipay-public-key>
  notifyUrl: http://v6tqyw.natappfree.cc/alipay/notify

支付请求参数对象

为了创建支付请求,我们需要准备支付订单的基本信息,如订单号、金额、商品描述等。这些信息会通过支付宝的 API 发起请求。

定义一个支付请求对象 PayVO

package com.icoderoad.dto;


import java.math.BigDecimal;


@Data
public class PayVO {
    private String outTradeNo; // 商户订单号
    private String subject;    // 订单名称
    private BigDecimal totalAmount; // 付款金额
    private String body;      // 商品描述
}

支付接口实现

接下来,我们需要通过支付宝 SDK 创建支付客户端并发送支付请求。以下是实现的关键步骤:

package com.icoderoad.controller;


import com.icoderoad.config.AliPayConfig;
import com.icoderoad.dto.PayVO;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.AlipayApiException;
import com.alipay.api.response.AlipayTradePagePayResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;


import javax.servlet.http.HttpServletResponse;
import java.util.UUID;


@RestController
@RequestMapping("/alipay")
public class AliPayController {


    @Autowired
    private AliPayConfig aliPayConfig;


    private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
    private static final String CHARSET = "utf-8";
    private static final String SIGN_TYPE = "RSA2";


    @GetMapping("/pay")
    public void pay(PayVO payVO, HttpServletResponse response) throws Exception {
        // 创建支付客户端
        AlipayClient alipayClient = new DefaultAlipayClient(
            GATEWAY_URL,
            aliPayConfig.getAppId(),
            aliPayConfig.getAppPrivateKey(),
            "JSON",
            CHARSET,
            aliPayConfig.getAlipayPublicKey(),
            SIGN_TYPE
        );


        // 创建支付请求对象
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setNotifyUrl(aliPayConfig.getNotifyUrl());


        // 设置请求参数
        payVO.setOutTradeNo(UUID.randomUUID().toString());
        request.setBizContent("{\"out_trade_no\":\"" + payVO.getOutTradeNo() + "\","
                             + "\"total_amount\":\"" + payVO.getTotalAmount() + "\","
                             + "\"subject\":\"" + payVO.getSubject() + "\","
                             + "\"body\":\"" + payVO.getBody() + "\","
                             + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");


        // 设置回调接口
        request.setReturnUrl("http://localhost:9090/hello/pay");


        // 执行支付请求
        try {
            String form = alipayClient.pageExecute(request).getBody();
            response.setContentType("text/html;charset=" + CHARSET);
            response.getWriter().write(form);
            response.getWriter().flush();
            response.getWriter().close();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }
}

支付回调接口

支付宝支付成功后,会调用我们在 notifyUrl 中配置的回调接口。这时,我们需要在回调接口中处理支付结果,确认支付状态。

package com.icoderoad.controller;


import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/alipay")
public class AliPayCallbackController {


    @PostMapping("/notify")
    public void handleNotify(@RequestBody String notifyData) {
        // 处理支付结果通知
        // 例如:验证签名、更新订单状态等
    }
}

测试支付

在集成完成后,你可以通过访问以下 URL 来测试支付流程:

http://localhost:9090/alipay/pay?subject=测试商品&total_amount=1000

在支付宝沙箱环境中,输入测试账号和支付密码完成支付。支付成功后,支付宝将会回调我们的 notifyUrl,我们可以通过此接口接收支付结果并更新订单状态。

总结

通过上述步骤,我们成功地将支付宝支付集成到 Spring Boot 3.4 项目中,完成了支付功能的实现。这些操作不仅可以应用于本地开发环境,还可以通过内网穿透技术进行公网测试,确保支付宝支付功能在实际环境中的顺利运行。

责任编辑:武晓燕 来源: 路条编程
相关推荐

2025-02-18 16:00:00

SpringBoot支付Java

2021-09-09 15:30:28

鸿蒙HarmonyOS应用

2011-04-21 11:27:42

Firefox支付宝

2013-10-11 09:41:01

Windows 8.1支付宝

2021-01-25 14:13:26

iOS支付宝支付

2009-11-23 10:02:22

PHP支付宝接口

2024-02-28 08:59:47

2014-11-17 10:52:56

支付宝去阿里化

2011-10-15 23:24:48

Java

2009-08-26 16:07:09

支付宝网上购物安全迈克菲

2023-11-28 08:53:15

2009-09-17 12:15:28

互联网

2018-02-25 11:22:14

SDK代码接口

2021-12-29 21:36:12

微信支付宝移动支付

2016-12-27 09:49:59

支付宝红包破解

2011-12-28 21:43:40

苹果

2013-11-28 11:15:43

微信支付宝支付战争

2018-03-27 12:02:31

央行支付宝红包

2017-12-18 18:23:09

支付宝扫码赚钱支付宝套路

2013-10-31 11:24:53

支付宝漏洞支付宝漏洞
点赞
收藏

51CTO技术栈公众号