先判断是业务提问,还是商品配置
一位销售服装的开发者询问:能否用 Checkout 自定义字段让顾客选择尺码,并为每个选项限制库存?这证明存在具体集成需求,也提醒我们不要把商品选择推迟到付款页面才处理。[3] 本文讨论少量业务选项的收集与最终答案读取,不讨论元数据在对象之间的传播。
建议先划定边界:不影响价格、不占用稀缺库存、也不包含敏感信息的简单指示,可以考虑自定义字段。尺码对应库存、付费升级等选择,应先在应用内确定商品和价格,再创建结账会话。不要把下拉答案当作库存预留凭证,也不要因为顾客选了一个选项就推断系统会追加扣款。
先分配字段,再设计表单
Stripe 最多允许三个自定义字段,不支持在 setup 模式使用;支持文本、纯数字和下拉类型。文本最多支持二百五十五个字符,数字字段最多二百五十五位,下拉最多二百个选项。官方明确警告,不要用它收集个人、受保护、敏感或法律限制的信息。[1]
为每个问题写清业务用途和答案接收人。答案能枚举时优先使用下拉框,确实无法枚举时再考虑文本。字段默认必填;订单不依赖该答案时,才主动设置 optional=true。[1] 同时定义空答案的含义:采用标准处理,还是交给人工确认?不要等付款后才决定。
把业务标识和显示文案分开
每个字段都需要唯一的 key。接口规定字段键只使用字母和数字,最长二百个字符;下拉选项的显示标签与机器值分开,选项值必须唯一、只含字母和数字,最长一百个字符。[2] 修改文案时应保留这些稳定标识,不要让仓库程序依赖顾客看到的句子。
示例设计:整张订单选择包装方式,设置 key=packing、type=dropdown,两个同价选项分别使用 standard 和 minimal。中文显示“标准包装”“简约包装”,英文页面使用对应英文标签。Stripe 不会自动翻译自定义字段标签,可以设置会话语言与标签一致。[1] 这是设计示例,不是已执行的接口请求。
读取提交值,而非预填值
顾客完成会话后,Stripe 会在 checkout.session.completed 事件中发送已填写的字段;默认值只是付款页预填内容。[1] 在事件携带的会话中按 key 找字段,核对 type,然后读取 dropdown.value、text.value 或 numeric.value。纯数字答案仍是仅含数字的字符串,不是金额型数值。[2]
- 把已完成会话对应到正确的内部订单。
- 按字段键建立答案映射,不依赖数组里的第几个位置。
- 核对类型与允许的下拉值,区分可选字段未填和不认识的答案。
- 保存答案快照、会话标识及本地问题版本,供后续处理复核。
以上是建议的应用控制。答案收集与发货授权必须分开:会话处于完成状态时,付款仍可能正在处理。[4] 看到了包装方式,不代表已经满足放行条件。
允许更正,但不要静默改写历史
官方文档说明,可以在管理后台查看、编辑和导出自定义字段值;对于订阅,也可以通过订阅筛选条件查找创建它的结账会话。[1] 因此,稍后在后台看到的值,不一定与完成时保存的答案相同。
建议保留原始快照,把获授权的更正另行记录。变更包装工单前,确认仓库是否已经开始操作;不要假设后台编辑会同步更新本地数据库。遇到陌生字段键或已经停止提供的选项,应进入异常处理,而不是悄悄替换成默认答案。
上线前检查清单
- 修改预填包装选项,确认下游读取提交后的值。
- 留空可选字段,核对约定的默认处理。
- 调整字段顺序、翻译标签、重复接收事件,确认不会重复修改订单。
- 检查未知选项、业务必需答案缺失,以及付款后的更正流程。
- 即使答案齐全,也让尚未满足付款条件的订单继续等待。
这些检查尚未执行。本文是面向托管结账页的公开文档研究,不代表真实账户测试,也不构成 PayIn 功能承诺。
来源、日期与局限
检索日期为二〇二六年九月二十三日。官方页面未注明发布日期及更新日期;检索日期不等于发布日期。所读材料未建立各国家或地区的账户资格,不能据此声称全球可用。社区问题仅证明定性需求,不代表当前产品行为或搜索量。
- [1] 使用自定义组件扩展结账:采用完整托管页面版本;发布与更新日期未注明。
- [2] 结账会话的自定义字段属性:接口结构参考;应结合自己的接口版本核验;发布与更新日期未注明。
- [3] 如何读取自定义选项并按选项限制库存:发布于二〇二三年八月十一日,编辑于八月十二日;属于历史开发者提问。
- [4] 结账会话对象:支持完成状态与付款状态的区分;发布与更新日期未注明。