我使用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
类确实有许多与试验和结束日期相关的方法,但我无法破译其预期的功能。感谢。
答案 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);
}
如果有效,请告诉我。