Slik oppretter du gjentagende betalinger

Det er sannsynlig at du på et tidspunkt vil implementere gjentagende eller abonnementsbetalinger for en SaaS eller annen tjeneste. Heldigvis tilbyr PayPal de verktøyene vi trenger for å implementere en fullt integrert abonnementsbetalingsløsning.


Hva vi skal bygge

Merk: Jeg bruker Laravel i denne opplæringen, men du kan bruke disse konseptene til andre språk og rammer.

Vi oppretter PayPal for å godta abonnementsbetalinger og konfigurere vår IPN-lytter. Når vi fullfører registreringsdelen, ser vi på avbestillingsprosessen via PayPals API. Jeg starter med en barebones Laravel-app med enkel registrering og pålogging, og vi legger til i komponentene vi trenger for å presentere abonnementsbetalinger som vi fortsetter gjennom opplæringen.


Trinn 1: Sette opp abonnementsknappene

PayPal gir et tilpasset felt som vi kan bruke til å passere brukerens ID.

Før du begynner, sørg for at du har en PayPal-bedriftskonto. Det er gratis, men du må ha en bedriftskonto for å kunne implementere abonnementsbetalinger på nettstedet ditt.

PayPal tilbyr flere typer knapper som vi kan bruke, inkludert: Kjøp nå, Abonner og Automatisk fakturering. I dag ser vi på abonnentknappen. Abonnementsknappene tillater deg å angi faktureringsbeløp, samt den gjentatte betalingsperioden. Du kan også sette opp en prøveperiode og la PayPal opprette brukerkontoen når de pinger serveren din.

Først, logg inn på PayPal-kontoen din og naviger til Profil -> Mine salgsinnstillinger. Så se etter PayPal-knapper delen og velg abonnementer fra rullegardinlisten. Pass på å fylle ut resten av informasjonen.

Jeg anbefaler at du slipper av for "Gjør PayPal opprett brukernavn og passord for kunder", og velg "Bruk min sikre selgerkonto ID" -alternativet.

Vi skal tillate brukere å registrere seg for en gratis konto og deretter oppgradere senere.

Opprett knappen og kopier den genererte koden; du vil bruke den i søknaden din.

Passerer Tilleggsinformasjon

Siden vi kobler abonnementer til kontoer, må vi vite hvem som betaler. Den enkleste måten å gjøre dette på er å matche e-postadressen til PayPal-transaksjonen til e-postkontoen som ble brukt til å logge på vår søknad. Dette er imidlertid ikke idiotsikkert, fordi mange bruker forskjellige e-postadresser. Så vi må sende brukerens ID fra vår søknad til PayPal.

Heldigvis gir PayPal et tilpasset felt som vi kan bruke til å sende brukerens ID. Den har en grense på 256 tegn. Så jeg skal bruke en JSON-struktur, slik at vi kan passere tilleggsinformasjon hvis vi trenger det.

Pass på å sjekke ut hele listen over godkjente HTML-variabler.


Trinn 2: Klargjøre programmet

Vi må først opprette vårt betalingstabell, hvor vi lagrer transaksjonene våre. La oss lage den med følgende kolonner:

  • id: Et auto-trinns heltall og vår primære nøkkel.
  • txn_id: Vår transaksjons-ID som PayPal vil gi oss. Sett dette som varchar.
  • bruker-ID: Vi bruker dette til å sette opp forholdet til brukerbordet, et heltall vil gjøre.
  • paypal_id: PayPal-profil-IDen som vi må håndtere avbestillinger senere. Sett dette som varchar.
  • created_at: Vi bruker dette for å se når transaksjonen er fullført og start abonnementet.

Legg også til en abonnement kolonne til din bruker bord. Jeg skal sette dette som et heltall for å tillate flere nivåer: en, to og tre for å låse opp flere funksjoner. Jeg har også gått videre og opprettet modellen som gjør at vi kan samhandle med betalingstabellen.


Trinn 3: Skrive din lytter

