Toolkit für den Kassiererhandel


Laravel Cashier

Einführung

Laravel Cashier bietet eine intuitive und reibungslose Benutzeroberfläche für den Zugriff auf die kostenpflichtigen Abonnementdienste von Stripe's und Braintree's. Es kann mit kostenpflichtigen Abonnementcodes umgehen, die einem fast Kopfschmerzen bereiten. Cashier bietet nicht nur eine grundlegende Abonnementverwaltung, sondern kann Ihnen auch bei Gutscheinen, dem Umtausch von Abonnements, Abonnementmengen, Kündigungsfristen und sogar der Erstellung von PDF-Rechnungen behilflich sein.

{Hinweis} Sie sollten Cashier nicht verwenden, wenn Sie nur eine „einmalige“ Gebühr benötigen und kein Abonnement anbieten. Es wird empfohlen, die Stripe- und Braintree-SDKs zu verwenden.

Upgrade von Cashier

Wenn Sie von einer alten Version auf die neueste Version von Cashier aktualisieren, wird dies durchgeführt Es wird empfohlen, dass Sie zuerst lesenKassierer Upgrade-Anleitung.

Konfiguration

Stripe

Komponist

Zuerst hinzufügen Fügen Sie das Cashier-Paket von Stripe zu Ihren Projektabhängigkeiten hinzu:

composer require laravel/cashier

Datenbankmigration

Bevor Sie Cashier verwenden, müssen Sie die Datenbank vorbereiten. Der Kassierer muss Ihrer users-Tabelle einige Spalten hinzufügen und eine neue subscriptions-Tabelle erstellen, um die Abonnements aller Kunden zu speichern:

Schema::table('users', function ($table) {
    $table->string('stripe_id')->nullable()->collation('utf8mb4_bin');    
    $table->string('card_brand')->nullable();    
    $table->string('card_last_four', 4)->nullable();    
    $table->timestamp('trial_ends_at')->nullable();
   });
Schema::create('subscriptions', function ($table) { 
   $table->increments('id');    
   $table->unsignedInteger('user_id');    
   $table->string('name');    
   $table->string('stripe_id')->collation('utf8mb4_bin');    
   $table->string('stripe_plan');    
   $table->integer('quantity');    
   $table->timestamp('trial_ends_at')->nullable();    
   $table->timestamp('ends_at')->nullable();    
   $table->timestamps();
 });

Sobald die Migrationsdatei eingerichtet ist, führen Sie den migrate-Befehl von Artisan aus .

Abrechenbares Modell

Fügen Sie als Nächstes das Merkmal Billable zu Ihrer Modelldefinition hinzu. Diese Eigenschaft bietet mehrere Methoden zum Ausführen allgemeiner Zahlungsaufgaben, wie zum Beispiel das Erstellen von Abonnements, die Verwendung von Gutscheinen und das Aktualisieren von Kreditkarteninformationen:

use Laravel\Cashier\Billable;class User extends Authenticatable{
    use Billable;
  }

API-Schlüssel

Schließlich im Konfiguration Konfigurieren Sie den Stripe-Schlüssel in der Datei services.php Sie können diese Stripe-API-Schlüssel im persönlichen Control Panel der offiziellen Website von Stripe erhalten. Infos:

'stripe' => [
    'model'  => App\User::class,    
    'key' => env('STRIPE_KEY'),    
    'secret' => env('STRIPE_SECRET'),
  ],

Braintree

Braintree-Hinweise

In vielen Fällen implementieren Stripe und Braintree die Kassenfunktionen auf die gleiche Weise. Beide bieten die Funktion der Abonnementzahlung per Kreditkarte, und Braintree unterstützt zusätzlich die Zahlung über PayPal. Allerdings fehlen Braintree auch einige Funktionen, die Stripe unterstützt. Bevor Sie sich für die Verwendung von Stripe oder Braintree entscheiden, müssen Sie die folgenden Punkte berücksichtigen:

  • Braintree unterstützt PayPal, Stripe jedoch nicht.
  • Braintree unterstützt die Methoden increment und decrement nicht. Dies ist eine Einschränkung von Braintree und keine Einschränkung des Kassierers.
  • Braintree unterstützt keine prozentualen Rabatte. Hierbei handelt es sich um eine Braintree-Einschränkung, nicht um eine Cashier-Einschränkung.

Komponist

Fügen Sie zunächst das Cashier-Paket von Braintree zu den Abhängigkeiten Ihres Projekts hinzu:

composer require "laravel/cashier-braintree":"~2.0"

Credit Kartenrabattplan

