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

Stripe订阅模式Checkout结账页如何正确采集收货地址

问题背景

搭建提供实物配送到家服务的在线订阅业务时,结账流程目前仅能正常采集用户姓名、邮编与支付信息,无法引导用户填写完整收货地址,需要排查配置问题并给出调整方案。

现有前端跳转代码

import {loadStripe} from '@stripe/stripe-js'

const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_API_KEY)

export async function initiateCheckout({lineItems} = {}) {
  const stripe = await stripePromise
  await stripe.redirectToCheckout({
    mode: 'subscription',
    lineItems,
    successUrl: `${window.location.origin}?session_id={CHECKOUT_SESSION_ID}`,
    cancelUrl: `${window.location.origin}/microgreens`,
  })
}

触发的报错信息

Uncaught (in promise) IntegrationError: Invalid stripe.redirectToCheckout parameter: shipping_address_collection is not an accepted parameter.

当前结账页效果

Stripe结账页当前效果


问题原因

报错的核心原因是配置位置错误:shipping_address_collection 不属于前端 stripe.redirectToCheckout 方法支持的入参,Stripe 明确要求所有涉及结账规则、信息采集范围的配置,必须在服务端创建 Checkout Session 时设置,前端跳转方法仅支持传入已经生成好的 Session ID 完成跳转,不支持直接在前端声明这类配置。

调整方案

按以下步骤修改即可在订阅模式结账页正常采集完整收货地址:

  • 移除前端跳转逻辑中所有尝试直接传入的收货地址、配送规则类参数,前端不再直接拼接全量结账配置,改为先请求自有服务端接口生成 Checkout Session。
  • 在服务端创建 Stripe Checkout Session 的逻辑中,新增收货地址采集配置,Node.js 环境示例代码如下:
// 服务端 /api/create-checkout-session 接口逻辑
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

export default async function handler(req, res) {
  const {lineItems} = req.body;
  const session = await stripe.checkout.sessions.create({
    mode: 'subscription',
    lineItems,
    successUrl: `${process.env.NEXT_PUBLIC_SITE_URL}?session_id={CHECKOUT_SESSION_ID}`,
    cancelUrl: `${process.env.NEXT_PUBLIC_SITE_URL}/microgreens`,
    // 新增收货地址采集配置
    shipping_address_collection: {
      allowed_countries: ['CN'], // 替换为你实际支持配送的国家/地区二位编码,可添加多个
    },
    // 若需要设置配送运费规则,可额外配置shipping_options参数
  });
  res.status(200).json({sessionId: session.id});
}
  • 调整前端跳转逻辑,先调用服务端接口拿到 Session ID 后再完成跳转,修改后的前端代码如下:
import {loadStripe} from '@stripe/stripe-js'

const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_API_KEY)

export async function initiateCheckout({lineItems} = {}) {
  const stripe = await stripePromise
  // 请求自有服务端接口创建Checkout Session
  const resp = await fetch('/api/create-checkout-session', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({lineItems})
  })
  const {sessionId} = await resp.json()
  // 仅传入sessionId完成跳转,不要在前端加其他结账规则配置
  await stripe.redirectToCheckout({
    sessionId
  })
}

补充说明:订阅模式下Stripe Checkout默认仅采集支付履约必需的最少信息,地址类、税务类、配送规则类配置均不支持在前端设置,必须在服务端创建Session时声明,否则不仅会触发参数错误,也会带来配置被恶意篡改的安全风险。


内容的提问来源于stack exchange,提问作者Tyler Morales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:30:50