2016-03-30 5 views
4

Ich verwende Laravel Cashier zusammen mit Stripe, um Abonnements zu verwalten. Der Benutzer wird seine Kreditkarteninformationen bei der Anmeldung angeben, aber sie werden zu diesem Zeitpunkt nicht in einem bestimmten Plan abonniert. So kann ich Stripe Checkout erfolgreich verwenden, um ein Stripe-Kundenobjekt zu erstellen und die Stripe-Kundennummer in meiner Datenbank zu speichern. Aber wenn es für den Benutzer an der Zeit ist, sich für einen Plan anzumelden, kann ich keine Möglichkeit finden, die Stripes-Kunden-ID zu verwenden, um sie im gewünschten Plan zu registrieren.Laravel Kassierer - Erstellen eines neuen Abonnements mit vorhandenem Kundenobjekt

Natürlich könnte ich erneut nach ihren Kreditkarteninformationen fragen und einen Stripe-Token für Laravel Cashier erhalten, aber ich möchte dies vermeiden, da die App bereits ein Stripe-Kundenobjekt erstellt hat, als sie sich angemeldet haben Möchte man einfach das vorhandene Kundenobjekt verwenden, um seine Kreditkarte zu belasten, anstatt erneut nach seiner Kartennummer zu fragen.

illustrieren Um zu versuchen, was ich versuche, hier zu tun ist, einige Beispiel-Code aus den Laravel docs:

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

Aber was würde ich in der Lage sein mag, ist, etwas zu tun, wie folgt aus (beachten Sie die wechseln Sie in die create-Methode:

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

Jede Beratung

+0

Wenn der Benutzer bereits eine stripe_id hat, bedeutet das, dass sie vorher ein Abonnement hatten? Wenn dies der Fall ist, können Sie das Abonnement einfach fortsetzen, und wenn Sie es ändern möchten, ändern Sie es. Oder versuchst du etwas anderes zu erreichen? – Sehael

+0

Sie können einen Stripe-Benutzer ohne einen Plan, aber mit einer Kreditkarte erstellen. In der Tat, ich versuche etwas ganz ähnliches zu tun, also habe ich eine Prämie hinzugefügt. – Chris

Antwort

4

Wenn es einen Streifen ID für den Benutzer ist, Sie müssen nicht das Token

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

Werfen Sie einen Blick auf die SubscriptionBuilder Klasse.

+0

Dies funktioniert wie erwartet, aber es bleibt das Datum ends_at in der Tabelle so wie es ist. Ist das normal oder stimmt hier etwas nicht? – sanky

+0

ends_at sollte null bleiben. Wenn Sie den Vorgang abbrechen möchten, können Sie dies explizit mit der Funktion cancel() aus der Subscription-Klasse tun. https://github.com/laravel/cashier/blob/6.0/src/Subscription.php –

0

Sie können dies versuchen.

$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);