Mit der Kasse Zuvor müssen Sie im Braintree-Kontrollpanel zunächst einen plan-credit-Rabatt definieren. Dieser Rabatt entspricht dem entsprechenden Rabattverhältnis basierend auf der vom Benutzer gewählten Zahlungsoption, z. B. jährlicher Zahlung oder monatlicher Zahlung.

Der im Braintree-Kontrollfeld konfigurierte Gesamtrabattbetrag kann nach Wunsch eingegeben werden, und der Kassierer überschreibt bei jeder Verwendung eines Gutscheins den Standardwert gemäß Ihrer Konfiguration. Dieser Coupon ist erforderlich, da Braintree die Verwendung der Abonnementhäufigkeit zur Anpassung an Rabattverhältnisse nicht unterstützt.

Datenbankmigration

Bevor Sie Cashier verwenden, müssen Sie die Datenbank vorbereiten. Der Kassierer muss Ihrer Datenbank-users-Tabelle einige neue Spalten hinzufügen und eine neue subscriptions-Tabelle erstellen, um Kundenabonnementinformationen zu speichern:

Schema::table('users', function ($table) { 
   $table->string('braintree_id')->nullable();    
   $table->string('paypal_email')->nullable();    
   $table->string('card_brand')->nullable();    
   $table->string('card_last_four')->nullable();    
   $table->timestamp('trial_ends_at')->nullable();
   });
Schema::create('subscriptions', function ($table) {
    $table->increments('id');    
    $table->unsignedInteger('user_id');    
    $table->string('name');    
    $table->string('braintree_id');    
    $table->string('braintree_plan');    
    $table->integer('quantity');    
    $table->timestamp('trial_ends_at')->nullable();    
    $table->timestamp('ends_at')->nullable();    
    $table->timestamps();
   });

Sobald die Migrationsdatei erstellt ist, führen Sie den migrate-Befehl von Artisan aus.

Abrechenbares Modell

Dann fügen Sie das Billable Merkmal zu Ihrer Modelldefinition hinzu:

use Laravel\Cashier\Billable;
class User extends Authenticatable{ 
   use Billable;
  }

API-Schlüssel

Als nächstes sollten Sie bei services.php sein Konfigurieren Sie die folgenden Optionen in der Datei:

'braintree' => [
    'model'  => App\User::class,    
    'environment' => env('BRAINTREE_ENV'),    
    'merchant_id' => env('BRAINTREE_MERCHANT_ID'),    
    'public_key' => env('BRAINTREE_PUBLIC_KEY'),    
    'private_key' => env('BRAINTREE_PRIVATE_KEY'),
  ],

Abschließend müssen Sie das folgende Braintree SDK zur AppServiceProvider-Methode des bootDienstanbieters hinzufügen Rufen Sie an:

\Braintree_Configuration::environment(config('services.braintree.environment'));
\Braintree_Configuration::merchantId(config('services.braintree.merchant_id'));
\Braintree_Configuration::publicKey(config('services.braintree.public_key'));
\Braintree_Configuration::privateKey(config('services.braintree.private_key'));

Währungskonfiguration

Kassierer verwendet US-Dollar (USD) als Standardwährung. Sie können die Standardwährung ändern, indem Sie die Methode boot in der Methode Cashier::useCurrency des Dienstanbieters aufrufen. Diese useCurrency-Methode akzeptiert zwei Zeichenfolgenparameter: Währung und Währungssymbol:

use Laravel\Cashier\Cashier;
Cashier::useCurrency('eur', '€');

Subscribe

Erstellen Sie ein Abonnement

Um ein Abonnement zu erstellen, müssen Sie zunächst eine kostenpflichtige Modellinstanz erhalten, bei der es sich normalerweise um eine Instanz von AppUser handelt. Sobald Sie die Modellinstanz erhalten haben, können Sie mit der Methode newSubscription ein Abonnement für das Modell erstellen:

$user = User::find(1);
$user->newSubscription('main', 'premium')->create($stripeToken);

newSubscription Das erste Argument der Methode sollte der Name des Abonnements sein. Wenn Ihre Anwendung nur ein Abonnement anbietet, können Sie es auf main oder primary einstellen. Der zweite Parameter ist der Stripe/Braintree-Plan, den der Benutzer abonniert hat. Dieser Wert sollte einem Bezeichner in Stripe oder Braintree entsprechen. Die Methode

create akzeptiert eine Stripe-Kreditkarte/einen Quell-Token, der das Abonnement startet und die Datenbank mit der Kunden-ID und anderen relevanten Rechnungsinformationen aktualisiert.

Zusätzliche Details des Benutzers

Wenn Sie zusätzliche Details des Benutzers angeben möchten, können Sie dies tun, indem Sie diese als zweiten Parameter an create übergeben Methode:

