Het is waarschijnlijk dat u op een bepaald moment terugkomende betalingen of abonnementsbetalingen voor een SaaS-service of een andere service wilt implementeren. Gelukkig biedt PayPal de tools die we nodig hebben om een volledig geïntegreerde oplossing voor abonnementsbetalingen te implementeren.
Notitie: Ik gebruik Laravel in deze zelfstudie, maar je kunt deze concepten toepassen op andere talen en kaders.
We zullen PayPal instellen om abonnementsbetalingen te accepteren en onze IMN-listener (instant payment notification) te configureren. Zodra het aanmeldingsonderdeel is voltooid, bekijken we het annuleringsproces via de API van PayPal. Ik begin met een barebones Laravel-app met eenvoudige registratie en login, en we voegen de componenten toe die we nodig hebben om abonnementsbetalingen te introduceren terwijl we door de zelfstudie gaan.
PayPal biedt een aangepast veld dat we kunnen gebruiken om de ID van de gebruiker door te geven.
Voordat we beginnen, moet u ervoor zorgen dat u een zakelijke PayPal-rekening heeft. Het is gratis, maar u moet een zakelijke account hebben om abonnementsbetalingen op uw site uit te voeren.
PayPal biedt verschillende soorten knoppen die we kunnen gebruiken, waaronder: Nu kopen, Abonneren en Automatische facturering. Vandaag kijken we naar de abonneerknop. Met abonnementsknoppen kunt u het factuurbedrag instellen, evenals de periode van de terugkerende betaling. U kunt ook een proefperiode instellen en PayPal het gebruikersaccount laten maken wanneer zij uw server pingen.
Log eerst in op uw PayPal-account en ga naar Profiel -> Mijn verkoopvoorkeuren. Zoek dan naar de PayPal-knoppen sectie en selecteer abonnementen uit de vervolgkeuzelijst. Zorg ervoor dat u de rest van de informatie invult.
Ik raad aan om het selectievakje "Heb PayPal gebruikersnamen en wachtwoorden voor klanten aanmaken" uit te schakelen en selecteer de optie "Gebruik mijn beveiligde verkopersaccount-ID".
We gaan gebruikers toestaan zich aan te melden voor een gratis account en later een upgrade uit te voeren.
Maak je knop en kopieer de gegenereerde code; je zult het in je applicatie gebruiken.
Aangezien we abonnementen aan accounts koppelen, moeten we weten wie een betaling doet. De eenvoudigste manier om dit te doen, is door het e-mailadres van de PayPal-transactie te koppelen aan het e-mailaccount dat is gebruikt om in te loggen bij onze applicatie. Dit is echter niet onfeilbaar, omdat veel mensen verschillende e-mailadressen gebruiken. Dus we moeten de ID van de gebruiker van onze applicatie doorgeven aan PayPal.
Gelukkig biedt PayPal een aangepast veld dat we kunnen gebruiken om de ID van de gebruiker door te geven. Het heeft een limiet van 256 tekens. Dus ik ga een JSON-structuur gebruiken, zodat we aanvullende informatie kunnen doorgeven als dit nodig is.
Zorg ervoor dat u de volledige lijst met geaccepteerde HTML-variabelen bekijkt.
We moeten eerst onze tabel met betalingen instellen, waar we onze transacties opslaan. Laten we het maken met de volgende kolommen:
ID kaart
: Een geheel getal met een automatisch increment en onze primaire sleutel.txn_id
: Onze transactie-ID die PayPal ons zal geven. Stel dit in als een varchar.gebruikersnaam
: We zullen dit gebruiken om onze relatie met de gebruikerstabel in te stellen, een geheel getal zal dat doen.paypal_id
: De PayPal-profiel-ID die we later moeten verwerken voor annuleringen. Stel dit in als een varchar.gemaakt bij
: We gebruiken dit om te zien wanneer de transactie is voltooid en het abonnement te starten.Voeg ook een toe abonnement
kolom naar uw gebruiker
tafel. Ik ga dit instellen als een geheel getal om meerdere niveaus toe te staan: één, twee en drie om extra functies te ontgrendelen. Ik ben ook verder gegaan en heb het model gemaakt waarmee we de betaaltafel kunnen gebruiken.
PayPal biedt een eenvoudige oplossing om ons op de hoogte te stellen wanneer een betaling is verwerkt; ze noemen het Instant Payment Notifications (IPN). Om te kunnen profiteren van IPN, moeten we een IPN-luisteraar voor onze toepassing maken. De luisteraar valideert de gegevens, voegt deze in onze tabel met betalingen en stelt het abonnementsniveau van de gebruiker in.
Gelukkig hoeven we het wiel niet opnieuw uit te vinden dankzij deze handige klasse. We zullen de gebruiken IpnListener
klasse om de gegevens snel te verifiëren en we kunnen dit vervolgens verwerken om het in onze database in te voegen. Met Laravel kunnen we de klas in onze bibliotheken-map plaatsen, waardoor deze automatisch voor ons wordt geladen.
Maak een nieuwe controller of route en voeg de volgende code toe:
$ listener = nieuwe IpnListener (); probeer $ verified = $ listener-> processIpn (); catch (Uitzondering $ e) exit (0); if ($ verified) // IPN-respons was "GEVERIFIED" else // IPN-reactie was "ONGELDIG"
Ik heb mijn bestand gebeld ipn.php
, en ik breng het in kaart / IPN
. Vergeet niet dat PayPal POST naar deze URL verzendt; dus als u HTTP / REST-werkwoorden gebruikt, stelt u deze dienovereenkomstig in. Vanaf hier kunnen we onze gegevens verwerken:
$ listener = nieuwe IpnListener (); probeer $ verified = $ listener-> processIpn (); catch (uitzondering $ 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'], 'subscription' => $ abonnement, 'verloopt' => datum ('Ymd H: i: s', strtotime ('+ 1 Month')),); Betaling :: te maken ($ TXN); else Log :: error ('Transaction not verified');
In deze code decoderen we eerst de JSON die is doorgegeven aan ons aangepaste veld, waardoor we gemakkelijk toegang hebben tot de gebruikers-ID. Vervolgens stellen we het abonnementsniveau in op basis van het transactiebedrag en slaan dit op in de database. We loggen ook eventuele fouten in met de klasse Log van Laravel. Het is misschien ook leuk om een kwitantie naar de gebruiker te sturen, maar ik laat dat aan jou over.
Vervolgens moeten we IPN inschakelen en PayPal instellen om onze luisteraar te pingen. Omdat het admin-paneel van PayPal lastig kan zijn om te navigeren, heb ik de volgende schermafbeeldingen toegevoegd om u te helpen. Ga naar Profiel -> Verkoopvoorkeuren:
Zoek dan naar Directe betalingsmeldingen:
Klik vervolgens op Kies IPN-instellingen:
En voer vervolgens de URL naar uw luisteraar in:
Terwijl we in het dashboard zitten, is het de moeite waard om onze API-inloggegevens te krijgen voordat we ons annuleringsproces regelen. Ga naar Profiel -> Verkoopvoorkeuren:
Zoeken API-toegang:
kiezen Optie 2:
Vraag een API-handtekening aan:
En let op uw inloggegevens:
U moet een zakelijke account hebben om abonnementsbetalingen uit te voeren.
Notitie: Je hebt een SSL-certificaat nodig om annuleringen af te handelen of PayPal met een foutmelding.
Om de beste gebruikerservaring te bieden, is het waarschijnlijk dat u annuleringen binnen uw toepassing of service wilt afhandelen. PayPal biedt een aantal API's waarmee we dit kunnen doen: NVP of SOAP. Ik zou aanraden om met NVP te gaan.
De documentatie van PayPal lijkt dingen te ingewikkeld te maken, maar NVP (Name-Value-Pair) is in feite gewoon een URL-gecodeerde reeks die we kunnen cURLen.
De methode waarin we geïnteresseerd zijn, is ManageRecurringPaymentsProfileStatus. We kunnen de status van het abonnement wijzigen door een van de volgende drie acties te kiezen:
We gaan de cancel-actie gebruiken, omdat onze subscribe-knoppen een geheel nieuw abonnement creëren als de gebruiker op een later tijdstip opnieuw wil activeren. Dus ons verzoek zou er ongeveer zo uitzien:
$ input = Input: all (); $ req = array ('USER' => 'YOUR_API_USER', 'PASSWORD' => 'YOUR_API_PASSWORD', 'SIGNATURE' => 'YOUR_API_SIGNATURE', 'VERSION' => '76 .0 ',' METHOD '=>' ManageRecurringPaymentsProfileStatus ', 'PROFILEID' => urlencode ($ input ['paypal_id']), 'ACTION' => 'Annuleren', 'NOTE' => 'Gebruiker geannuleerd op website',); $ ch = curl_init (); // Wissel deze als je aan het testen bent met de sandbox // 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); return Omleiden :: naar ('instellingen') -> met ('geannuleerd', waar);
We kunnen het abonnement nu eenvoudig annuleren, maar PayPal heeft er om de een of andere reden voor gekozen om geen IPN-aanvraag te verzenden. Dit is echter geen probleem, omdat we onze app hebben ingesteld om er een op te nemen vervalt
kolom. Dus we kunnen dat veld controleren om te bepalen of de gebruiker is geabonneerd.
PayPal biedt een sandbox zodat we onze implementatie kunnen testen. Als u dit nog niet eerder heeft gebruikt, moet u een gratis account maken. Van daaruit kunt u testen met meerdere gebruikers en transacties om ervoor te zorgen dat uw code werkt zoals verwacht.
We gaan onze luisteraar testen en controleren of deze correct werkt zonder echte transacties uit te voeren. Voordat we iets in de sandbox doen, moeten we onze IPN-listener configureren om de sandbox te pingen in plaats van de live server.
$ listener-> use_sandbox = true;
Ga nu naar de PayPal Sandbox, log in, klik Testhulpmiddelen aan de linkerkant en open de IPN-simulator.
Voer de URL van je luisteraar in en selecteer Express Checkout uit de vervolgkeuzelijst. U kunt de meeste standaarddetails gebruiken, maar vergeet niet om uw JSON in het aangepaste veld onderaan de pagina te plaatsen.
Dus we hebben ons abonnement opgezet en de gebruikers in staat gesteld de service te annuleren, maar hoe controleren we dit? Laravel maakt het gemakkelijk en de methode vertaalt zich in vele talen en kaders. Ik ga een methode toevoegen aan mijn Gebruiker
model dat ons toegang geeft tot het abonnement met behulp van de Auth-klasse van Laravel:
public function abonnement () return Payment :: where ('user_id', '=', Auth :: user () -> id) -> where ('expires', '>', date ('Ymd H: i: s ', time ())) -> first (array (' subscription ',' expires ',' paypal_id ',' txn_id '));
We hebben hier nu toegang toe en controleren heel eenvoudig binnen onze controllers en weergaven. Bijvoorbeeld:
abonnement(); if ($ sub && $ sub-> subscription == 1) echo 'U staat op het standaardplan'; elseif ($ sub && $ sub-> abonnement == 2) echo 'U bent op het premiumplan'; else echo 'U bent niet ingeschreven'; ?>
Hopelijk heeft deze tutorial u een idee gegeven van hoe eenvoudig het is om terugkerende betalingen of abonnementsbetalingen in uw applicaties in te stellen. PayPal is in geen geval de enige betalingsverwerker, maar het is een van de meest erkende en meest gebruikte.
Vanaf hier kunt u bonnen, betalingsherinneringen en annuleringsmeldingen toevoegen om een volledig geïntegreerde oplossing te bouwen.