Невозможно установить пробную версию для подписки в Laravel Cashier 4.2, чтобы клиент сразу не получил оплату

В настоящее время я использую Laravel Cashier (4.2) с Stripe. Текущая версия Stripe API, которую я использую, 2014-06-17. Я пытался различными способами установить дату окончания пробного периода при создании подписки. Я перепробовал все варианты этого кода:

$company->trial_ends_at = Carbon::now()->addDays(14);
// Also tried this variation of the trial date
// $trialEndDateUnixTimestamp = strtotime(Carbon::parse($company->trial_ends_at));

$company->subscription('annual')
->create($creditCardToken, ['description'=>$company->company_name, 'email'=>Auth::user()->email], null);

$company->trial_ends_at = Carbon::now()->addDays(14);;
$company->save();

Когда я смотрю на запрос, отправленный в Stripe, trial_end всегда null, Любые идеи приветствуются.

Официальный Документация кассы Laravel заявляет следующее:

$user->subscription('monthly')
->withCoupon('code')
->create($creditCardToken);

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

Если у вашего плана есть пробный период, который не настроен в Stripe, вы должны установить дату окончания пробного периода вручную после подписки:

$user->trial_ends_at = Carbon::now()->addDays(14);

$user->save();

Ручная установка даты пробного периода, похоже, не работает. Я попробовал метод, описанный в официальных документах, и с пользователя всегда взимается плата, потому что по какой-то причине пробный период не применяется.

Чем больше я смотрю на документацию, тем больше я думаю, что она даже не поддерживает пробные периоды, если она не на стороне Stripe. Ключевые строки: «Если у вашего плана есть пробный период, который не настроен в Stripe, вы должны установить дату окончания пробного периода вручную после подписки», но к этому моменту подписка уже была создана, и, таким образом, плата уже была произведена ….

2

Решение

По чистой случайности я наткнулся этот вопрос размещен в репозитории Laravel Cashier.

Ответчик вопроса сказал это:

По какой-то причине не в документации, но вы можете сделать:

$user->subscription($plan)
->trialFor($user->trial_ends_at)
->create($creditCardToken, ['email' => $user->email,
'description' => $user->name
]);

Это решает мой вопрос, так как создает подписку, но не взимает плату с пользователя сразу, если у него есть бесплатная пробная версия. Я могу убедиться в этом, посмотрев на приборную панель Stripe и увидев, что пробное поле было применено к подписке.

2

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

Из того, что я могу сказать, вы должны установить время окончания пробного периода после подписки клиента.

Вот так:

$trialEndDateUnixTimestamp = strtotime(Carbon::parse($company->trial_ends_at));

$customer->subscription('annual')
->create(NULL, $customer);

$customer->trial_ends_at = $trialEndDateUnixTimestamp;

$cusomer->save();

Документы кассира Laravel:

Чтобы создать подписку, сначала получите экземпляр вашей оплачиваемой модели, которая обычно будет экземпляром App \ User. После того как вы получили экземпляр модели, вы можете использовать метод подписки для управления подпиской модели:

$user = User::find(1);

$user->subscription('monthly')->create($creditCardToken);

Метод create автоматически создает подписку Stripe, а также обновляет вашу базу данных с помощью идентификатора клиента Stripe и другой соответствующей платежной информации. Если в вашем плане настроена пробная версия в Stripe, дата окончания пробной версии также будет автоматически указана в записи пользователя.

Если вы хотите реализовать пробные периоды, но полностью управляете пробными версиями в своем приложении, а не определяете их в Stripe, вы должны вручную установить дату окончания пробного периода:

$user->trial_ends_at = Carbon::now()->addDays(14);

$user->save();

1

$company->trial_ends_at = date('Y-m-d', strtotime("+14 days"));
1
По вопросам рекламы [email protected]