$user->newSubscription('main', 'monthly')->create($stripeToken, [
    'email' => $email,
   ]);

Um mehr über Stripe oder die zusätzlichen von Braintree unterstützten Felder zu erfahren, schauen Sie sich Stripe an Content Creation Customer Documentation oder die entsprechende Braintree Documentation.

Gutschein

Wenn Sie beim Erstellen Ihres Abonnements einen Gutschein verwenden möchten, können Sie withCoupon verwenden Methoden:

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

Abonnementstatus prüfen

Sobald sich der Benutzer in Ihrer App angemeldet hat, können Sie jedes A verwenden bequeme Möglichkeit, den Abonnementstatus einfach zu überprüfen. Erstens: Wenn der Benutzer ein aktives Abonnement hat, gibt die subscribed-Methode true zurück, auch wenn sich das Abonnement derzeit in der Testphase befindet:

if ($user->subscribed('main')) {
    //
  }

Diese subscribed-Methode kann auch beim Routing verwendet werden Middleware, die Ihnen Zugriff auf Routen und Controller basierend auf dem Abonnementstatus des Benutzers ermöglicht:

public function handle($request, Closure $next){
    if ($request->user() && ! $request->user()->subscribed('main')) {
      // This user is not a paying customer...        
      return redirect('billing');   
     }    
    return $next($request);
 }

Wenn Sie feststellen möchten, ob sich der Benutzer noch in der Testversion befindet, können Sie diese verwenden onTrial Methode. Diese Methode ist nützlich, um dem Benutzer eine Warnung anzuzeigen, dass er sich noch im Testzeitraum befindet:

if ($user->subscription('main')->onTrial()) {
    //
   }

Basierend auf einer bestimmten Stripe-/Braintree-Plan-ID kann die subscribedToPlan-Methode verwendet werden, um festzustellen, ob der Benutzer hat den Plan abonniert. In diesem Beispiel ermitteln wir, ob das main-Abonnement des Benutzers einen aktiven monthly-Plan hat: Die Methode

if ($user->subscribedToPlan('monthly', 'main')) {
    //
   }

recurring kann verwendet werden, um festzustellen, ob der Benutzer derzeit abonniert ist und nicht mehr dabei ist die Probephase:

if ($user->subscription('main')->recurring()) {
    //
   }

Abmeldestatus

Um festzustellen, ob ein Benutzer einmal ein Abonnement hatte, sein Abonnement aber gekündigt hat, können Sie die cancelled-Methode verwenden:

if ($user->subscription('main')->cancelled()) {
    //
   }

Sie können auch feststellen, ob der Benutzer ein Abonnement hat Das Abonnement wurde gekündigt, befindet sich jedoch noch in der „Nachfrist“ des Abonnements, bis das Abonnement vollständig abläuft. Wenn ein Benutzer beispielsweise am 5. März ein Abonnement kündigt, das am 10. März ablaufen sollte, hat der Benutzer eine „Kulanzfrist“ bis zum 10. März. Beachten Sie, dass die subscribed-Methode während dieser Zeit immer noch true zurückgibt:

if ($user->subscription('main')->onGracePeriod()) {
    //
  }

Wenn Sie feststellen möchten, ob der Zeitpunkt, zu dem sich der Benutzer abgemeldet hat, nicht mehr innerhalb seiner „Nachfrist“ liegt, können Sie ended verwenden Methode:

if ($user->subscription('main')->ended()) {
    //
  }

Abonnementplan ändern

Nachdem Benutzer Ihre App abonniert haben, möchten sie möglicherweise gelegentlich zu wechseln ein neues Abonnement. Um einen Benutzer zu einem neuen Abonnement zu wechseln, übergeben Sie die Abonnementplan-ID an die swap-Methode:

$user = App\User::find(1);
$user->subscription('main')->swap('provider-plan-id');

Wenn sich der Benutzer in einem Testzeitraum befindet, bleibt die Dauer des Testzeitraums erhalten. Wenn darüber hinaus ein „Anteil“ für die Anzahl der Abonnements besteht, wird dieser Anteil auch beibehalten.

Wenn Sie den Testzeitraum des aktuellen Abonnements des Benutzers kündigen möchten, wenn Sie den Abonnementplan des Benutzers ändern, können Sie die skipTrial-Methode verwenden:

$user->subscription('main')    
    ->skipTrial()        
    ->swap('provider-plan-id');

Abonnements

{Hinweis} Abonnements werden nur über Cashier's Stripe abgewickelt. Braintree verfügt nicht über eine „Mengen“-Funktion, die Stripe entspricht.

