现在 AI + 业务落地越来越火,很多小伙伴问:Spring AI 能不能做支付?能不能一句话唤起支付宝支付?

这里统一给答案:

  • Spring AI 没有官方支付组件
  • 但可以通过 Function Calling + 支付宝 SDK 快速实现 对话式支付
  • 用户输入:帮我付 50 元开通会员,AI 自动解析参数、生成订单、返回支付宝收银台

本文提供 完整可运行工程,基于 SpringBoot3.3 + SpringAI1.0 + 支付宝沙箱,零删减、可直接跑通、可作为真实项目原型。

一、实现效果(核心亮点)

  1. 自然语言触发支付:无需前端表单,纯对话生成支付订单
  1. AI 自动参数解析:金额、商品名称由大模型自动抽取
  1. 原生支付宝收银台:安全合规,不涉及静默扣款
  1. 沙箱可完整测试:无真实资金风险
  1. 标准 SpringAI 最佳实践@Tool 函数调用,企业级写法

重要澄清:本项目不会自动扣款,只会跳转支付宝官方收银台,必须用户手动确认支付,合规安全。

二、环境与版本说明

  • JDK:17+
  • SpringBoot:3.3.4
  • SpringAI:1.0.0-M1
  • 支付宝 SDK:4.34.0.ALL
  • 模型:任意支持 Function Calling 的大模型(GPT、通义千问、星火均适配)

三、第一步:配置maven

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 父工程:Spring Boot 3.3.4 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/>
    </parent>

    <!-- 项目信息 -->
    <groupId>com.example</groupId>
    <artifactId>spring-ai-alipay-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai-alipay-demo</name>
    <description>Spring AI + 支付宝支付 对话式支付Demo</description>

    <!-- 版本配置 -->
    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0-M1</spring-ai.version>
    </properties>

    <!-- 依赖管理:Spring AI BOM 统一版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 核心依赖 -->
    <dependencies>
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring AI OpenAI 启动器(支持 Function Calling)-->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-openai</artifactId>
        </dependency>

        <!-- 支付宝官方 SDK -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.34.0.ALL</version>
        </dependency>

        <!-- Lombok 简化代码 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 测试依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 构建插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- Spring AI 里程碑仓库(必须加,否则下载不到 M1 版本) -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

四、第二步:配置文件 application.yml

yaml
spring:
  ai:
    openai:
      api-key: 你的大模型Key
      base-url: 你的大模型代理地址
      chat:
        options:
          model: gpt-3.5-turbo

# 支付宝沙箱配置(全部来自支付宝开放平台沙箱应用)
alipay:
  app-id: 你的沙箱APP_ID
  private-key: 你的商户私钥
  public-key: 支付宝公钥
  server-url: https://openapi.alipaydev.com/gateway.do
  notify-url: http://localhost:8080/alipay/notify
  return-url: http://localhost:8080/alipay/return

五、第三步:支付宝工具类(原生支付能力封装)

java
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class AlipayUtil {

    @Value("${alipay.app-id}")
    private String appId;
    @Value("${alipay.private-key}")
    private String privateKey;
    @Value("${alipay.public-key}")
    private String publicKey;
    @Value("${alipay.server-url}")
    private String serverUrl;
    @Value("${alipay.notify-url}")
    private String notifyUrl;
    @Value("${alipay.return-url}")
    private String returnUrl;

    /**
     * 生成支付宝PC收银台支付表单HTML
     */
    public String createPagePay(String orderNo, String subject, String totalAmount) {
        AlipayClient alipayClient = new DefaultAlipayClient(
                serverUrl, appId, privateKey, "JSON", "UTF-8", publicKey, "RSA2");

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(returnUrl);
        request.setNotifyUrl(notifyUrl);

        String bizContent = String.format("""
                {
                    "out_trade_no":"%s",
                    "product_code":"FAST_INSTANT_TRADE_PAY",
                    "subject":"%s",
                    "total_amount":"%s"
                }
                """, orderNo, subject, totalAmount);
        request.setBizContent(bizContent);

        try {
            // 返回可自动提交的HTML表单
            return alipayClient.pageExecute(request).getBody();
        } catch (Exception e) {
            log.error("支付宝支付表单生成失败", e);
            return "支付接口异常";
        }
    }
}

