如何在订阅已创建后使用Laravel Cashier向* Stripe订阅*添加优惠券

时间:2015-12-05 23:06:39

标签: php laravel-4 stripe-payments laravel-cashier

根据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);

然而,问题是如何在事后添加优惠券。

5 个答案:

答案 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' => '']);