Manchmal werden Abonnements von der „Menge“ beeinflusst. Die Kosten für Ihre App könnten beispielsweise 10 $/Monat pro Konto betragen. Sie können Ihr Abonnement ganz einfach mit den Methoden und incrementQuantity erhöhen oder verringern: decrementQuantity

$user = User::find(1);
$user->subscription('main')->incrementQuantity();
// 对当前的订阅量加5...
$user->subscription('main')->incrementQuantity(5);
$user->subscription('main')->decrementQuantity();
// 对当前的订阅量减5...
$user->subscription('main')->decrementQuantity(5);

Alternativ können Sie mit der Methode

einen bestimmten Betrag festlegen: updateQuantity

$user->subscription('main')->updateQuantity(10);

Die Methode kann verwendet werden, um die Abonnementmenge zu aktualisieren, ohne die Gebühr zu berechnen: noProrate

$user->subscription('main')->noProrate()->updateQuantity(10);

Weitere Informationen zur Abonnementmenge finden Sie unter

Stripe Dokument.

Abonnementsteuer

implementiert die

-Methode im Abrechnungsmodus und gibt eine A-Nummer zurück von 0 bis 100, nicht mehr als 2 Eine Dezimalzahl, die den Steuerprozentsatz angibt, den Benutzer für ihr Abonnement zahlen. Mit der taxPercentage

public function taxPercentage() {
    return 20;
   }

-Methode können Sie Steuersätze auf Modellbasis anwenden, was für eine Benutzerbasis hilfreich sein kann, die mehrere Länder und Steuersätze umfasst. taxPercentage

{Hinweis}

Diese Methode gilt nur für das kostenpflichtige Abonnementmodell. Wenn Sie Gebühren verwenden, um „einmalige“ Gebühren zu erheben, müssen Sie gleichzeitig den Steuersatz manuell angeben. taxPercentage

Steuersatz synchronisieren

Beim Ändern des von der taxPercentage-Methode zurückgegebenen hartcodierten Werts bleiben die Steuersatzeinstellungen für alle vorhandenen Abonnements für den Benutzer unverändert. Wenn Sie den Steuersatz eines bestehenden Abonnements mit dem zurückgegebenen taxPercentage-Wert aktualisieren möchten, sollte die Methode syncTaxPercentage auf der Abonnementinstanz des Benutzers aufgerufen werden:

$user->subscription('main')->syncTaxPercentage();

Ankerdatum des Abonnements

{Hinweis} Nur an der Kasse Stripe unterstützt die Änderung der Ankerdaten für Abonnements.

Standardmäßig ist der Abrechnungszeitraum an dem Datum verankert, an dem das Abonnement erstellt wurde, oder bei Verwendung eines Testzeitraums an dem Datum, an dem die Testversion endet. Wenn Sie das Abrechnungsankerdatum ändern möchten, können Sie die anchorBillingCycleOn-Methode verwenden:

use App\User;use Carbon\Carbon;
$user = User::find(1);
$anchor = Carbon::parse('first day of next month');
$user->newSubscription('main', 'premium')      
      ->anchorBillingCycleOn($anchor->startOfDay())            
      ->create($stripeToken);

Weitere Informationen zum Verwalten der Abonnement-Abrechnungszyklen finden Sie unter Stripe Abrechnungszyklusdokument

Abonnement kündigen

Rufen Sie die Methode cancel im Benutzerabonnement auf, um „Abbestellen“ zu verwenden :

$user->subscription('main')->cancel();

Wenn ein Abonnement gekündigt wird, Kassierer legt automatisch die Spalte ends_at in Ihrer Datenbank fest. Diese Spalte wird oft verwendet, um zu wissen, wann ein subscribed-Feld anfangen soll, false zurückzugeben. Wenn der Kunde beispielsweise sein Abonnement am 1. März kündigt, das Abonnement jedoch erst am 5. März endet, gibt die subscribed-Methode bis zum 5. März weiterhin true zurück.

Mit der onGracePeriod-Methode können Sie feststellen, ob der Benutzer sicher ein Abonnement abschließt, es aber noch eine „Schonfrist“ gibt:

if ($user->subscription('main')->onGracePeriod()) {
    //
   }

Wenn Sie das Abonnement sofort kündigen möchten, Bitte rufen Sie < im Abonnement des Benutzers 🎜> auf Methode: cancelNow

$user->subscription('main')->cancelNow();

Abonnement wiederherstellen

Wenn sich ein Benutzer abgemeldet hat, können Sie es bei Bedarf wiederherstellen

Methode. Benutzer resumemüssen sich noch innerhalb ihrer Kulanzfrist befinden, bevor sie ihr Abonnement fortsetzen können:

