会调用 Stripe API 还不够:AI Agent 真正薄弱的是验证闭环

2026-07-15 39 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

Stripe 推出的基准套件,把 AI Agent 放进接近真实生产环境的支付集成任务中:它不仅要编写后端接口,还要连接前端与浏览器结账流程,并证明整个链路确实可用。研究传递出的关键信号很直接:Agent 往往能够产出集成代码,但在执行、测试和验证环节仍容易留下缺口。

支付集成不是一次 API 调用

一个 Stripe 集成至少横跨三层:

  • 后端创建 Checkout Session,并正确处理金额、币种和商品信息。
  • 前端跳转到托管结账页,再处理成功、取消和重复操作。
  • Webhook 验证签名,根据异步事件更新订单,而不是盲目信任浏览器跳转结果。

这类任务很适合检验 Agent 的端到端工程能力。生成一个看起来合理的 checkout.sessions.create() 调用并不难,难点是确认它能启动、能访问、能在异常输入下返回正确状态,并且不会把未付款订单标记为已完成。

因此,评估 Agent 时不能只检查代码是否出现了正确的 SDK 方法。更有价值的问题包括:依赖是否能安装、环境变量是否完整、路由能否实际调用、Webhook 原始请求体是否保留、测试是否真正执行,以及浏览器最终看到的状态是否与服务端一致。

最容易漏掉的是“证据”

Agent 生成的支付代码可能通过静态检查,却仍然无法投入使用。常见风险包括:

  • 使用占位价格或错误币种,但测试只断言 HTTP 200。
  • 成功页出现后直接认为付款成功,没有等待服务端接收 Webhook。
  • Express 在签名验证前解析了 JSON,导致 Webhook 验证失败。
  • 测试只覆盖正常路径,没有检查缺少参数、重复事件和网络超时。
  • 浏览器自动化只点击按钮,没有断言页面跳转目标和最终订单状态。

这正是“实现”与“验证”的边界:实现回答代码能否表达意图,验证回答系统是否在真实约束下兑现意图。对支付、身份认证和基础设施变更来说,后一个问题通常更重要。

可以这样实践:给 Agent 一条可验证的最小链路

下面不是 Stripe 基准套件的原始题目,而是一个可以用于内部评测的最小项目。运行前需要安装 Node.js,并把测试模式密钥写入 .env。不要使用生产密钥。

先创建项目并安装依赖:

mkdir stripe-agent-check && cd stripe-agent-check
npm init -y
npm install express stripe dotenv
printf 'STRIPE_SECRET_KEY=sk_test_replace_me\nSTRIPE_WEBHOOK_SECRET=whsec_replace_me\n' > .env

创建 server.js

require("dotenv").config();
const express = require("express");
const Stripe = require("stripe");

const app = express();
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

// Webhook 必须在 express.json() 之前读取原始请求体。
app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
  try {
    const event = stripe.webhooks.constructEvent(
      req.body,
      req.headers["stripe-signature"],
      process.env.STRIPE_WEBHOOK_SECRET
    );

    if (event.type === "checkout.session.completed") {
      console.log("paid session:", event.data.object.id);
    }

    res.json({ received: true });
  } catch (error) {
    res.status(400).json({ error: `Invalid webhook: ${error.message}` });
  }
});

app.use(express.json());

app.post("/checkout", async (req, res) => {
  try {
    const quantity = Number(req.body.quantity);
    if (!Number.isInteger(quantity) || quantity < 1 || quantity > 10) {
      return res.status(400).json({ error: "quantity must be an integer from 1 to 10" });
    }

    const session = await stripe.checkout.sessions.create({
      mode: "payment",
      line_items: [{
        quantity,
        price_data: {
          currency: "usd",
          unit_amount: 1500,
          product_data: { name: "Agent integration test item" }
        }
      }],
      success_url: "http://localhost:3000/success?session_id={CHECKOUT_SESSION_ID}",
      cancel_url: "http://localhost:3000/cancel"
    });

    res.status(201).json({ id: session.id, url: session.url });
  } catch (error) {
    res.status(502).json({ error: error.message });
  }
});

app.get("/success", (_req, res) => res.send("Checkout returned successfully"));
app.get("/cancel", (_req, res) => res.send("Checkout cancelled"));

app.listen(3000, () => console.log("Listening on http://localhost:3000"));

启动服务并验证输入边界:

node server.js

# 另开终端:无效数量应返回 HTTP 400
curl -i -X POST http://localhost:3000/checkout \
  -H 'Content-Type: application/json' \
  -d '{"quantity":0}'

# 有效请求应返回 HTTP 201、Session ID 和 Stripe Checkout URL
curl -i -X POST http://localhost:3000/checkout \
  -H 'Content-Type: application/json' \
  -d '{"quantity":1}'

如果本机安装了 Stripe CLI,还可以把测试事件转发到本地服务。先用测试账户登录,再替换 .env 中的 STRIPE_WEBHOOK_SECRET

stripe listen --forward-to localhost:3000/webhook
stripe trigger checkout.session.completed

这组步骤不只验证“代码存在”,还验证进程可以运行、错误输入被拒绝、Stripe 能创建会话、Webhook 签名路径可以执行。进一步评测浏览器流程时,可以要求 Agent 使用 Playwright 打开返回的 url,完成测试模式付款,并在服务端观察到对应的 checkout.session.completed 事件。

把验收标准写进任务,而不是留给 Agent 猜

采用这类 Agent 时,可以把任务拆成可观察的检查点:

  1. 构建检查:从空目录安装依赖并启动服务,禁止依赖未声明的全局工具。
  2. 接口检查:覆盖正常输入、无效输入、Stripe API 失败和超时。
  3. 安全检查:密钥只从环境变量读取,Webhook 必须验证签名,日志不得输出敏感数据。
  4. 浏览器检查:断言跳转域名、取消路径、成功返回页和重复点击行为。
  5. 业务检查:只有经过服务端确认的异步事件才能改变订单状态,并对重复事件保持幂等。
  6. 证据检查:要求提交测试命令、退出码、关键响应和浏览器断言,而不只是提交源码。

Stripe 的这项基准工作提醒开发团队:衡量 Agent 不能停留在“是否写出了像样的代码”。在真实支付链路中,执行结果、测试覆盖和验证证据才决定集成是否可信。更稳妥的采用方式,是让 Agent 负责实现和修复循环,同时用确定性的测试、沙箱账户、权限边界与人工审查约束最终交付。


相关推荐