Laravel Cashier将付款同步到下个月的第一天

时间:2014-11-01 22:26:38

标签: laravel stripe-payments

我一直在尝试使用Laravel Cashier为订阅服务集成支付系统。

我已经设置了RegistrationController,以便计算出下个月第一天的天数。

使用$user->trial_ends_at = Carbon::now()->addDays($datediff);

创建用户时,会设置下个月第一天的试用结束日期。

从这里开始,我想使用$user->onTrial()方法创建实际订阅。

请注意:即使创建了用户,也没有在Stripe中创建客户,因为尚未创建订阅。

我的问题:

在注册表格中,我们会提供卡片详细信息,以便用户订阅和设置付款方式。这涉及条纹验证卡并发送回令牌。

以后可以存储和使用此令牌吗?

假设我以后可以使用此令牌,要在收银台创建实际订阅,我必须使用onTrial方法检查用户试用是否已经结束。

订阅是使用以下方式创建的:

$user->subscription($subscription_plan)->create($stripeToken);

哪里最好添加上述代码,以便订阅用户并在试用期结束时开始结算周期?

在文档中根本没有提到这一点,所以我只是想知道我是否创建了一个新的控制器来实际启动订阅调用该函数以及如何在每个用户试用结束时运行它

修改

使用队列会是这样吗?

http://laravel.com/docs/4.2/queues

$start_subscription = Carbon::now()->addDays($datediff);

Queue::later($start_subscription, 'RegistrationController@subscribe', 
array('stripeToken' => $stripeToken, 'details' => $otherDetails));

然后在设定的时间为每个用户运行订阅方法。

2 个答案:

答案 0 :(得分:1)

对于Stripe令牌,您需要在创建它的片刻之后使用它。预计不会持续更长时间。

至于你的其他问题,我不是Laravel的人,所以我不能说,但PHP的strtotime()函数需要各种字符串并返回时间戳。因此,如果您一直想在下个月的第一天中午开始计费,那么您需要将时间戳设置为:

strtotime('first day of next month 12:00');

希望有所帮助, 拉里

PS我在Stripe的支持工作。

答案 1 :(得分:1)

我注意到在订阅的同时创建Stripe客户存在一些问题。我最终在Stripe中有很多额外的客户,因为如果客户是创建的,但是订阅有错误,它不会在Cashier中连接它们,但是客户在Stripe中连接。

因此,为了将两者分开,我在User模型中创建了一个辅助方法。它将让我在不创建订阅的情况下创建客户。然后我可以在以后创建订阅。

我认为这可以解决您的问题。

用户模型中的助手方法:

    /**
     * Method to create stripe customer without subscription
     */
    public function createStripeCustomer($token, $properties) {
        $gateway = $this->subscription();
        $customer = $gateway->createStripeCustomer($token, $properties);
        $gateway->updateLocalStripeData($customer);
    }

    public function getStripeCustomer() {
        $gateway = $this->subscription();
        return $gateway->getStripeCustomer();
    }

然后在我处理订阅的API控制器中:

    if (!$user->getStripeId()) {
        $user->createStripeCustomer($inputs['token'], ['email' => $user->email]);

        //this can be done at a much later time, the customer is already stored.
        $user->subscription($inputs['plan'])->create(null, [], $user->getStripeCustomer());

        Flash::success("Subscription Success!");

    } elseif (!$user->getStripeSubscription()) {
        $user->subscription($inputs['plan'])->create($inputs['token'], [], $user->getStripeCustomer());

        Flash::success("Subscription Success!");
    }