$user->subscription('main')->resume();

Wenn ein Benutzer sein Abonnement gekündigt hat und es dann vor der Kulanzfrist für das Abonnement wieder aufnimmt, geschieht dies nicht sofort gezählte Gebühr. Stattdessen wird ihr Abonnement reaktiviert und sie müssen erneut gemäß dem ursprünglichen Zahlungsvorgang bezahlen.

Probeabonnement

Mit Kreditkarte abonnieren

Wenn Sie Ihren Kunden einen Testzeitraum anbieten und gleichzeitig Informationen zur Zahlungsmethode sammeln möchten, sollten Sie beim Erstellen des Abonnements die trialDays-Methode verwenden:

$user = User::find(1);$user->newSubscription('main', 'monthly')    
        ->trialDays(10)            
        ->create($stripeToken);

Diese Methode Die Endzeit des Abonnementzeitraums wird im Datenbankabonnementdatensatz festgelegt, um Sripe/Braintree anzuweisen, die Rechnungsinformationen des Benutzers bis dahin nicht zu berechnen.

{Hinweis} Abonnements werden automatisch in Rechnung gestellt, wenn der Kunde nicht vor Ablauf der Testversion kündigt. Daher sollten Sie Ihre Benutzer unbedingt über das Ende der Testversion informieren. Die

trialUntil-Methode ermöglicht die Bereitstellung einer DateTime-Instanz zur Angabe des Testendzeitraums:

use Carbon\Carbon;$user->newSubscription('main', 'monthly')        
    ->trialUntil(Carbon::now()->addDays(10))            
    ->create($stripeToken);

Sie können die onTrial-Methode der Benutzerinstanz oder die onTrial Methode der Abonnementinstanz, um festzustellen, ob sich der Benutzer im Testzeitraum befindet. Die folgenden zwei Beispiele sind gleichwertig:

if ($user->onTrial('main')) { 
   //
  }
if ($user->subscription('main')->onTrial()) {  
  //
 }

Abonnement ohne Kreditkarte

Wenn Sie nicht möchten Bieten Sie einen Testzeitraum an. Um Informationen zur Benutzerzahlungsmethode zu sammeln, legen Sie einfach den Benutzerdatensatz trial_ends_at fest Geben Sie einfach das gewünschte Enddatum der Testversion an, was normalerweise bei der Benutzerregistrierung erfolgt:

$user = User::create([ 
   // Populate other user properties...    
   'trial_ends_at' => now()->addDays(10),
 ]);

{Hinweis} Stellen Sie sicher, dass Sie den Datumsmodifikator trial_ends_at zur Modelldefinition hinzugefügt haben.

Cashier bezeichnet diese Art von Referenz als „allgemeine Erfahrung“, da sie nicht mit einem bestehenden Abonnement verknüpft ist. Wenn das aktuelle Datum den trail_ends_at-Wert nicht überschreitet, gibt die User-Methode der onTrial-Instanz true zurück:

if ($user->onTrial()) { 
   // 用户在他们的试用期内...
  }

Wenn Sie explizit wissen möchten, dass sich der Benutzer im „ „Normaler“ Testzeitraum und auch kein tatsächliches Abonnement erstellt wird, dann können Sie onGenericTrial verwenden Methode:

if ($user->onGenericTrial()) {
    // 用户在他们「一般」试用期...
   }

Wenn Sie ein tatsächliches Abonnement für den Benutzer erstellen möchten, können Sie normalerweise newSubsription verwenden Methode:

$user = User::find(1);
$user->newSubscription('main', 'monthly')->create($stripeToken);

Kunde

Kunden erstellen

Manchmal möchten Sie möglicherweise einen Kunden ohne Abonnement erstellen Stripe-Kunden. Sie können dies mit der createAsStripeCustomer-Methode tun:

$user->createAsStripeCustomer();

Sobald der Kunde in Stripe erstellt wurde, können Sie das Abonnement später starten.

{Tipp} Beim Erstellen von Kunden in Braintree wird die createAsBraintreeCustomer-Methode verwendet.

Bankkarte

Kreditkarte erhalten

auf einer kostenpflichtigen Modellinstanz Die cards-Methode gibt eine Sammlung von LaravelCashierCard-Instanzen zurück:

$cards = $user->cards();

Um die Standardkarte abzurufen, können Sie die defaultCard-Methode

$card = $user->defaultCard();

< verwenden 🎜>

Stellen Sie sicher, dass die Kartennummer gespeichert ist

Sie können mit der hasCardOnFile-Methode überprüfen, ob ein Kunde eine Kreditkarte auf seinem Konto gespeichert hat:

