& Quot; Продлить & Quot; подписка пользователя с Stripe с помощью кассы Laravel?

Я использую Stripe для управления сервисом подписки, а Laravel Cashier — как API-интерфейс для сервисов Stripe.

У меня есть ситуация, когда я хочу зарегистрировать пользователя в службе, а затем иногда продлить его подписку за пределы первоначальной даты окончания подписки на произвольную сумму. Это поддерживается Stripe, и рекомендуемый способ сделать это использовать конечную точку «обновление подписки» и передать новую trial_end значение и prorate значение false / null.

Что мне интересно, так это то, что Laravel Cashier поддерживает эту функцию. Я пробовал:

$user->subscription()->noProrate()->trialFor($newSubscriptionEndDate);

Но, похоже, моя полосовая панель не показывает регистрацию изменений.

Это то, что я могу сделать исключительно с помощью кассира или мне нужно использовать родной Stripe API? StripeGateway У класса есть несколько методов, относящихся к испытаниям и датам окончания, но у меня возникают проблемы с расшифровкой их предполагаемой функциональности. Благодарю.

2

Решение

Я считаю, что вам нужно использовать своп впоследствии, например,

$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();
2

Другие решения

Вы можете написать новую функцию в вашей модели (в которой вы использовали 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);
}

Пожалуйста, дайте мне знать, если это работает.

0

По вопросам рекламы [email protected]