So richten Sie wiederkehrende Zahlungen ein

Es ist wahrscheinlich, dass Sie zu einem bestimmten Zeitpunkt wiederkehrende Zahlungen oder Abonnementzahlungen für einen SaaS oder einen anderen Dienst implementieren möchten. Zum Glück bietet PayPal die Tools an, die wir benötigen, um eine vollständig integrierte Abonnement-Zahlungslösung zu implementieren.


Was wir bauen werden

Hinweis: Ich verwende Laravel in diesem Lernprogramm, aber Sie können diese Konzepte auch auf andere Sprachen und Frameworks anwenden.

Wir richten PayPal so ein, dass es Abonnementzahlungen akzeptiert und unseren IPN-Listener (Instant Payment Notification) konfiguriert. Sobald wir die Anmeldekomponente abgeschlossen haben, betrachten wir den Stornierungsprozess über die PayPal-API. Ich beginne mit einer Barebones-Laravel-App mit einfacher Registrierung und Anmeldung. Wir fügen die Komponenten hinzu, die wir benötigen, um im Laufe des Lernprogramms Abonnementzahlungen einzuführen.


Schritt 1: Einrichten der Abonnementschaltflächen

PayPal bietet ein benutzerdefiniertes Feld, mit dem wir die Benutzer-ID übergeben können.

Bevor Sie beginnen, stellen Sie sicher, dass Sie über ein PayPal-Geschäftskonto verfügen. Es ist kostenlos, aber Sie müssen über ein Geschäftskonto verfügen, um Abonnementzahlungen auf Ihrer Website durchführen zu können.

PayPal bietet verschiedene Arten von Schaltflächen an, die wir verwenden können, darunter: Jetzt kaufen, Abonnieren und Automatische Abrechnung. Heute schauen wir uns die Schaltfläche zum Abonnieren an. Mit den Abonnementschaltflächen können Sie den Rechnungsbetrag sowie den Zeitraum für die wiederkehrende Zahlung festlegen. Sie können auch eine Testphase einrichten und das Benutzerkonto von PayPal erstellen lassen, wenn Sie einen Ping-Befehl an Ihren Server senden.

Melden Sie sich zunächst bei Ihrem PayPal-Konto an und navigieren Sie zu Profil -> Meine Verkaufseinstellungen. Dann suchen Sie nach dem PayPal-Schaltflächen Abschnitt und wählen Sie Abonnements aus der Dropdown-Liste. Stellen Sie sicher, dass Sie die restlichen Informationen ausfüllen.

Ich empfehle, das Kontrollkästchen "Lassen Sie PayPal Benutzernamen und Kennwörter für Kunden erstellen" nicht aktivieren, und aktivieren Sie die Option "Meine sichere Händlerkonto-ID verwenden".

Wir erlauben Benutzern, sich für ein kostenloses Konto anzumelden und später ein Upgrade durchzuführen.

Erstellen Sie Ihre Schaltfläche und kopieren Sie den generierten Code. Sie werden es in Ihrer Anwendung verwenden.

Weitergabe von Informationen

Da wir Abonnements mit Konten verknüpfen, müssen wir wissen, wer eine Zahlung vornimmt. Dies geschieht am einfachsten, wenn Sie die E-Mail-Adresse der PayPal-Transaktion mit dem E-Mail-Konto abgleichen, mit dem Sie sich bei unserer Anwendung anmelden. Dies ist jedoch nicht narrensicher, da viele Benutzer unterschiedliche E-Mail-Adressen verwenden. Daher müssen wir die Benutzer-ID aus unserer Anwendung an PayPal weitergeben.

Glücklicherweise stellt PayPal ein benutzerdefiniertes Feld zur Verfügung, mit dem wir die Benutzer-ID übergeben können. Es darf maximal 256 Zeichen lang sein. Ich werde also eine JSON-Struktur verwenden, die es uns ermöglicht, zusätzliche Informationen zu übergeben, falls dies erforderlich ist.