if ($user->hasCardOnFile()) {
    //
   }

Kreditkarte aktualisieren

updateCard Mit dieser Methode können die Kreditkarteninformationen des Benutzers aktualisiert werden, indem ein Stripe-Token akzeptiert und eine neue Kreditkarte als Standardzahlungsquelle festgelegt wird:

$user->updateCard($stripeToken);

Stripe synchronisiert Ihre Karteninformationen mit den Standardkarteninformationen des Kunden Verwenden Sie updateCardFromStripe Methode:

$user->updateCardFromStripe();

Kreditkarte löschen

Um eine Karte zu löschen, sollten Sie zunächst die Karte des Kunden mithilfe des abrufen cards Methode . Anschließend können Sie die Methode delete für die Karteninstanz aufrufen, die Sie löschen möchten:

foreach ($user->cards() as $card) {
    $card->delete();
  }

{Hinweis} Wenn Sie die Standardkarte löschen möchten, stellen Sie sicher, dass Sie die Methode updateCardFromStripe verwenden Synchronisieren Sie die neue Standardkarte mit der Datenbank. Die Methode

deleteCards löscht alle von der Anwendung gespeicherten Karteninformationen des Benutzers:

$user->deleteCards();

{Hinweis} Wenn der Benutzer bereits ein Abonnement hat, sollten Sie darüber nachdenken verhindern, dass sie die letzte verbleibende Zahlungsmethode löschen.

Umgang mit Stripe-Webhooks

Sowohl Stripe als auch Braintree können Anwendungen verschiedener Typen über Webhook-Ereignisse benachrichtigen. Um Stripe-Webhooks zu verarbeiten, müssen Sie eine Route zum Webhook-Controller von Cashier definieren. Dieser Controller verarbeitet alle eingehenden Webhook-Anfragen und leitet sie an die entsprechende Controller-Methode weiter:

Route::post( 
   'stripe/webhook',    
   '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook'
   );

{Hinweis} Sobald die Route registriert ist, stellen Sie sicher, dass Sie den Webhook in der URL Ihres Stripe-Kontrollfelds konfigurieren.

Standardmäßig kündigt dieser Controller automatisch Abonnements, die zu oft fehlschlagen (diese Anzahl kann in den Stripe-Einstellungen definiert werden). Darüber hinaus werden wir bald feststellen, dass Sie diesen Controller erweitern können, um alle abzuwickeln Webhook-Ereignisse, die Sie verarbeiten möchten.

{Hinweis} Bitte stellen Sie sicher, dass Sie die Webhook-Signaturüberprüfungs-Middleware von Cashier verwenden, um eingehende Anfragen zu schützen.

Webhooks & CSRF-Schutz

Da Stripe-Webhooks den CSRF-Schutz von Laraval umgehen müssen, stellen Sie bitte sicher, dass Sie URI in Ihre VerifyCsrfToken Middleware oder Ihren Place einschließen es in web Außerhalb der Middleware-Gruppe:

protected $except = [
    'stripe/*',
   ];

Definieren Sie Webhook-Ereignishandler

Cashier meldet sich bei fehlgeschlagenen Zahlungen automatisch ab. Wenn Sie jedoch andere Stripe-Webhook-Ereignisse verarbeiten möchten, können Sie den Webhook-Controller erweitern. Ihre Methodennamen sollten den von Cashier erwarteten Konventionen entsprechen, und insbesondere sollten den Methoden, die Sie Stripe-Webhooks verarbeiten möchten, die Namen handle und „camelCase“ vorangestellt werden. Wenn Sie beispielsweise den Webhook von invoice.payment_succeeded verarbeiten möchten, sollten Sie die Methode handleInvoicePaymentSucceeded zu Ihrem Controller hinzufügen:

<?php
    namespace App\Http\Controllers;
    use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;
    class WebhookController extends CashierController{  
      /**
     * Handle invoice payment succeeded.
     *
     * @param  array  $payload
     * @return \Symfony\Component\HttpFoundation\Response
     */   
      public function handleInvoicePaymentSucceeded($payload)  
        {     
           // 此处处理事件   
         }
      }

Als Nächstes definieren Sie Cashier in der Datei routes/web.php Route des Controllers:

Route::post( 
   'stripe/webhook',    
   '\App\Http\Controllers\WebhookController@handleWebhook'
  );

Abonnement fehlgeschlagen

Was passiert, wenn die Kreditkarte des Benutzers abläuft? Keine Sorge – Cashier verfügt über einen Webhook-Controller, der Benutzer problemlos für Sie abmelden kann. Wie oben erwähnt, müssen Sie lediglich die Route auf den Controller zeigen:

