Laravel Cashier在每个月的最后一天进行Stripe结束试用并开始订阅

时间:2014-12-16 19:30:38

标签: laravel stripe-payments

我尝试使用Stripe和Laravel以及Laravel Cashier根据当月的最后一天为用户创建订阅。所以,我只是设定了该月最后一天的试用结束日期,以阻止它们立即收费:

$user = Auth::user();

$user->trial_ends_at = Carbon::now()->lastOfMonth();
$user->save();
$user->subscription(Input::get('subscription'))->create(Input::get('stripeToken'), [
    'email' => $user->email
]);

return Redirect::to('/profile');

但由于某种原因,Stripe和Laravel忽略了这一点,并且在我的数据库和Stripe admin中,我将试用结束日期设置为Stripe默认值(从今天起40天)。如果我尝试在没有试用的Stripe帐户上进行设置,它会立即向测试用户收费。

我做错了什么?

如果我注释掉$user->subscription...行,它会在数据库中保留正确的时间。

1 个答案:

答案 0 :(得分:5)

经过相当多的混乱之后,我使用Cashier来创建订阅。接下来,我可以使用它来使用带有Stripe API的客户ID来调整试用结束日期。

开头不需要这一点,因为Cashier只会用Stripe中的试用版覆盖它。

// $user->trial_ends_at = Carbon::now()->lastOfMonth();
// $user->save();

使用Cashier设置订阅。有一个试用版,所以卡不收费。

$user->subscription(Input::get('subscription'))->create(Input::get('stripeToken'), [
    'email' => $user->email
]);

现在,使用Stripe API抓住我们刚创建的客户及其订阅

$cu = Stripe_Customer::retrieve($user->stripe_id);
$subscription = $cu->subscriptions->retrieve($user->stripe_subscription);

现在,只有现在,我们可以修改日期(除非我做错了/错过了一招)

$subscription->trial_end = Carbon::now()->lastOfMonth()->timestamp;
$subscription->save();

现在,我们还需要更新数据库表

$user->trial_ends_at = Carbon::now()->lastOfMonth();
$user->save();

所以,一起:

    $user = Auth::user();

    $user->subscription(Input::get('subscription'))->create(Input::get('stripeToken'), [
        'email' => $user->email,
    ]);

    $cu = Stripe_Customer::retrieve($user->stripe_id);
    $subscription = $cu->subscriptions->retrieve($user->stripe_subscription);
    $subscription->trial_end = Carbon::now()->lastOfMonth()->timestamp;
    $subscription->save();

    $user->trial_ends_at = Carbon::now()->lastOfMonth();
    $user->save();