4

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

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

4

5 回答 5

4

从 Cashier v11.* 开始,有新的便捷方法可以更新底层的 Stripe 订阅对象。要将优惠券应用于用户的 Subscription 模型而不是 Customer 模型,请在控制器中尝试以下操作:

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

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

$user->subscription('default')->updateStripeSubscription(['coupon' => '']);
于 2020-10-06T13:31:12.667 回答
3

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

$company->subscription($company->stripe_plan)
        ->withCoupon($input['coupon_code'])
        ->swap(); 
于 2015-12-08T19:16:04.393 回答
1

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

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

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

于 2018-06-26T08:17:05.373 回答
1

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

首先,我们必须创建一个自定义的Subscriptioneloquent 模型和扩展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);
于 2019-08-20T09:45:51.133 回答
0

使用带有 Cashier 10 的 Laravel 7.x,您可以在 Billable (User) 模型上使用 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());
        }
    } 
}
于 2020-05-06T17:43:46.543 回答