【问题标题】:"Extend" a user's subcription with Stripe using Laravel cashier?使用 Laravel 收银员“扩展”用户对 Stripe 的订阅?
【发布时间】:2016-02-19 23:27:56
【问题描述】:

我正在使用 Stripe 来管理订阅服务,并使用 Laravel Cashier 作为 Stripe 服务的 API 接口。

我有一种情况,我想为用户注册一项服务,然后偶尔将他们的订阅延长到原始订阅结束日期之后的任意数量。这由 Stripe 支持,and the recommended way of doing so 是使用“订阅更新”端点并传递一个新的trial_end 值和一个 prorate 值 false/null。

我想知道 Laravel Cashier 是否支持此功能。我试过了:

$user->subscription()->noProrate()->trialFor($newSubscriptionEndDate); 

但是,我的条纹仪表板似乎没有显示更改注册。

这是我可以专门使用 Cashier 完成的,还是我需要使用原生 Stripe API? StripeGateway 类确实有许多与试验和结束日期有关的方法,但我在解读它们的预期功能时遇到了麻烦。谢谢。

【问题讨论】:

    标签: php laravel stripe-payments laravel-cashier


    【解决方案1】:

    我相信你之后需要使用交换,例如

    $user->subscription()->noProrate()->trialFor($newSubscriptionEndDate)->swap();
    

    你可以在这里看到交换的作用:

    https://github.com/laravel/cashier/blob/5.0/src/Laravel/Cashier/StripeGateway.php#L181-L215

    如果客户对象通过,它会返回实际更新的 create 方法,所以我假设如果没有您的更改将不会使其进入 Stripe。


    这是对使用相同方法和 swap() 的人的引用 https://github.com/laravel/cashier/pull/142

    如果您在本地数据库中保存新的试用日期时遇到问题,您的 Billable 特征(用于您的用户模型)中有一个 setTrialEndDate 方法,您可以在此处查看:

    https://github.com/laravel/cashier/blob/5.0/src/Laravel/Cashier/Billable.php#L437-L448

    你应该可以这样使用它:

    $user->setTrialEndDate( $date )->save();
    

    编辑

    // getStripeKey is a static method
    \Stripe\Stripe::setApiKey( $user::getStripeKey() );
    
    // Get stripe id for customer using public method
    $cu = \Stripe\Customer::retrieve( $user->getStripeId() );
    
    // Get current stripe subscription id using public method
    $subscription = $cu->subscriptions->retrieve( $user->getStripeSubscription() );
    
    // Update trial end date and save
    $subscription->trial_end = $date;
    $subscription->save();
    

    然后您可以在 Cashier 中手动更新它:

    $user->setTrialEndDate( $date )->save();
    

    【讨论】:

    • 嗯。有趣的是,这几乎是我想要完成的。但是,就目前而言,通过在 subscription() 调用中调用 swap() 而不使用订阅 id 参数会产生结果:InvalidRequest in ApiRequestor.php line 102: You passed an empty string for 'plan'. We assume empty values are an attempt to unset a parameter; however 'plan' cannot be unset. You should remove 'plan' from your request or supply a non-empty value. 我认为这是有道理的,因为无法取消计划。这是否意味着我需要使用 Stripe 创建一个hold 计划?当他们得到...时,这是如何工作的?
    • ...在原始订阅到期后重新计费?他们是否会自动按照 $0 保留计划重新计费?
    • @EchoLogic 您可以尝试将它们交换到保留计划中,在此过程中更新他们的试用时间,然后再次将它们交换回原始计划(除非修改,否则试用时间将在计划之间持续存在)-似乎不幸的是,在创建订阅之外完全缺乏有关更新试用时间的信息。
    • @EchoLogic 我还添加了一个示例,说明如何结合使用 Cashier 和 Stripe 在较低级别执行此操作。
    【解决方案2】:

    你可以在你的模型中编写一个新函数(你在其中使用了Billable trait,可能是User):

    class User extends Model implements BillableContract
    {
        use Billable;
    
        public function MyCustomeCashierFunction($newSubscriptionEndDate)
        {
            retrun $this->subscription()->noProrate()->trialFor($newSubscriptionEndDate); 
        }
    }
    

    然后你可以在你的控制器中使用这个函数和你的模型对象:

    $user->MyCustomeCashierFunction($newSubscriptionEndDate);
    

    编辑:

    如果该功能不起作用,也试试这个:

    public function MyCustomeCashierFunction($newSubscriptionEndDate)
    {
        $stripe_gateway = new StripeGateway($this);
    
        retrun $stripe_gateway->subscription()->noProrate()->trialFor($newSubscriptionEndDate); 
    }
    

    如果有效,请告诉我。

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 2018-05-31
      • 2021-10-17
      • 2020-11-03
      • 1970-01-01
      • 2022-10-18
      • 2019-11-01
      • 2021-04-22
      相关资源
      最近更新 更多