Route::post( 
   'stripe/webhook',    
   '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook'
  );

Das ist es! Fehlgeschlagene Zahlungen werden erfasst und vom Controller verarbeitet, der das Abonnement des Benutzers kündigt, nachdem Stripe feststellt, dass das Abonnement fehlgeschlagen ist (in der Regel 3 oder mehr fehlgeschlagene Zahlungsversuche).

Überprüfung der Webhook-Signatur

Um den Webhook zu schützen, müssen Sie Stripes Webhook-Signatur verwenden . Der Einfachheit halber enthält Cashier eine Middleware, die überprüft, ob an den Stripe-Webhook weitergeleitete Anfragen gültig sind.

Wenn Sie die Webhook-Validierung aktivieren möchten, stellen Sie sicher, dass der Wert von services in der Konfigurationsdatei stripe.webhook.secret festgelegt ist. secret für Webhooks finden Sie im Stripe User Control Panel.

Umgang mit Braintree-Webhooks

Sowohl Stripe als auch Braintree können Anwendungen über Webhooks über verschiedene Ereignisse benachrichtigen. Um Braintree-Webhooks zu verarbeiten, müssen Sie eine Route zum Cashier-Webhook-Controller definieren. Dieser Controller verarbeitet alle eingehenden Webhook-Anfragen und leitet sie an die entsprechende Router-Methode weiter:

Route::post(
    'braintree/webhook',    
    '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook'
    );

{Hinweis} Sobald die Route registriert ist, stellen Sie sicher, dass die Webhook-URL im Braintree-Controller-Panel konfiguriert ist.

Standardmäßig kündigt dieser Controller automatisch Abonnements mit zu vielen fehlgeschlagenen Zahlungen (diese Anzahl kann in den Braintree-Einstellungen definiert werden). Wir werden bald feststellen, dass Sie diesen Controller erweitern können Behandeln Sie alle Webhook-Ereignisse, die Sie verarbeiten möchten.

Webhooks und CSRF-Schutz

Da Braintree-Webhooks den CSRF-Schutz von Laravel umgehen müssen, stellen Sie bitte sicher, dass Sie den URI in Ihre VerifyCsrfToken Middleware-Liste aufnehmen oder Place hinzufügen es in web Außerhalb der Middleware-Gruppe:

protected $except = [ 
   'braintree/*',
  ];

Webhook-Ereignishandler definieren

Cashier meldet sich bei fehlgeschlagenen Zahlungen automatisch ab. Wenn Sie jedoch andere Braintree-Webhook-Ereignisse verarbeiten möchten, können Sie den Webhook-Controller erweitern. Ihre Methodennamen sollten der von Cashier erwarteten Konvention entsprechen, und insbesondere sollten den Methoden, die Sie mit dem Braintree-Webhook verarbeiten möchten, die Namen handle und „camelCase“ vorangestellt werden. Wenn Sie beispielsweise den Webhook dispute_opened verarbeiten möchten, sollten Sie die Methode handleDisputeOpened zum Controller hinzufügen:

<?php
    namespace App\Http\Controllers;
    use Braintree\WebhookNotification;
    use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;
    class WebhookController extends CashierController{ 
       /**
     * Handle a new dispute.
     *
     * @param  \Braintree\WebhookNotification  $webhook
     * @return \Symfony\Component\HttpFoundation\Responses
     */  
      public function handleDisputeOpened(WebhookNotification $webhook)  
        {    
            // 此处处理时事件... 
         }
     }

Abonnement fehlgeschlagen

Was passiert, wenn die Kreditkarte des Benutzers abläuft? Keine Sorge – Cashier verfügt über einen Webhook-Controller, der Benutzer problemlos für Sie abmelden kann. Zeigen Sie einfach die Route auf den Controller:

Route::post(
    'braintree/webhook',    
    '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook'
  );

Das ist es! Fehlgeschlagene Zahlungen werden erfasst und vom Controller verarbeitet, der das Abonnement des Benutzers kündigt, nachdem Braintree feststellt, dass das Abonnement fehlgeschlagen ist (normalerweise 3 oder mehr fehlgeschlagene Zahlungsversuche). Vergessen Sie nicht: Konfigurieren Sie den Webhook-URI in Ihrem Braintree-Controller-Panel.

Einmalige Zahlung

Einfache Zahlung

{Hinweis} Bei Verwendung von Stripe akzeptiert die Methode charge den Betrag, den Sie zahlen möchten, in der kleinsten Einheit der von der Anwendung verwendeten Währung. Wenn Sie jedoch Braintree nutzen, sollten Sie den gesamten Dollarbetrag in die charge-Methode übergeben:

