Я использую Stripe для управления сервисом подписки, а Laravel Cashier — как API-интерфейс для сервисов Stripe.
У меня есть ситуация, когда я хочу зарегистрировать пользователя в службе, а затем иногда продлить его подписку за пределы первоначальной даты окончания подписки на произвольную сумму. Это поддерживается Stripe, и рекомендуемый способ сделать это использовать конечную точку «обновление подписки» и передать новую trial_end
значение и prorate
значение false / null.
Что мне интересно, так это то, что Laravel Cashier поддерживает эту функцию. Я пробовал:
$user->subscription()->noProrate()->trialFor($newSubscriptionEndDate);
Но, похоже, моя полосовая панель не показывает регистрацию изменений.
Это то, что я могу сделать исключительно с помощью кассира или мне нужно использовать родной Stripe API? StripeGateway
У класса есть несколько методов, относящихся к испытаниям и датам окончания, но у меня возникают проблемы с расшифровкой их предполагаемой функциональности. Благодарю.
Я считаю, что вам нужно использовать своп впоследствии, например,
$user->subscription()->noProrate()->trialFor($newSubscriptionEndDate)->swap();
Вы можете увидеть, что делает своп здесь:
https://github.com/laravel/cashier/blob/5.0/src/Laravel/Cashier/StripeGateway.php#L181-L215
Он возвращает метод create, который также обновляется, если объект customer пропущен, поэтому я предполагаю, что без изменений ваши изменения не будут выполнены в Stripe.
Вот ссылка на кого-то, использующего тот же метод с swap ()
https://github.com/laravel/cashier/pull/142
Если у вас возникли проблемы с сохранением новой даты пробной версии в вашей локальной БД, в свойстве Billable (используется в вашей пользовательской модели) есть метод setTrialEndDate, который вы можете увидеть здесь:
https://github.com/laravel/cashier/blob/5.0/src/Laravel/Cashier/Billable.php#L437-L448
Вы должны быть в состоянии использовать это так:
$user->setTrialEndDate( $date )->save();
РЕДАКТИРОВАТЬ
// getStripeKey is a static method
\Stripe\Stripe::setApiKey( $user::getStripeKey() );
// Get stripe id for customer using public method
$cu = \Stripe\Customer::retrieve( $user->getStripeId() );
// Get current stripe subscription id using public method
$subscription = $cu->subscriptions->retrieve( $user->getStripeSubscription() );
// Update trial end date and save
$subscription->trial_end = $date;
$subscription->save();
Затем вы можете обновить его в Кассе вручную:
$user->setTrialEndDate( $date )->save();
Вы можете написать новую функцию в вашей модели (в которой вы использовали Billable
черта, наверное User
):
class User extends Model implements BillableContract
{
use Billable;
public function MyCustomeCashierFunction($newSubscriptionEndDate)
{
retrun $this->subscription()->noProrate()->trialFor($newSubscriptionEndDate);
}
}
Затем вы можете использовать эту функцию с вашим объектом модели в вашем контроллере:
$user->MyCustomeCashierFunction($newSubscriptionEndDate);
Редактировать:
Также попробуйте это, если функция не работает:
public function MyCustomeCashierFunction($newSubscriptionEndDate)
{
$stripe_gateway = new StripeGateway($this);
retrun $stripe_gateway->subscription()->noProrate()->trialFor($newSubscriptionEndDate);
}
Пожалуйста, дайте мне знать, если это работает.