【问题标题】:How to add coupon to *Stripe subscription* with Laravel Cashier after subscription already created创建订阅后如何使用 Laravel Cashier 将优惠券添加到 *Stripe 订阅*
【发布时间】:2016-03-10 18:46:22
【问题描述】:

根据 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% 的终身折扣或一个月 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);

但是,问题又是如何在事后添加优惠券。

【问题讨论】:

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


    【解决方案1】:

    看起来我正在尝试做的事情是不可能的,所以我找到了另一种方法。我所做的就是将用户现有计划交换为当前计划并使用withCoupon 方法。这似乎确实将优惠券应用于订阅,并且似乎不会向用户收费或更改他们的计费周期,但我可能是错的......

    $company->subscription($company->stripe_plan)
            ->withCoupon($input['coupon_code'])
            ->swap(); 
    

    【讨论】:

    • 我想知道你最后遇到了什么困难吗?
    • 据我记得@Rob 没有。但是这个项目早就完成了!
    • @Marcel,我可以请你看看这里的 l Stripe rekated 问题:stackoverflow.com/questions/62238551/… 吗?
    【解决方案2】:

    向现有订阅添加优惠券。 您也可以使用以下收银方式:

    try {
    $user->applyCoupon('coupon_code');
    return redirect()->back()->withMessage('Coupon Applied');  
    } catch (Exception $e) {
    return back()->withError($e->getMessage());
    }
    

    在应用优惠券时,最好将其包装在 try / catch 块中,因为如果用户输入了无效优惠券,Stripe 将返回异常并说明失败的原因。

    【讨论】:

      【解决方案3】:

      对于那些找不到简单方便的方式来用优惠券交换订阅的人,这是我最近想出的。

      首先,我们必须创建一个自定义的Subscription eloquent 模型并扩展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 模型。

      之后,您可以将自己的 Billable 特征应用于计费模型并在交换计划时应用优惠券。

      $user
          ->subscription($product)
          ->withCoupon($coupon)
          ->swap($plan);
      

      【讨论】:

        【解决方案4】:

        将 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());
                }
            } 
        }
        

        【讨论】:

          【解决方案5】:

          从 Cashier v11.* 开始,有新的 convenience methods 来更新底层的 Stripe 订阅对象。要将优惠券应用于用户的 Subscription 模型而不是 Customer 模型,请在控制器中尝试:

          $user->subscription('default')->updateStripeSubscription(['coupon' => $couponCode]);
          

          要从订阅中删除优惠券,请发送更新请求并传递一个空的优惠券字符串。如another question 中所述,设置为空字符串的优惠券将其删除,而传递 null 将被忽略。

          $user->subscription('default')->updateStripeSubscription(['coupon' => '']);
          

          【讨论】:

            猜你喜欢
            • 2018-07-09
            • 2021-02-18
            • 1970-01-01
            • 2014-12-31
            • 2015-05-01
            • 2016-03-04
            • 2015-08-23
            • 1970-01-01
            • 2018-01-15
            相关资源
            最近更新 更多