You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在调用Stripe结账API时额外传递收货地址数据?

如何在调用Stripe结账API时额外传递收货地址数据?

嘿,我看你已经把基础的Stripe结账流程跑通了,现在想额外传递收货地址对吧?其实很简单,咱们一步步来改:

第一步:修改前端请求体(page.jsx)

你已经定义了包含cartDetails和shippingAddress的requestBody,但之前的请求只传了cartDetails,先把请求体改成完整的对象,顺便加上请求头确保后端能正确解析JSON:

async function onCheckout() {
  setLoading(true);
  const response = await fetch("/api/checkout", {
    method: "POST",
    body: JSON.stringify(requestBody), // 改成完整的请求对象
    headers: {
      "Content-Type": "application/json", // 显式声明JSON格式,避免解析失败
    },
  });
  const data = await response.json();
  const result = await redirectToCheckout(data.id);
  if (result?.error) {
    console.error(result);
  }
  setLoading(false);
}

第二步:后端接收并处理地址数据(route.js)

现在后端需要解析包含两个属性的请求体,这里给你两种常见的处理方式:

选项1:预填Stripe结账页面的收货地址

如果想让用户进入Stripe结账页时,收货地址已经自动填好,可以在创建会话时把地址传入customer_details字段:

export async function POST(request) {
  // 解析请求体,同时拿到购物车和地址数据
  const { cartDetails, shippingAddress } = await request.json();

  const lineItems = validateCartItems(inventory, cartDetails);
  const origin = request.headers.get("origin");

  const session = await stripe.checkout.sessions.create({
    submit_type: "pay",
    mode: "payment",
    payment_method_types: ["card"],
    line_items: lineItems,
    shipping_address_collection: {
      allowed_countries: ["US"],
    },
    shipping_options: [
      {
        shipping_rate: "shr_1Nlx6dJWKRwaU5FYLj34H9wO",
      },
    ],
    billing_address_collection: "auto",
    // 新增:预填收货地址到Stripe页面
    customer_details: {
      name: shippingAddress.name,
      address: {
        line1: shippingAddress.street,
        city: shippingAddress.city,
        // 如果你的地址包含州、邮编、国家,记得补充对应字段,比如state、postal_code、country
      },
    },
    success_url: `${origin}/success?session_id={CHECKOUT_SESSION_ID}`,
    cancel_url: `${origin}/cart`,
  });

  return NextResponse.json(session);
}

选项2:自行保存收货地址(比如存入数据库)

如果不需要预填到Stripe页面,只是想把地址留存下来自己使用,可以在创建Stripe会话前,把地址写入你的数据库:

export async function POST(request) {
  const { cartDetails, shippingAddress } = await request.json();

  // 这里添加地址入库逻辑,比如用Prisma/MySQL等工具
  // await db.shippingAddress.create({
  //   data: {
  //     name: shippingAddress.name,
  //     street: shippingAddress.street,
  //     city: shippingAddress.city,
  //     // 可关联用户ID、订单ID等字段
  //   }
  // });

  const lineItems = validateCartItems(inventory, cartDetails);
  const origin = request.headers.get("origin");

  // 剩下的Stripe会话创建代码保持不变
  const session = await stripe.checkout.sessions.create({
    // ... 原有配置
  });

  return NextResponse.json(session);
}

最后验证

改完后可以打开浏览器开发者工具的Network标签,查看请求体是否同时包含cartDetails和shippingAddress;如果是预填地址的情况,进入Stripe结账页就能看到地址已经自动填充好了。

备注:内容来源于stack exchange,提问作者user21159731

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:54:41