如何在不覆写现有订阅的情况下完成带3D Secure的订阅更新?
带3D Secure的订阅更新正确实现方式
核心思路就是先通过草稿发票完成支付验证,再正式更新订阅,这样既不会让原有订阅陷入incomplete状态,又能正常处理3D Secure验证流程:
服务端操作步骤
- 针对现有订阅,创建一张草稿发票,把要调整的订阅内容(比如更换价格、修改产品数量)包含进去,调用Stripe的
stripe.invoices.create接口时传入以下参数:const draftInvoice = await stripe.invoices.create({ subscription: '你的现有订阅ID', items: [ // 这里定义订阅的变更条目,比如替换原有价格 { id: '现有订阅中的条目ID', price: '新的价格ID' } ], payment_behavior: 'allow_incomplete', collection_method: 'charge_automatically', status: 'draft' }); - 此时草稿发票会关联一个
payment_intent,检查它的状态:- 如果状态是
requires_action,就把draftInvoice.payment_intent.client_secret发送给客户端。 - 如果状态是
succeeded,说明无需3D验证,直接进行后续收尾操作即可。
- 如果状态是
客户端操作步骤
- 收到
client_secret后,调用confirmCardPayment完成3D Secure验证:const { error } = await stripe.confirmCardPayment(clientSecret, { payment_method: '客户的支付方式ID' }); - 验证成功后,通知服务端执行后续操作。
验证通过后的收尾操作
- 服务端收到验证成功的通知后,将草稿发票标记为完成:
const finalizedInvoice = await stripe.invoices.finalizeInvoice(draftInvoice.id); - 这时候Stripe会自动完成原有订阅的更新,新订阅状态正常,不会处于
incomplete。
方案优势
- 草稿发票不会修改原有订阅,只有当发票完成且支付成功后,订阅才会被更新,完全避免了原有订阅被意外覆写的问题。
- 通过
payment_behavior: 'allow_incomplete'生成的payment_intent可以正常处理3D Secure验证,验证完成后再应用订阅变更,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者zaarr78
相关产品推荐
相关产品推荐