PayPal gir en enkel løsning for å varsle oss når en betaling er behandlet de kaller det Instant Payment Notifications (IPN). For å kunne dra nytte av IPN, må vi opprette en IPN-lytter for vår søknad. Lytten validerer dataene, legger den inn i vårt betalingstabell og angir abonnementsnivået til brukeren.

Heldigvis trenger vi ikke å gjenoppfinne hjulet takket være denne praktiske klassen. Vi bruker IpnListener klasse for raskt å verifisere dataene, og vi kan deretter behandle dette for å sette det inn i vår database. Med Laravel kan vi legge klassen inn i bibliotekets mappe, slik at den blir autoload for oss.

Opprett en ny kontroller eller rute og legg til følgende kode:

$ listener = ny IpnListener (); prøv $ verified = $ listener-> processIpn ();  fangst (Unntak $ e) exit (0);  hvis ($ verifisert) // IPN-svar var "VERIFIED" ellers // IPN-svar var "INVALID"

Jeg ringte filen min ipn.php, og jeg skal kartlegge det til / IPN. Ikke glem at PayPal vil POST til denne nettadressen; så hvis du bruker HTTP / REST-verb, sett det opp i samsvar med dette. Herfra kan vi behandle våre data:

$ listener = ny IpnListener (); prøv $ verified = $ listener-> processIpn ();  fangst (Unntak $ e) returlogg :: feil ($ e-> getMessage ());  hvis ($ verifisert) $ data = $ _POST; $ user_id = json_decode ($ data ['custom']) -> user_id; $ abonnement = ($ 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, 'utløper' => dato ('Ymd H: i: s', strtotime ('+ 1 Måned')),); Betaling :: skape ($ txn);  else Log :: error ('Transaksjon ikke bekreftet'); 

I denne koden avkodner vi først JSON-passet til vårt tilpassede felt, noe som gir oss enkel tilgang til bruker-IDen. Vi stiller deretter abonnementsnivået basert på transaksjonsbeløpet og lagrer det i databasen. Vi logger også eventuelle feil ved hjelp av Laravel's Log-klassen. Det kan også være fint å sende kvittering til brukeren, men jeg la det opp til deg.


Trinn 4: Aktiverer IPN

Deretter må vi aktivere IPN og sette opp PayPal for å pinge vår lytter. Fordi PayPals administrasjonspanel kan være vanskelig å navigere, har jeg tatt med følgende skjermbilder for å hjelpe deg. Gå til Profil -> Selge innstillinger:

Så se etter Instant Payment Notifications:

Deretter klikker du Velg IPN-innstillinger:

Og skriv deretter inn nettadressen til lytteren din:


Trinn 5: Få ditt API-brukernavn, passord og signatur

Mens vi er i dashbordet, er det verdt å få vår API-legitimasjon før vi sorterer ut avbestillingsprosessen vår. Gå til Profil -> Selge innstillinger:

Se etter API-tilgang:

Å velge alternativ 2:

Be om en API-signatur:

Og ta oppmerksom på legitimasjonene dine:


Trinn 6: Håndtering av avbestillinger

Du må ha en bedriftskonto for å kunne implementere abonnementsbetalinger.

Merk: Du skal trenge et SSL-sertifikat for å håndtere avbestillinger, eller PayPal med kaste en feil.

For å gi den beste brukeropplevelsen, er det sannsynlig at du vil ønske å håndtere avbestillinger i din søknad eller tjeneste. PayPal gir noen APIer som tillater oss å gjøre dette: NVP eller SOAP. Jeg vil anbefale å gå med NVP.

PayPal-dokumentasjonen ser ut til å komplisere ting, men NVP (Name-Value-Pair) er egentlig bare en URL-kodet streng som vi kan cURL.