六、第四步:Spring AI 核心支付工具函数(@Tool)

关键:让大模型知道 “支付能力存在” 并自动调用

java
import lombok.RequiredArgsConstructor;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Component;
import java.util.UUID;

@Component
@RequiredArgsConstructor
public class PaymentTool {

    private final AlipayUtil alipayUtil;

    /**
     * AI可自动调用的支付工具
     * 用户说:付款、支付、下单、缴费 都会触发此函数
     */
    @Tool(description = "用户需要支付、付款、下单、缴费时调用,传入商品名称和支付金额")
    public String alipayPay(
            @ToolParam(description = "商品/订单名称") String subject,
            @ToolParam(description = "支付金额,单位元") String totalAmount) {
        // 自动生成唯一订单号
        String orderNo = "PAY_" + UUID.randomUUID().toString().replace("-", "");
        // 返回支付宝收银台HTML
        return alipayUtil.createPagePay(orderNo, subject, totalAmount);
    }
}

七、第五步:AI 聊天客户端配置

java
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfig {
    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.build();
    }
}

八、第六步:AI 对话支付控制器(入口)

java
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class AIPayController {

    private final ChatClient chatClient;

    @GetMapping("/ai/chat")
    public String chat(@RequestParam String msg) {
        // 绑定支付工具,大模型自动判断是否需要调用支付
        return chatClient.prompt()
                .user(msg)
                .tools("paymentTool")
                .call()
                .content();
    }
}

九、启动类

java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringAiPayApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringAiPayApplication.class, args);
    }
}

十、测试方式

启动项目,浏览器直接访问:

Plain Text
http://localhost:8080/ai/chat?msg=帮我支付50元开通年度会员

执行流程

  1. 大模型识别用户意图:需要支付
  1. 自动调用 alipayPay 工具
  1. 后端生成唯一订单号 + 支付宝官方支付表单
  1. 浏览器自动跳转 支付宝沙箱收银台
  1. 用户手动输入沙箱账号完成支付

十一、重点原理讲解(必看)

1、会不会自动扣款?

绝对不会!

  • 使用的是支付宝标准 FAST_INSTANT_TRADE_PAY 网页支付
  • 只能唤起收银台,必须人工确认支付
  • 不存在静默扣款、自动扣款风险,完全合规

2、AI 到底做了什么?

  • 语义理解:识别 “支付、付款、买、充值” 意图
  • 参数抽取:自动提取金额、商品名称
  • 工具调用:自动执行支付接口生成订单

3、为什么这是企业级写法?

  • 基于 SpringAI 官方 @Tool 规范
  • 业务与 AI 解耦
  • 可无限扩展:退款、查订单、对账、微信支付

十二、生产环境改造清单(重点)

Demo 可用,但上线必须补全:

  1. 订单数据库持久化
  1. 支付回调 notify 验签 & 订单状态更新
  1. 幂等性防止重复回调
  1. 金额后端校验,禁止前端传参
  1. 密钥配置中心托管
  1. 支付超时关闭订单
  1. 退款、对账、流水记录

十三、常见问题踩坑

1、大模型不调用支付工具

  • 模型必须支持 Function Calling
  • Tool 的 description 必须清晰、语义明确

2、支付宝报签名错误

  • 核对:APPID、网关地址、公私钥
  • 沙箱必须使用 沙箱网关,不要用正式环境网关

3、页面空白 / 不跳转

  • 接口返回的是完整 HTML,浏览器直接访问即可自动提交表单

十四、扩展方向

  • 接入微信支付(同样封装 @Tool)
  • AI 智能对账、交易分析
  • 智能客服一键售后退款
  • RAG + 支付 FAQ 自动解答

总结

  1. Spring AI 可以完美落地 对话式支付场景
  2. 核心方案:AI Function Calling + 官方支付 SDK
  3. 本项目是 真实可运行、合规、无自动扣款风险 的工业级原型
  4. 可直接作为 AI 电商、AI 收银、智能财务系统的基础骨架

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