Schauen Sie sich die vollständige Liste der akzeptierten HTML-Variablen an.


Schritt 2: Lesen Sie Ihre Bewerbung

Zuerst müssen wir unsere Zahlungstabelle einrichten, in der wir unsere Transaktionen speichern. Lassen Sie uns es mit den folgenden Spalten erstellen:

  • Ich würde: Eine Ganzzahl für die automatische Erhöhung und unser Primärschlüssel.
  • txn_id: Unsere Transaktions-ID, die PayPal uns gibt. Setze dies als Varchar.
  • Benutzeridentifikation: Wir werden dies verwenden, um unsere Beziehung zur Benutzertabelle aufzubauen, eine ganze Zahl reicht aus.
  • paypal_id: Die PayPal-Profil-ID, mit der wir später stornieren müssen. Setze dies als Varchar.
  • hergestellt in: Wir werden dies verwenden, um zu sehen, wann die Transaktion abgeschlossen ist, und das Abonnement zu starten.

Fügen Sie auch ein Abonnement Spalte zu Ihrem Nutzer Tabelle. Ich werde dies als ganze Zahl festlegen, um mehrere Ebenen zuzulassen: eine, zwei und drei, um zusätzliche Funktionen freizuschalten. Ich habe auch ein Modell erstellt, das uns die Interaktion mit der Zahlungstabelle ermöglicht.


Schritt 3: Schreiben Sie Ihren Listener

PayPal bietet eine einfache Lösung, um uns zu benachrichtigen, wenn eine Zahlung verarbeitet wurde. Sie nennen es Instant Payment Notifications (IPN). Um IPN nutzen zu können, müssen wir einen IPN-Listener für unsere Anwendung erstellen. Der Listener validiert die Daten, fügt sie in unsere Zahlungstabelle ein und legt die Abonnementebene des Benutzers fest.

Glücklicherweise müssen wir das Rad dank dieser praktischen Klasse nicht neu erfinden. Wir werden die verwenden IpnListener Klasse, um die Daten schnell zu überprüfen, und wir können diese dann bearbeiten, um sie in unsere Datenbank einzufügen. Mit Laravel können wir die Klasse in unserem Bibliotheksordner platzieren und so für uns automatisch laden.

Erstellen Sie einen neuen Controller oder eine neue Route und fügen Sie den folgenden Code hinzu:

$ listener = neuer IpnListener (); try $ Verified = $ listener-> processIpn ();  catch (Ausnahme $ e) exit (0);  if ($ Verified) // Die IPN-Antwort war "VERIFIED" else // Die IPN-Antwort war "UNGÜLTIG"

Ich habe meine Akte angerufen ipn.php, und ich werde es zuordnen / ipn. Vergessen Sie nicht, dass PayPal an diese URL POST stellt. Wenn Sie also HTTP / REST-Verben verwenden, richten Sie sie entsprechend ein. Von hier aus können wir unsere Daten verarbeiten:

$ listener = neuer IpnListener (); try $ Verified = $ listener-> processIpn ();  catch (Ausnahme $ e) return Log :: error ($ e-> getMessage ());  if ($ Verified) $ data = $ _POST; $ user_id = json_decode ($ data ['custom']) -> user_id; $ subscription = ($ data ['mc_gross_1'] == '10')? 2: 1; $ txn = array ('txn_id' => $ data ['txn_id']), 'user_id' => $ user_id, 'paypal_id' => $ data ['subscr_id'], 'abonnement' => $ abonnement, 'läuft ab' => Datum ('Ymd H: i: s', Strtotime ('+ 1 Monat')),); Zahlung :: create ($ txn);  else Log :: error ('Transaktion nicht verifiziert'); 

