2016-03-30 3 views
4

Я использую Laravel Cashier вместе с Stripe для управления подписками. Пользователь будет предоставлять информацию о своей кредитной карте при регистрации, но на данный момент они не будут подписаны в конкретном плане. Поэтому я могу успешно использовать Stripe Checkout для создания объекта клиента Stripe и сохранения идентификатора клиента Stripe в моей базе данных. Но когда приходит время для того, чтобы пользователь заходил в план, я не вижу способа использовать идентификатор клиента Stripe, чтобы зарегистрировать их в желаемом плане.Laravel Cashier - Создать новую подписку с существующим объектом клиента

Конечно, я мог бы снова запросить информацию о своей кредитной карте и получить токен Stripe для использования с Laravel Cashier, но я бы хотел этого избежать, поскольку приложение уже создало объект клиента Stripe, когда они подписались, и я Я хотел бы просто использовать существующий объект клиента, чтобы заряжать свою кредитную карту, а не запрашивать номер своей карточки снова.

Чтобы попытаться проиллюстрировать то, что я пытаюсь сделать, вот некоторые примеры кода из документации Laravel:

$user->newSubscription('main', 'monthly')->create($creditCardToken); 

Но то, что я хотел бы быть в состоянии сделать что-то вроде этого (обратите внимание на перейти к методу создания:

$user->newSubscription('main', 'monthly')->create($user->stripe_id); 

Любые советы

+0

Если у пользователя уже есть stripe_id, значит ли это, что у них ранее была подписка? Если это так, вы можете просто возобновить подписку, и если вы хотите изменить ее, измените ее. Или вы пытаетесь выполнить что-то еще? – Sehael

+0

Вы можете создать пользователя полосы без плана, но с помощью кредитной карты. На самом деле, я пытаюсь сделать что-то очень похожее, поэтому добавил щедрость. – Chris

ответ

4

Если есть полоса ID для пользователя, вы не должны поставить маркер

$user->newSubscription('main', 'monthly')->create(); 

Посмотрите на класс SubscriptionBuilder.

+0

Работает так, как ожидалось, но оставляет дату end_at в таблице как есть. Это нормально или здесь что-то не так? – sanky

+0

ends_at должен оставаться равным нулю. Если вы хотите отменить его, вы можете явно сделать это, используя функцию cancel() из класса Subscription. https://github.com/laravel/cashier/blob/6.0/src/Subscription.php –

0

Вы можете попробовать это.

$user->setStripeKey(env("STRIPE_KEY")); 

# card details 
$card = [ 
'card_number' => 'xxxxxxxx', 
'card_cvc' => 'xxx', 
'exp_month' => 'xx', 
'exp_year' => 'xxxx', 
'name' => 'xxx', 
]; 
# generate token 
$token = $this->generateAccessToken($card); 

private function generateAccessToken($card) 
{ 

    $client = new \GuzzleHttp\Client(); 
    $url = 'https://api.stripe.com/v1/tokens'; 
    $pubKey = env("STRIPE_SECRET"); 
    $postBody = [ 
     'key' => $pubKey, 
     'payment_user_agent' => 'stripe.js/Fbebcbe6', 
     'card' => [ 
      'number' => $card['card_number'], 
      'cvc' => $card['card_cvc'], 
      'exp_month' => $card['exp_month'], 
      'exp_year' => $card['exp_year'], 
      'name' => $card['name'] 
     ] 
    ]; 

    $response = $client->post($url, [ 
     'form_params' => $postBody 
    ]); 

    $response_obj = json_decode($response->getbody()->getContents()); 

    return $response_obj->id; 
} 
# main or primary 
$subscription_obj = $user->newSubscription('subscription_name', 'stripe_plan_id')->create($token);