Metoden vi er interessert i, er ManageRecurringPaymentsProfileStatus. Vi kan endre abonnementsstatus ved å velge en av følgende tre handlinger:

  • Avbryt: Bare aktive eller suspenderte abonnementer kan kanselleres. Hvis du velger denne handlingen, forhindrer brukeren å aktivere på et senere tidspunkt.
  • Henge: Bare aktive abonnementer kan bli suspendert. Denne handlingen tillater brukere å reaktivere abonnementet senere.
  • Reaktiver: Bare suspenderte abonnementer kan reaktiveres, på nytt opprette abonnementet.

Vi skal bruke avbrytingsaksjonen, da våre abonnementsknapper lager et helt nytt abonnement dersom brukeren vil aktivere på nytt senere. Så vår forespørsel ville se slik ut:

$ input = Input :: all (); $ req = array ('USER' => 'YOUR_API_USER', 'PASSWORD' => 'YOUR_API_PASSWORD', 'SIGNATURE' => 'YOUR_API_SIGNATURE', 'VERSION' => '76 .0 ',' METHOD '=>' AdministrereRecurringPaymentsProfileStatus ' 'PROFILEID' => urlencode ($ input ['paypal_id']), 'ACTION' => 'Cancel', 'NOTE' => 'Bruker kansellert på nettstedet',); $ ch = curl_init (); // Bytt disse hvis du tester med sandboken // 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); returnere omdirigering :: til ('innstillinger') -> med ('kansellert', sant);

Vi kan nå enkelt avbryte abonnementet, men av en eller annen grunn valgte PayPal å ikke sende en IPN-forespørsel. Dette er ikke et problem, men vi konfigurerer appen vår for å inkludere en utløper kolonne. Så vi kan sjekke det feltet for å finne ut om brukeren abonnerer.


Trinn 7: Spiller i sandkassen

PayPal gir en sandkasse slik at vi kan teste implementeringen vår. Hvis du ikke har brukt dette før, må du opprette en gratis konto. Derfra kan du teste med flere brukere og transaksjoner for å sikre at koden fungerer som forventet.

Vi skal teste vår lytter, og sørge for at det fungerer riktig uten å måtte utføre virkelige transaksjoner. Før vi gjør noe i sandkassen, må vi konfigurere vår IPN-lytter til å pinge sandkassen i stedet for live serveren.

$ lytter-> use_sandbox = true;

Gå nå over til PayPal Sandbox, logg inn, klikk Testverktøy til venstre og åpne opp IPN-simulatoren.

Skriv inn nettadressen til lytteren og velg Hurtigutsjekking fra rullegardinmenyen. Du kan bruke de fleste standarddetaljer, men ikke glem å sette JSON i det egendefinerte feltet mot bunnen av siden.


Trinn 8: Kontrollerer abonnementet

Så vi har satt opp abonnementet vårt og gjort det mulig for brukerne å avbryte tjenesten, nå hvordan kontrollerer vi dette? Laravel gjør det enkelt, og metoden oversettes over mange språk og rammer. Jeg skal legge til en metode til min Bruker modell som gir oss tilgang til abonnementet ved hjelp av Laravels Auth-klasse:

Offentlig bruk abonnement () retur Betaling :: hvor ('user_id', '=', Auth :: bruker () -> id) -> hvor ('utløper', '>', dato ('Ymd H: s ', tid ())) -> først (array (' abonnement ',' utløper ',' paypal_id ',' txn_id ')); 

Vi kan nå få tilgang til dette og sjekke inn i våre kontroller og visninger veldig enkelt. For eksempel:

abonnement(); hvis ($ sub && $ sub-> abonnement == 1) echo 'Du er på standardplanen';  elseif ($ sub && $ sub-> abonnement == 2) echo 'Du er på premieplanen';  ellers echo 'Du er ikke abonnert'; ?>

For å konkludere

Forhåpentligvis har denne opplæringen gitt deg en ide om hvor lett det er å sette opp gjentagende eller abonnementsbetalinger i dine applikasjoner. PayPal er på ingen måte den eneste betalingsprosessoren, men den er en av de mest anerkjente og mye brukt.

Herfra kan du legge til kvitteringer, betalingspåminnelser og avbestillingsvarsler for å bygge en fullstendig integrert løsning.