根据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文档仅显示如何从订阅中删除折扣: Discount Object。我在其文档中能够找到的唯一其他信息是:
优惠券和折扣
如果您想为某些客户提供折扣,您可以在信息中心中创建优惠券代码。优惠券有折扣百分比和持续时间,因此您可以创建10%终身折扣或1个月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);
然而,问题是如何在事后添加优惠券。
答案 0 :(得分:3)
它看起来不像我想做的事情,所以我找到了另一种方式。我所做的就是将用户现有计划交换到当前计划并使用withCoupon
方法。这确实似乎将优惠券应用于订阅,似乎没有向用户收费或更改其结算周期,但我可能是错的...
$company->subscription($company->stripe_plan)
->withCoupon($input['coupon_code'])
->swap();
答案 1 :(得分:0)
为现有订阅添加优惠券。 您还可以使用以下收银员方法:
try {
$user->applyCoupon('coupon_code');
return redirect()->back()->withMessage('Coupon Applied');
} catch (Exception $e) {
return back()->withError($e->getMessage());
}
应用优惠券时,最好将其包装在try / catch块中,因为如果用户输入无效的优惠券,Stripe将返回异常,并说明失败原因。
答案 2 :(得分:0)
对于每个找不到用优惠券交换订阅的便捷方式的人,这就是我最近想到的。
首先,我们必须创建一个自定义的Subscription
雄辩模型并扩展Laravel\Cashier\Subscription
类。
现在,我们将在此处创建withCoupon()
方法:
public function withCoupon($coupon)
{
$this->coupon = $coupon;
return $this;
}
接下来的事情是扩展原始的swap()
方法并添加优惠券部分。只需复制并粘贴原始方法,然后在$subscription->save();
行之前的某处添加这段代码即可。
...
// Applying the discount coupon if such exists
if ($this->coupon) {
$subscription->coupon = $this->coupon;
}
...
$subscription->save();
要使事情正常运行,您要做的最后一件事是创建自定义Billable
特征并更改subscriptions()
方法以使用自定义Subscription
模型。 / p>
之后,您可以将自己的Billable
特性应用于可计费模型,并在交换计划时应用优惠券。
$user
->subscription($product)
->withCoupon($coupon)
->swap($plan);
答案 3 :(得分:0)
使用Laravel 7.x和Cashier 10,您可以在Billable(用户)模型上使用applyCoupon()方法。
在控制器中是这样的:
/**
* Apply Stripe coupon
*/
public function applyCoupon(Request $request){
$user = $request->user();
if ($user->subscribedToPlan('plan_name', 'default')) {
try {
$user->applyCoupon($request->couponCode);
return redirect('subscription')->withMessage('Coupon Applied');
} catch (\Exception $e) {
return redirect('subscription')->withError($e->getMessage());
}
}
}
答案 4 :(得分:0)
从Cashier v11。*开始,有新的convenience methods用于更新基础的Stripe订阅对象。要将优惠券应用于用户的“订阅”模型而不是“客户”模型,请在控制器中尝试以下操作:
$user->subscription('default')->updateStripeSubscription(['coupon' => $couponCode]);
要从订阅中删除优惠券,请发送更新请求并传递空的优惠券字符串。如another question中所述,设置为空字符串的优惠券会将其删除,而传递 null 会被忽略。
$user->subscription('default')->updateStripeSubscription(['coupon' => '']);