Wenn Sie die Kreditkarte des Abonnenten mit einer „einmaligen“ Gebühr belasten möchten, können Sie dies tun Verwenden Sie also in Billable die Methode charge für die Modellinstanz:

// Stripe 接收分为单位的费用...
$stripeCharge = $user->charge(100);
// Braintree 接收美元为单位的费用...
$user->charge(1);

charge Die Methode akzeptiert ein Array als zweites Argument, sodass Sie beim Erstellen der Zahlung beliebige Optionen an den zugrunde liegenden Stripe/Braintree übergeben können. Die beim Erstellen einer Zahlung verfügbaren Optionen finden Sie in der Stripe- oder Braintree-Dokumentation:

$user->charge(100, [ 
   'custom_option' => $value,
  ]);

Die charge-Methode löst eine Ausnahme aus, wenn die Zahlung fehlschlägt. Wenn die Zahlung erfolgreich ist, gibt diese Methode die vollständige Stripe-/Braintree-Antwort zurück:

try { 
   $response = $user->charge(100);
   } 
catch (Exception $e) {
    //
    }

Gebühren und Rechnungen

Manchmal müssen Sie möglicherweise eine einmalige Gebühr zahlen und außerdem eine Gebührenrechnung erstellen, damit Sie Ihrem Kunden eine Quittung im PDF-Dateiformat vorlegen können. Mit der invoiceFor-Methode können Sie dies tun. Um einem Kunden beispielsweise eine „einmalige Gebühr“ von 5,00 $ in Rechnung zu stellen:

// Stripe 接收分为单位的费用...
$user->invoiceFor('One Time Fee', 500);
// Braintree 接收美元为单位的费用...
$user->invoiceFor('One Time Fee', 5);

Die Rechnung ist sofort auf die Kreditkarte des Benutzers zu zahlen. Die invoiceFor-Methode erhält als dritten Parameter ein Array, mit dem Sie beim Erstellen der Zahlung beliebige Optionen an den zugrunde liegenden Stripe/Braintree übergeben können:

$user->invoiceFor('Stickers', 500,
 [
    'quantity' => 50,
 ], 
 [  
      'tax_percent' => 21,
 ]);

Wenn Sie Braintree als Ihren Rechnungsanbieter verwenden Oder, Sie müssen die Option invoiceFor einschließen, wenn Sie die Methode description aufrufen:

$user->invoiceFor('One Time Fee', 500,
 [
     'description' => 'your invoice description here',
 ]);

{note} Mit der Methode invoiceFor wird eine Stripe-Rechnung erstellt, die erneut versucht wird, wenn die Zahlung fehlschlägt. Wenn Sie es nach einer fehlgeschlagenen Zahlung nicht noch einmal versuchen möchten, müssen Sie die Stripe-API aufrufen, um sie nach der ersten fehlgeschlagenen Zahlung zu schließen.

Über Rückerstattungen

Wenn Sie eine Rückerstattung bearbeiten müssen, können Sie refund verwenden Methode. Diese Methode akzeptiert die Stripe-Laden-ID als einzigen Parameter:

$stripeCharge = $user->charge(100);
$user->refund($stripeCharge->id);

Rechnung

Sie können invoices verwenden Methode zum einfachen Abrufen des Rechnungsarrays des Abrechnungsmodells:

$invoices = $user->invoices();
// 结果包含处理中的发票...
$invoices = $user->invoicesIncludingPending();

Beim Auflisten einer Liste von Kundenrechnungen können Sie die Rechnungshilfsfunktion verwenden, um zugehörige Rechnungsinformationen anzuzeigen. Beispielsweise möchten Sie möglicherweise jede Rechnung in einer Tabelle auflisten, um Kunden das Herunterladen zu erleichtern:

<table>
    @foreach ($invoices as $invoice) 
    <tr>
       <td>{{ $invoice->date()->toFormattedDateString() }}</td>            
       <td>{{ $invoice->total() }}</td>            
       <td><a href="/user/invoice/{{ $invoice->id }}">Download</a></td>        
     </tr>
    @endforeach
</table>

PDF generieren Rechnung

Verwenden Sie in einer Route oder einem Controller die Methode downloadInvoice, um einen PDF-Download der Rechnung zu generieren. Diese Methode generiert automatisch eine entsprechende HTTP-Download-Antwort an den Browser:

use Illuminate\Http\Request;
Route::get('user/invoice/{invoice}', function (Request $request, $invoiceId) {
    return $request->user()->downloadInvoice($invoiceId, [ 
           'vendor'  => 'Your Company',        
           'product' => 'Your Product',    
         ]);
     });
Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.