我会尽量把这个问题的来龙去脉说清楚。在stripe中,我有一个按比例的订阅设置,按月向用户收费,这个订阅需要以数量为基础,因为用户可以同时拥有该计划的多个实例。每当用户创建一个新的 "实体",订阅的数量就会增加一个,以匹配用户拥有的 "实体 "数量。
用户可以在任何时候创建一个新的 "实体",每当他们添加一个新的 "实体",就会生成一张新的发票,并立即被收取费用。有一个计费周期锚设置为月末,所以他们只收取当月剩余天数的费用。
用户也可以选择在任何时候停止支付一个 "实体",当这种情况发生时,stripe订阅的数量会减少一个。他们可以继续使用该 "实体",直到月底,然后在下个月到来时不会被收取费用。
然而,这有一个非预期的行为,因为数量与系统中 "活跃 "实体的当前数量不匹配。
为了说明这一点,我将提供一个图表,显示创建 "发票已经支付 "错误消息的行为。我还将展示代码片段,以便更好地理解。
是否有任何方法可以解决这个问题,或者我必须为每个实体切换单个订阅?谢谢你
这里也是错误的确切错误信息
[2020-05-04 10:39:21] local.INFO: (Status 400) (Request req_nKlw7rJHdFJujL) Invoice is already paid
以下是一些代码片段
递增数量代码
public function incrementSubscription(CompanySubscription $subcription, Team $team) {
try {
$quantity = $item->quantity + 1;
$stripe_sub = StripeBiller::updateSubscription($subscription->stripe_id, $quantity);
$subcription->quantity = $stripe_sub_item->quantity;
$subcription->save();
} catch (\Exception $e) {
Log::error('failed to increment subscription item: ' . $item. ' exception :' . $e);
throw $e;
}
$invoice = \Stripe\Invoice::create([
'customer' => $team->billing_account->customer->stripe_customer_id,
'subscription' => $subscription->stripe_id,
]);
$invoice->finalizeInvoice();
$invoice->pay();
}
}
递减数量代码
public function decrementSubscription(CompanySubscription $subscription) {
try {
$quantity = $item->quantity - 1;
$stripe_sub = StripeBiller::updateSubscription($subscription->stripe_id, $quantity);
$subscription->quantity = $stripe_sub_item->quantity;
$subscription->save();
} catch (\Exception $e) {
Log::error('failed to decrement subscription item: ' . $item. ' exception :' . $e);
throw $e;
}
}
创建实体代码
$entity = new Entity();
$entity->name = $request->get('name');
$entity->save();
$subscription = CompanySubscription::where('team_id', '=', $team->id)->get()->first();
if($subscription) {
StripeBiller::updateSubscription($subscription, $subscription->quantity + 1);
} else {
StripeBiller::createCompanySubscription($team->billing_account->customer->stripe_customer_id, $request->get('plan'), $team, $entity);
}