【问题标题】:Unable to set trial for subscription in Laravel Cashier 4.2 so that customer does not get charged right away无法在 Laravel Cashier 4.2 中设置订阅试用,因此不会立即向客户收费
【发布时间】:2016-03-10 00:36:05
【问题描述】:

我目前正在使用带有 Stripe 的 Laravel Cashier (4.2)。我使用的当前 Stripe API 版本是 2014-06-17。在创建订阅时,我尝试了各种方式来设置试用结束日期。我已经尝试过这段代码的各种变体:

$company->trial_ends_at = Carbon::now()->addDays(14);
// Also tried this variation of the trial date
// $trialEndDateUnixTimestamp = strtotime(Carbon::parse($company->trial_ends_at));

$company->subscription('annual')
        ->create($creditCardToken, ['description'=>$company->company_name, 'email'=>Auth::user()->email], null);

$company->trial_ends_at = Carbon::now()->addDays(14);;
$company->save(); 

当我查看发送到 Stripe 的请求时,trial_end 始终是 null。任何想法表示赞赏。

官方Laravel Cashier documentation声明如下:

$user->subscription('monthly') ->withCoupon('code') ->create($creditCardToken);

订阅方法将自动创建 Stripe 订阅,并使用 Stripe 客户 ID 和其他相关账单信息更新您的数据库。如果您的计划在 Stripe 中配置了试用,则试用结束日期也会自动设置在用户记录中。

如果您的计划有未在 Stripe 中配置的试用期,您必须在订阅后手动设置试用结束日期:

$user->trial_ends_at = Carbon::now()->addDays(14);

$user->save();

试用日期的手动设置似乎不起作用。我尝试了官方文档概述的方法,并且由于某种原因未应用试用期,因此总是立即向用户收费。

我查看文档越多,我越认为如果它不在 Stripe 端,它甚至不支持试用期。关键是:“如果您的计划有一个未在 Stripe 中配置的试用期,您必须在订阅后手动设置试用结束日期”,但此时,订阅已经创建,因此已经进行了收费....

【问题讨论】:

  • 您是否确认$trialEndDateUnixTimestamp 包含您在将其传递给$customer->subscription->create() 时所期望的内容?
  • 是的。它等于 1450657533 或类似的东西。它不是 NULL。

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


【解决方案1】:

纯属偶然,我遇到了this issue posted in the Laravel Cashier repository

问题的回答者是这样说的:

由于某种原因不在文档中,但您可以这样做:

$user->subscription($plan) ->trialFor($user->trial_ends_at) ->create($creditCardToken, ['email' => $user->email, 'description' => $user->name ]);

这解决了我的问题,因为它创建了订阅,但如果用户有免费试用版,则不会立即向他们收费。我可以通过查看 Stripe 仪表板并查看试用字段已应用于订阅来验证这一点。

【讨论】:

    【解决方案2】:
    $company->trial_ends_at = date('Y-m-d', strtotime("+14 days"));
    

    【讨论】:

      【解决方案3】:

      据我所知,您必须在订阅客户后设置试用结束时间。

      像这样:

      $trialEndDateUnixTimestamp = strtotime(Carbon::parse($company->trial_ends_at));
      
      $customer->subscription('annual')
               ->create(NULL, $customer);
      
      $customer->trial_ends_at = $trialEndDateUnixTimestamp;
      
      $cusomer->save();
      

      Laravel Cashier Docs:

      要创建订阅,首先检索您的计费模型的实例,该实例通常是 App\User 的实例。获取模型实例后,您可以使用订阅方法来管理模型的订阅:

      $user = User::find(1);

      $user->subscription('monthly')->create($creditCardToken);

      create 方法将自动创建 Stripe 订阅,并使用 Stripe 客户 ID 和其他相关账单信息更新您的数据库。如果您的计划在 Stripe 中配置了试用,则试用结束日期也会自动设置在用户记录中。

      如果您想实施试用期,但完全在您的应用程序中管理试用,而不是在 Stripe 中定义它们,您必须手动设置试用结束日期:

      $user->trial_ends_at = Carbon::now()->addDays(14);

      $user->save();

      【讨论】:

      • 你确定它接受 unix 时间戳吗?在示例中它位于YYYY-MM-DD hh:mm:ss
      • 阳性。我还尝试使用确切的Carbon::now()->addDays(14) 作为试用结束日期。
      • 我认为您在查看 5.1 文档时可能会有些混淆。不幸的是,我坚持使用 4.2,但我的答案已被编辑以显示更多代码
      • 我的可计费实体(公司)的数据库记录确实正确设置了该字段,但我认为它对创建订阅时用户实际收取费用的时间没有任何影响。
      猜你喜欢
      • 2016-03-16
      • 2020-12-26
      • 2017-11-09
      • 2020-04-07
      • 2019-06-11
      • 2021-10-21
      • 2016-03-04
      • 2022-10-21
      • 2020-07-08
      相关资源
      最近更新 更多