Stripe 现在会处理这个问题。它可以立即取消订阅并创建一张发票,将当月未使用部分的费用退还给他们。
https://stripe.com/docs/api/subscriptions/cancel
添加“按比例”标签以退还剩余的每月费用。
在 PHP 中:
$subscription = \Stripe\Subscription::retrieve(
'SUBSCRIPTION_ID'
);
$subscription->delete([
'prorate' => true
]);
编辑:
@Dobes Vandermeer 在下面评论并指出了我的错误。上述方法实际上不会退还客户按比例分配的金额,而只会创建一个帐户信用,该信用将应用于下一张发票。
下面的代码实际上会将按比例分配的金额退还到卡中。它会生成一个按比例分配的示例发票,就好像客户将其订阅数量切换为零一样。然后,它会从其有效订阅的最后一张发票中退还按比例分配的金额。
“subscription_proration_date”标签是可选的,但在您需要从某个时间点按比例分配订阅时很有用。
// get active subscription
$subscription = \Stripe\Subscription::retrieve(' SUBSCRIPTION_ID ');
// sample prorated invoice for a subscription with quantity of 0
$sample_subscription_item = array(
"id" => $subscription->items->data[0]->id,
"plan" => $subscription->items->data[0]->plan->id,
"quantity" => 0,
);
$upcoming_prorated_invoice = \Stripe\Invoice::upcoming([
"customer" => $subscription->customer,
"subscription" => $subscription->id,
"subscription_items" => array($sample_subscription_item),
"subscription_proration_date" => ' PRORATED_DATE ', // optional
]);
// find prorated amount
$prorated_amount = 0;
foreach($upcoming_prorated_invoice->lines->data as $invoice) {
if ($invoice->type == "invoiceitem") {
$prorated_amount = ($invoice->amount < 0) ? abs($invoice->amount) : 0;
break;
}
}
// find charge id on the active subscription's last invoice
$latest_invoice = \Stripe\Invoice::retrieve($subscription->latest_invoice);
$latest_charge_id = $latest_invoice->charge;
// refund amount from last invoice charge
if ($prorated_amount > 0) {
$refund = \Stripe\Refund::create([
'charge' => $latest_charge_id,
'amount' => $prorated_amount,
]);
}
// delete subscription
$subscription->delete();