"扩展和#34;使用Laravel收银员使用Stripe的用户订阅?

时间:2015-11-18 09:42:26

标签: php laravel stripe-payments laravel-cashier

我使用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类确实有许多与试验和结束日期相关的方法,但我无法破译其预期的功能。感谢。

2 个答案:

答案 0 :(得分:2)

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

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

你可以看到这里有什么交换:

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

它返回创建方法,如果客户对象通过,它也会实际更新,所以我假设没有,你的更改不会成为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();

然后您可以使用以下方式手动更新收银台:

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

答案 1 :(得分:0)

您可以在模型中编写一个新函数(使用Billable特征,可能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); 
}

如果有效,请告诉我。