In diesem Code decodieren wir zunächst die an unser benutzerdefiniertes Feld übergebenen JSON-Dateien, sodass wir leicht auf die Benutzer-ID zugreifen können. Anschließend wird der Abonnement-Level basierend auf dem Transaktionsbetrag festgelegt und in der Datenbank gespeichert. Wir protokollieren auch Fehler mithilfe der Protokollklasse von Laravel. Es kann auch schön sein, eine Quittung an den Benutzer zu senden, aber das überlasse ich Ihnen.


Schritt 4: Aktivieren des IPN

Als Nächstes müssen wir das IPN aktivieren und PayPal einrichten, um einen Ping an unseren Listener zu senden. Da das Admin-Bedienfeld von PayPal sehr schwierig zu navigieren sein kann, habe ich die folgenden Screenshots beigefügt, um Ihnen zu helfen. Gehe zu Profil -> Verkaufseinstellungen:

Dann suche nach Sofortige Zahlungsbenachrichtigungen:

Klicken Sie anschließend auf Wählen Sie IPN-Einstellungen:

Geben Sie dann die URL zu Ihrem Listener ein:


Schritt 5: Holen Sie sich Ihren API-Benutzernamen, Ihr Passwort und Ihre Signatur

Während wir uns im Dashboard befinden, ist es ratsam, unsere API-Anmeldeinformationen zu erhalten, bevor wir den Stornierungsprozess abwickeln. Gehe zu Profil -> Verkaufseinstellungen:

Suchen API-Zugriff:

Wählen Option 2:

Fordern Sie eine API-Signatur an:

Und notieren Sie sich Ihre Nachweise:


Schritt 6: Stornierungen bearbeiten

Sie müssen über ein Geschäftskonto verfügen, um Abonnementzahlungen durchführen zu können.

Hinweis: Sie benötigen ein SSL-Zertifikat, um Stornierungen abzuwickeln, oder PayPal mit einem Fehler.

Um die bestmögliche Benutzererfahrung zu bieten, möchten Sie möglicherweise Stornierungen innerhalb Ihrer Anwendung oder Ihres Dienstes abwickeln. PayPal bietet einige APIs an, mit denen wir dies tun können: NVP oder SOAP. Ich würde empfehlen, mit NVP zu gehen.

Die Dokumentation von PayPal scheint die Dinge zu kompliziert zu machen, aber NVP (Name-Value-Pair) ist im Wesentlichen nur eine URL-codierte Zeichenfolge, die wir cURL verwenden können.

Die Methode, an der wir interessiert sind, ist ManageRecurringPaymentsProfileStatus. Wir können den Status des Abonnements ändern, indem Sie eine der folgenden drei Aktionen auswählen:

  • Stornieren: Nur aktive oder suspendierte Abonnements können storniert werden. Durch die Auswahl dieser Aktion wird verhindert, dass der Benutzer zu einem späteren Zeitpunkt erneut aktiviert wird.
  • Aussetzen: Nur aktive Abonnements können ausgesetzt werden. Mit dieser Aktion können Benutzer ihr Abonnement später erneut aktivieren.
  • Reaktivieren: Nur suspendierte Abonnements können erneut aktiviert werden, indem das Abonnement erneut installiert wird.

Wir verwenden die Abbruchaktion, da unsere Abonnementschaltflächen ein völlig neues Abonnement erstellen, falls der Benutzer zu einem späteren Zeitpunkt erneut aktiviert werden möchte. Unsere Anfrage würde also etwa so aussehen:

