升级Stripe免费订阅至付费订阅时的支付信息收集与关联问题
我的应用会自动为所有用户创建带有Free价格的Stripe Subscription,无需收集支付详情。当用户升级至Paid套餐时,按照Stripe官方订阅升级降级文档的方式更新Subscription,但因客户无支付信息导致API调用失败。
调用代码如下:
stripe_client.subscriptions.update( subscription_id, { "expand": ["latest_invoice.payment_intent"], "items": [ { "id": subscription_item_id, "price": price, "quantity": quantity, } ], }, )
报错信息:
This customer has no attached payment source or default payment method. Please consider adding a default payment method. For more information, visit https://stripe.com/docs/billing/subscriptions/payment-methods-setting#payment-method-priority.
我未使用嵌入式页面,而是采用自定义流程。请问在此流程中应如何收集支付详情?我的目标是在用户尝试订阅Paid套餐时收集支付详情,随后收取订阅费用(通过升级订阅实现)。我了解可手动创建Payment Intent或Setup Intent,但如何将其与Subscription关联?
针对自定义流程下的付费套餐升级场景,你需要先收集用户的支付方式并关联到对应客户,再执行订阅更新操作,具体步骤如下:
1. 创建Setup Intent收集支付方式
Setup Intent用于安全收集并保存用户的支付方式(无需立即扣费),适配订阅场景。后端先创建Setup Intent:
setup_intent = stripe_client.setup_intents.create( customer=customer_id, payment_method_types=["card"] # 根据业务支持的支付方式调整 )
前端使用Stripe Elements加载支付表单,传入Setup Intent的client_secret,引导用户输入支付信息并完成确认。确认成功后,你会得到一个payment_method_id。
2. 将支付方式设为客户的默认支付方式
把收集到的支付方式关联到客户,并设置为默认,确保后续订阅扣费能自动使用:
stripe_client.payment_methods.attach( payment_method_id, customer=customer_id ) stripe_client.customers.update( customer_id, invoice_settings={ "default_payment_method": payment_method_id } )
3. 执行订阅更新操作
完成支付方式关联后,再调用你原来的订阅更新代码即可正常执行,Stripe会自动生成发票并尝试扣费。
另外,也可以在更新订阅时指定payment_behavior参数为default_incomplete,让Stripe自动生成需要用户确认的支付流程,但这种方式更适配嵌入式页面场景,自定义流程还是推荐先手动收集并关联支付方式的方案。
内容的提问来源于stack exchange,提问作者csirmazbendeguz

