Det är troligt att du vid något tillfälle vill implementera återkommande eller abonnemangsbetalningar för en SaaS eller annan tjänst. Tack och lov erbjuder PayPal de verktyg vi behöver för att genomföra en fullständigt integrerad abonnemangsbetalningslösning.
Notera: Jag använder Laravel i denna handledning, men du kan tillämpa dessa begrepp på andra språk och ramar.
Vi ställer in PayPal för att acceptera prenumerationsbetalningar och konfigurera vår IPN-lyssnare. När vi slutför registreringsdelen kommer vi titta på avbokningsprocessen via PayPals API. Jag börjar med en barebones Laravel app med enkel registrering och inloggning, och vi lägger till i de komponenter vi behöver för att presentera abonnemangsbetalningar när vi fortsätter genom handledningen.
PayPal tillhandahåller ett anpassat fält som vi kan använda för att överföra användarens ID.
Innan vi börjar, se till att du har ett PayPal-företagskonto. Det är gratis, men du måste ha ett företagskonto för att kunna genomföra prenumerationsbetalningar på din webbplats.
PayPal erbjuder flera typer av knappar som vi kan använda, inklusive: Köp nu, Prenumerera och Automatisk fakturering. Idag ser vi på prenumerera-knappen. Prenumerationsknapparna låter dig ställa in faktureringsbeloppet samt den återkommande betalningstiden. Du kan också ställa in en provperiod och låta PayPal skapa användarkontot när de pingar din server.
Först, logga in på ditt PayPal-konto och navigera till Profil -> Mina försäljningsinställningar. Sök sedan efter PayPal-knappar avsnitt och välj Prenumerationer från rullgardinsmenyn. Var noga med att fylla i resten av informationen.
Jag rekommenderar att du lämnar kryssrutan "Har PayPal skapa användarnamn och lösenord för kunder" och välj alternativet "Använd mitt säkra köpkonto-konto".
Vi ska tillåta användare att registrera sig för ett gratis konto och sedan uppgradera senare.
Skapa din knapp och kopiera den genererade koden; du använder den i din ansökan.
Eftersom vi kopplar prenumerationer till konton måste vi veta vem som gör en betalning. Det enklaste sättet att göra detta är att matcha e-postadressen till PayPal-transaktionen till det e-postkonto som användes för att logga in på vår ansökan. Detta är dock inte idiotiskt, eftersom många använder olika e-postadresser. Så vi måste skicka användarens ID från vår ansökan till PayPal.
Tack och lov, PayPal erbjuder ett anpassat fält som vi kan använda för att skicka användarens ID. Den har en gräns på 256 tecken. Så jag ska använda en JSON-struktur, så att vi kan skicka ytterligare information om vi skulle behöva.
Var noga med att kolla in hela listan över accepterade HTML-variabler.
Vi måste först skapa vår betalningstabell, där vi lagrar våra transaktioner. Låt oss skapa det med följande kolumner:
id
: Ett auto-stegs heltal och vår primära nyckel.txn_id
: Vårt transaktions-ID som PayPal ger oss. Ange detta som varchar.användar ID
: Vi använder detta för att ställa in vårt förhållande till användartabellen, ett heltal kommer att göra.paypal_id
: PayPal-profil-ID som vi behöver hantera avbokningar senare. Ange detta som varchar.skapad vid
: Vi använder detta för att se när transaktionen är klar och starta prenumerationen.Lägg även till en prenumeration
kolumn till din användare
tabell. Jag ska ställa in detta som ett heltal för att tillåta flera nivåer: en, två och tre för att låsa upp ytterligare funktioner. Jag har också gått vidare och skapat modellen som gör att vi kan interagera med betalningstabellen.
PayPal ger en enkel lösning för att anmäla oss när en betalning har behandlats. de kallar det Instant Payment Notifications (IPN). För att kunna utnyttja IPN måste vi skapa en IPN-lyssnare för vår applikation. Lyssnaren validerar data, lägger in den i vår betalningstabell och ställer in användarens abonnemangsnivå.
Lyckligtvis behöver vi inte uppfinna hjulet tack vare den här praktiska klassen. Vi använder IpnListener
klass för att snabbt verifiera data, och vi kan sedan bearbeta detta för att infoga det i vår databas. Med Laravel kan vi placera klassen i bibliotekets mapp, vilket gör det autoload för oss.
Skapa en ny kontroller eller rutt och lägg till följande kod:
$ listener = ny IpnListener (); prova $ verified = $ listener-> processIpn (); fångst (Undantag $ e) exit (0); om ($ verifierad) // IPN-svaret var "VERIFIED" annars // IPN-svaret var "INVALID"
Jag ringde min fil ipn.php
, och jag ska kartlägga den till / IPN
. Glöm inte att PayPal kommer att POST till den här URL: n; så om du använder HTTP / REST-verb, ställer du upp det i enlighet med detta. Härifrån kan vi bearbeta våra data:
$ listener = ny IpnListener (); prova $ verified = $ listener-> processIpn (); fångst (Undantag $ e) returlogg :: fel ($ e-> getMessage ()); om ($ verifierad) $ 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'], 'abonnemang' => $ abonnemang, 'löper ut' => datum ('Ymd H: i: s', strtotime ('+ 1 Månad'))); Betalning :: create (TXN $); else Log :: error ("Transaktion ej verifierad");
I den här koden avkodar vi först JSON som passerat till vårt anpassade fält, vilket ger oss enkel åtkomst till användar-ID. Vi ställer sedan in abonnemangsnivån baserat på transaktionsbeloppet och lagrar det i databasen. Vi loggar också några fel med Laravel's Log-klass. Det kan också vara trevligt att skicka ett kvitto till användaren, men jag lämnar det till dig.
Därefter måste vi aktivera IPN och konfigurera PayPal för att pinga vår lyssnare. Eftersom PayPals administratörspanel kan vara svårt att navigera, har jag inkluderat följande skärmdumpar som hjälper dig att vägleda dig. Gå till Profil -> Försäljningsinställningar:
Sedan leta efter Instant Payment Notifications:
Klicka sedan på Välj IPN-inställningar:
Och ange URL-adressen till din lyssnare:
Medan vi befinner dig i instrumentpanelen är det värt att få våra API-uppgifter innan vi sorterar ut vår avbokningsprocess. Gå till Profil -> Försäljningsinställningar:
Leta efter API-åtkomst:
Välj alternativ 2:
Begär en API-signatur:
Och notera dina uppgifter:
Du måste ha ett företagskonto för att kunna genomföra prenumerationsbetalningar.
Notera: Du behöver ett SSL-certifikat för att hantera avbokningar, eller PayPal med ett fel.
För att ge den bästa användarupplevelsen är det troligt att du kommer att vilja hantera avbokningar inom din ansökan eller tjänst. PayPal innehåller några API: er som tillåter oss att göra detta: NVP eller SOAP. Jag skulle rekommendera att gå med NVP.
PayPal-dokumentationen verkar för komplicera saker, men NVP (Name-Value-Pair) är i princip bara en URL-kodad sträng som vi kan cURL.
Metoden vi är intresserade av är ManageRecurringPaymentsProfileStatus. Vi kan ändra prenumerationsstatus genom att välja en av följande tre åtgärder:
Vi kommer att använda avbokningsåtgärden, eftersom våra prenumerationsknappar skapar en helt ny prenumeration om användaren vill återaktivera vid en senare tidpunkt. Så vår begäran skulle se ut så här:
$ 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' => 'Avbryt', 'NOTE' => 'Användare avbokad på hemsidan'); $ ch = curl_init (); // Byt ut dessa om du testar med sandlådan // 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); returnera Omdirigering :: till ('inställningar') -> med ('avbruten', sant);
Vi kan nu enkelt avbryta prenumerationen, men av någon anledning valde PayPal att inte skicka en IPN-begäran. Det här är inte något problem, eftersom vi installerar vår app för att inkludera en löper ut
kolumn. Så vi kan kolla det fältet för att avgöra om användaren prenumererar.
PayPal tillhandahåller en sandlåda så att vi kan testa vår implementering. Om du inte har använt det tidigare måste du skapa ett gratis konto. Därifrån kan du testa med flera användare och transaktioner för att säkerställa att din kod fungerar som förväntat.
Vi ska testa vår lyssnare och se till att den fungerar korrekt utan att behöva göra riktiga transaktioner. Innan vi gör någonting i sandlådan, måste vi konfigurera vår IPN-lyssnare att pinga sandlådan istället för live-servern.
$ lyssnare-> use_sandbox = true;
Gå nu över till PayPal Sandbox, logga in, klicka Testverktyg till vänster och öppna IPN-simulatorn.
Ange adressen till din lyssnare och välj Snabbkassa från rullgardinsmenyn. Du kan använda de flesta standardinformationen, men glöm inte att sätta din JSON i det egna fältet längst ner på sidan.
Så vi har ställt in vår prenumeration och aktiverat användarna att avbryta tjänsten, nu hur kontrollerar vi det här? Laravel gör det enkelt, och dess metod översätts på många språk och ramar. Jag ska lägga till en metod till min Användare
modell som ger oss tillgång till prenumerationen med Laravel Auth-klass:
public function subscription () return Betalning :: where ('user_id', '=', Auth :: användare () -> id) -> var ('löper ut', '>', datum ('Ymd H: s ', tid ())) -> först (array (' prenumeration ',' löper ut ',' paypal_id ',' txn_id '));
Vi kan nu komma åt detta och kontrollera mycket enkelt i våra kontroller och åsikter. Till exempel:
prenumeration(); om ($ sub && $ sub-> prenumeration == 1) echo 'Du är på standardplanen'; elseif ($ sub && $ sub-> prenumeration == 2) echo 'Du är på premiumplanen'; annars echo 'Du är inte prenumerant'; ?>
Förhoppningsvis har denna handledning gett dig en uppfattning om hur enkelt det är att ställa in återkommande eller abonnemangsbetalningar i dina applikationer. PayPal är inte den enda betalningsprocessorn, men den är en av de mest kända och mest använda.
Härifrån kan du lägga till kvitton, betalningspåminnelser och avbokningsanmälningar för att bygga en helt integrerad lösning.