$ input = Eingabe :: all (); $ req = array ('USER' => 'YOUR_API_USER', 'PASSWORD' => 'YOUR_API_PASSWORD', 'SIGNATURE' => 'YOUR_API_SIGNATURE', 'VERSION' => '76 .0 ',' METHOD '=>' ManageRecurringPaymentsProfile ' 'PROFILEID' => urlencode ($ input ['paypal_id']), 'ACTION' => 'Cancel', 'NOTE' => 'Benutzer auf Website abgebrochen'),); $ ch = curl_init (); // Tauschen Sie diese aus, wenn Sie mit der Sandbox testen // curl_setopt ($ ch, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp'); curl_setopt ($ ch, CURLOPT_URL, 'https://api-3t.paypal.com/nvp'); curl_setopt ($ ch, CURLOPT_VERBOSE, 1); curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_POST, 1); curl_setopt ($ ch, CURLOPT_POSTFIELDS, http_build_query ($ req)); curl_exec ($ ch); curl_close ($ ch); Redirect :: an ('settings') -> with ('cancel', true) zurückgeben;

Wir können das Abonnement jetzt problemlos kündigen, aber aus irgendeinem Grund entschied sich PayPal dafür, keine IPN-Anfrage zu senden. Dies ist jedoch kein Problem, da wir unsere App so einrichten, dass sie eine läuft ab Säule. Wir können dieses Feld also überprüfen, um festzustellen, ob der Benutzer abonniert ist.


Schritt 7: In der Sandbox spielen

PayPal stellt eine Sandbox zur Verfügung, mit der wir unsere Implementierung testen können. Wenn Sie dies noch nicht verwendet haben, müssen Sie ein kostenloses Konto erstellen. Von dort aus können Sie mit mehreren Benutzern und Transaktionen testen, um sicherzustellen, dass Ihr Code wie erwartet funktioniert.

Wir werden unseren Listener testen und sicherstellen, dass er korrekt funktioniert, ohne echte Transaktionen durchführen zu müssen. Bevor wir etwas in der Sandbox tun, müssen wir unseren IPN-Listener so konfigurieren, dass er die Sandbox anstelle des Live-Servers sendet.

$ listener-> use_sandbox = true;

Gehen Sie nun zur PayPal-Sandbox, melden Sie sich an, klicken Sie auf Testwerkzeuge auf der linken Seite und öffnen Sie den IPN-Simulator.

Geben Sie die URL Ihres Listeners ein und wählen Sie Express Checkout aus dem drop down. Sie können die meisten Standarddetails verwenden. Vergessen Sie jedoch nicht, Ihre JSON in das benutzerdefinierte Feld am unteren Rand der Seite einzufügen.


Schritt 8: Nach dem Abonnement suchen

Wir haben also unser Abonnement eingerichtet und Benutzern ermöglicht, den Dienst abzubrechen. Wie prüfen wir das nun? Laravel macht es einfach, und seine Methode übersetzt in viele Sprachen und Frameworks. Ich werde meine Methode hinzufügen Nutzer Modell, das uns Zugriff auf das Abonnement mit der Auth-Klasse von Laravel gewährt:

public function abonnement () return Payment :: where ('user_id', '=', Auth :: user () -> id) -> where ('läuft ab', '>', date ('Ymd H: i: s ', time ())) -> first (array (' abonnement ',' verfällt ',' paypal_id ',' txn_id ')); 

Wir können jetzt darauf zugreifen und innerhalb unserer Controller und Ansichten sehr einfach nachsehen. Zum Beispiel:

Abonnement(); if ($ sub && $ sub-> subscription == 1) echo 'Sie befinden sich im Standardplan';  elseif ($ sub && $ sub-> abonnement == 2) echo 'Sie befinden sich im Prämienplan';  else echo 'Sie sind nicht abonniert'; ?>

Abschließend

Wir hoffen, dass Ihnen dieses Tutorial vermittelt, wie einfach es ist, wiederkehrende Zahlungen oder Abonnementzahlungen in Ihren Anwendungen einzurichten. PayPal ist keinesfalls der einzige Zahlungsabwickler, aber es ist eines der bekanntesten und am häufigsten verwendeten Zahlungsmethoden.

Von hier aus können Sie Belege, Zahlungserinnerungen und Stornierungsbenachrichtigungen hinzufügen, um eine vollständig integrierte Lösung zu erstellen.