如何复现Stripe客户已绑定卡片但无默认支付方式、sources为空的状态
核心原因
这种「Stripe dashboard显示客户已绑卡,但API返回sources为空、default_source为null」的状态,是新旧版Stripe支付方法API的逻辑差异导致的,旧平台使用了Payment Methods API绑卡,且未显式设置默认支付方式,可通过以下两种方式复现:
1. API端复现
- 操作流程:
- 第一步:调用
PaymentMethod.create创建卡支付方法,或直接使用前端Stripe.js收集到的支付方法ID - 第二步:调用
PaymentMethod.attach将支付方法绑定到对应客户ID,不传入任何设置默认支付方式的参数,也不调用Customer.update修改invoice_settings.default_payment_method字段 - 第三步:调用
Customer.retrieve查询客户数据,默认返回的sources.data为空数组,default_source、invoice_settings.default_payment_method均为null;只有指定expand[]=payment_methods参数时,才能看到已绑定的卡片,和你生产环境的数据结构完全一致。
- 第一步:调用
旧版
Sources API绑卡会自动同步到sources集合并设置为默认值,但Payment Methods API默认不会修改上述字段,仅显式指定时才会更新,这就是旧平台能实现该状态的核心逻辑。
2. Stripe Dashboard端复现
- 操作流程:
- 进入目标客户的详情页面,点击「添加支付方式」
- 输入测试卡信息(测试环境可使用通用测试卡
4242 4242 4242 4242,任意未来有效期、任意3位CVV) - 取消勾选「设置为客户的默认支付方式」选项,完成添加
- 此时调用API拉取客户数据,即可得到目标状态。
迁移补充提示
如果需要批量修复生产环境客户的默认支付方式配置,可先调用Customer.listPaymentMethods提取客户已绑定的卡支付方法,再调用Customer.update将对应支付方法ID赋值给invoice_settings.default_payment_method字段,即可正常发起扣款。
内容的提问来源于stack exchange,提问作者Rins
相关产品推荐
相关产品推荐

