Toolkit für den Kassiererhandel
Laravel Cashier
- Einführung
- Upgrade Kassierer
- Konfiguration
- Abonnieren
- Probeabonnement
- Kunde
- Bankkarte
- Prozess Stripe-Webhooks
- Verarbeitung von Braintree-Webhooks
- Einmalige Gebühr
- Rechnung
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
unddecrement
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 boot
Dienstanbieters 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 wiederherstellenWenn sich ein Benutzer abgemeldet hat, können Sie es bei Bedarf wiederherstellen
Methode. Benutzer resume
mü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();
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 diecharge
-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', ]); });