Согласно документации Stripe, создается впечатление, что вы действительно можете применить купоны к клиенту в целом, но вы также можете применить купоны к их подпискам. Я пытаюсь применить купон к подписке клиента после того, как подписка уже была создана. Я использую Laravel Cashier 4.2.
Вот что я попробовал:
$company = Auth::user()->company;
$customer = $company->subscription()->getStripeCustomer(); // returns a StripeGateway object
$customer->subscription->applyCoupon($input['coupon_code']);
Вот сообщение об ошибке:
"Call to undefined method Stripe_Subscription::updateSubscription()"
Я могу использовать applyCoupon()
Метод для клиента в целом, но не фактическая подписка … Идеи приветствуются.
В документации Stripe показано только, как удалить скидку из подписки:
Дисконтный объект. Единственная другая информация, которую я смог найти в их документации:
Купоны и скидки
Если вы хотите предоставлять скидки определенным клиентам, вы можете создать коды купонов в Личном кабинете. У купонов есть процент скидки и продолжительность, поэтому вы можете создать купоны, например, 10% пожизненную скидку или 50% скидку на один месяц и т. Д. К купонам также могут быть прикреплены даты истечения срока действия, после чего они не могут быть использованы. Вот пример добавления скидки к подписке пользователя. В этом случае мы уже создали купон с именем 50OFF1MONTH:
curl https://api.stripe.com/v1/customers/cus_4fdAW5ftNQow1a \
-u sk_test_4LOIhlh19aUz8yFBLwMIxnBY: \
-d coupon=50OFF1MONTH
Тем не менее, это не очень полезно. Еще раз, документация Laravel немного элегантна, и в ней отсутствует какая-либо информация по этой теме.
Интересно, нужно ли мне просто заново создать объект подписки с новым купоном … Но это не идеально, потому что для этого нужен карточный токен.
Обновление 1
Я могу подтвердить, что это действительно применяет купон к подписка сам
$user->subscription('monthly')
->withCoupon('code')
->create($creditCardToken);
Тем не менее, еще раз вопрос заключается в том, как можно добавить купон после факта.
Не похоже, что то, что я пытаюсь сделать, возможно, поэтому я нашел другой способ. Все, что я делаю, это меняю существующий план на текущий и использую withCoupon
метод. Похоже, что это применяет купон к подписке и, похоже, не взимает плату с пользователя и не меняет его платежный период, но я могу ошибаться …
$company->subscription($company->stripe_plan)
->withCoupon($input['coupon_code'])
->swap();
Добавление купона в существующую подписку.
Вы также можете использовать метод кассира, как показано ниже:
try {
$user->applyCoupon('coupon_code');
return redirect()->back()->withMessage('Coupon Applied');
} catch (Exception $e) {
return back()->withError($e->getMessage());
}
При применении купона лучше всего обернуть его в блок try / catch, потому что если пользователь введет недействительный купон, Stripe вернет исключение с указанием причины сбоя.