Stripe Subscription Schedules即时扣费求助:后续账单金额异常
解决Stripe Subscription Schedules发票草稿延迟支付及后续账单0美元问题
问题根源
你遇到的核心问题有两个:
- 订阅计划创建后发票保留为草稿1小时才支付:这是因为Stripe默认对未设置自动收费方式、
collection_method配置为send_invoice等场景的发票会进入草稿状态,等待一段时间后再尝试处理。 - 手动处理首次发票后次日账单金额为0:手动调用
finalizeInvoice和pay会干扰Stripe的自动计费周期逻辑,导致后续账单的金额计算异常。
正确解决方案:让Stripe自动处理所有即时支付
无需手动干预发票流程,通过配置Subscription Schedule的参数,让Stripe自动完成所有账单的即时生成、最终化和支付。
1. 确保计费阶段配置正确
构造$phase时,明确设置collection_method为charge_automatically(Stripe默认值,但需确认未被修改),确保自动收费:
$phase = [ [ 'items' => [ [ 'price' => 'price_XXXXXX', // 替换为你的价格ID 'quantity' => 1, ], ], 'collection_method' => 'charge_automatically', 'end_date' => strtotime('+1 month'), // 示例:第一个计费周期结束时间 ] ];
2. 创建Subscription Schedule时配置自动支付参数
在创建订阅计划时,指定支付方式、设置支付行为为即时处理,避免进入草稿状态:
$subscription = $stripe->subscriptionSchedules->create([ 'customer' => $customer->id, 'start_date' => 'now', 'end_behavior' => 'cancel', 'phases' => $phase, 'default_payment_method' => $source->id, // 绑定支付方式,或确保客户已有默认支付方式 'payment_settings' => [ 'payment_behavior' => 'error_if_incomplete', // 支付失败直接报错,不保留草稿 'save_default_payment_method' => 'on_subscription', // 可选:将该支付方式设为客户默认 ], ]);
为什么之前的手动处理会导致0美元账单?
手动调用finalizeInvoice和pay相当于绕过了Stripe的自动计费逻辑,会让系统误判订阅的计费周期已完成或费用已结清,从而在后续生成金额为0的账单。让Stripe全程自动处理,能保证计费周期和金额计算的准确性。
备选方案:通过Webhook即时处理所有发票
如果需要自定义支付逻辑,可监听Stripe的invoice.created Webhook事件,在发票生成后立即处理:
// 接收Stripe Webhook事件 $payload = @file_get_contents('php://input'); $event = \Stripe\Event::constructFrom(json_decode($payload, true)); if ($event->type === 'invoice.created') { $invoice = $event->data->object; // 仅处理草稿状态的订阅计划发票 if ($invoice->status === 'draft' && $invoice->subscription) { // 最终化发票并完成支付 $stripe->invoices->finalizeInvoice($invoice->id, ['auto_advance' => true]); $stripe->invoices->pay($invoice->id); // 使用客户默认支付方式,或指定source } }
内容的提问来源于stack exchange,提问作者Gia Quyền Trần
相关产品推荐
相关产品推荐

