Come impostare pagamenti ricorrenti

È probabile che a un certo punto desideri implementare pagamenti ricorrenti o in abbonamento per un SaaS o un altro servizio. Fortunatamente, PayPal offre gli strumenti necessari per implementare una soluzione di pagamento in abbonamento completamente integrata.


Cosa costruiremo

Nota: Sto usando Laravel in questo tutorial, ma puoi applicare questi concetti ad altri linguaggi e framework.

Configureremo PayPal per accettare i pagamenti dell'abbonamento e configurare il nostro listener di notifica di pagamento immediato (IPN). Una volta completato il componente di iscrizione, esamineremo il processo di cancellazione tramite l'API di PayPal. Sto iniziando con un'app Laravel barebone con registrazione e login semplici, e aggiungeremo i componenti necessari per introdurre i pagamenti dell'abbonamento mentre procediamo attraverso il tutorial.


Passaggio 1: impostazione dei pulsanti di abbonamento

PayPal fornisce un campo personalizzato che possiamo utilizzare per trasmettere l'ID dell'utente.

Prima di iniziare, assicurati di avere un account aziendale PayPal. È gratuito, ma è necessario disporre di un account aziendale per implementare i pagamenti delle sottoscrizioni sul tuo sito.

PayPal offre diversi tipi di pulsanti che possiamo utilizzare, tra cui: Acquista ora, Abbonati e Fatturazione automatica. Oggi guarderemo il pulsante Iscriviti. I pulsanti di abbonamento consentono di impostare l'importo di fatturazione, nonché il periodo di pagamento periodico. È inoltre possibile impostare un periodo di prova e consentire a PayPal di creare l'account utente quando eseguono il ping sul server.

Innanzitutto, accedi al tuo account PayPal e naviga verso Profilo -> Le mie preferenze di vendita. Quindi cerca il Pulsanti PayPal sezione e selezionare Sottoscrizioni dall'elenco a discesa. Assicurati di compilare il resto delle informazioni.

Si consiglia di lasciare deselezionata la casella "Avere PayPal crea nomi utente e password per i clienti" e selezionare l'opzione "Utilizza ID account commerciante sicuro".

Permetteremo agli utenti di registrarsi per un account gratuito e quindi effettuare l'upgrade in seguito.

Crea il tuo pulsante e copia il codice generato; lo userai nella tua applicazione.

Passare ulteriori informazioni

Dal momento che stiamo collegando gli abbonamenti agli account, dobbiamo sapere chi effettua un pagamento. Il modo più semplice per farlo è abbinare l'indirizzo e-mail della transazione PayPal all'account e-mail utilizzato per accedere alla nostra applicazione. Questo non è infallibile, tuttavia, perché molte persone usano indirizzi email diversi. Quindi abbiamo bisogno di passare l'ID dell'utente dalla nostra applicazione a PayPal.

Fortunatamente, PayPal fornisce un campo personalizzato che possiamo utilizzare per trasmettere l'ID dell'utente. Ha un limite di 256 caratteri. Quindi userò una struttura JSON, permettendoci di passare ulteriori informazioni se necessario.

Assicurati di controllare l'elenco completo delle variabili HTML accettate.


Passaggio 2: Preparazione dell'applicazione

Per prima cosa dobbiamo impostare la nostra tabella dei pagamenti, dove memorizzeremo le nostre transazioni. Creiamolo con le seguenti colonne:

  • id: Un intero con incremento automatico e la nostra chiave primaria.
  • txn_id: Il nostro ID transazione che PayPal ci darà. Imposta questo come varchar.
  • ID utente: Lo useremo per impostare la nostra relazione con la tabella degli utenti, un intero lo farà.
  • paypal_id: L'ID profilo PayPal di cui avremo bisogno per gestire le cancellazioni in seguito. Imposta questo come varchar.
  • created_at: Lo useremo per vedere quando la transazione è completata e avviare l'abbonamento.

Inoltre, aggiungere un sottoscrizione colonna al tuo utente tavolo. Ho intenzione di impostare questo come un numero intero per consentire più livelli: uno, due e tre per sbloccare funzionalità aggiuntive. Sono anche andato avanti e ho creato il modello che ci permetterà di interagire con la tabella dei pagamenti.


Step 3: Scrivi il tuo ascoltatore

PayPal fornisce una soluzione semplice per notificarci quando un pagamento è stato elaborato; lo chiamano Notifiche di pagamento istantaneo (IPN). Per sfruttare l'IPN, dobbiamo creare un listener IPN per la nostra applicazione. L'ascoltatore convalida i dati, li inserisce nella nostra tabella dei pagamenti e imposta il livello di iscrizione dell'utente.

Fortunatamente non dobbiamo reinventare la ruota grazie a questa pratica lezione. Useremo il IpnListener classe per verificare rapidamente i dati, e possiamo quindi elaborare questo per inserirlo nel nostro database. Con Laravel, possiamo posizionare la classe nella nostra cartella di librerie, rendendola autoload per noi.

Crea un nuovo controller o percorso e aggiungi il seguente codice:

$ listener = new IpnListener (); prova $ verified = $ listener-> processIpn ();  catch (Exception $ e) exit (0);  if ($ verified) // La risposta IPN era "VERIFIED" else // La risposta IPN era "INVALID"

Ho chiamato il mio file ipn.php, e lo mapperò a / IPN. Non dimenticare che PayPal applicherà POST a questo URL; quindi se stai usando i verbi HTTP / REST, configuralo di conseguenza. Da qui possiamo elaborare i nostri dati:

$ listener = new IpnListener (); prova $ verified = $ listener-> processIpn ();  catch (Exception $ 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'], 'abbonamento' => $ abbonamento, 'scadenza' => date ('Ymd H: i: s', strtotime ('+ 1 Month')),); Pagamento :: creare ($ TXN);  else Log :: error ('Transaction not verified'); 

In questo codice, prima decodificare il JSON passato al nostro campo personalizzato, dandoci un facile accesso all'ID utente. Quindi impostiamo il livello di iscrizione in base all'ammontare della transazione e lo memorizziamo nel database. Registriamo anche eventuali errori utilizzando la classe Log di Laravel. Potrebbe anche essere bello inviare una ricevuta all'utente, ma lascerò a te.


Passaggio 4: abilitazione IPN

Successivamente, dobbiamo abilitare IPN e configurare PayPal per eseguire il ping del nostro listener. Poiché il pannello di amministrazione di PayPal può essere difficile da navigare, ho incluso i seguenti screenshot per aiutarti a guidarti. Vai a Profilo -> Preferenze di vendita:

Quindi cerca Notifiche di pagamento istantanee:

Quindi, fare clic Scegli Impostazioni IPN:

E poi inserisci l'URL per il tuo listener:


Passaggio 5: ottenere l'API Nome utente, password e firma

Mentre siamo nella dashboard, vale la pena ottenere le credenziali API prima di risolvere il nostro processo di cancellazione. Vai a Profilo -> Preferenze di vendita:

Cercare Accesso API:

Selezionare opzione 2:

Richiedi una firma API:

E prendi nota delle tue credenziali:


Passaggio 6: Gestione delle cancellazioni

È necessario disporre di un account aziendale per implementare i pagamenti dell'abbonamento.

Nota: Avrai bisogno di un certificato SSL per gestire le cancellazioni, o PayPal con un errore.

Per offrire la migliore esperienza utente, è probabile che tu voglia gestire le cancellazioni all'interno dell'applicazione o del servizio. PayPal fornisce alcune API che ci consentono di farlo: NVP o SOAP. Consiglierei di andare con NVP.

La documentazione di PayPal sembra complicare eccessivamente le cose, ma NVP (Name-Value-Pair) è essenzialmente una stringa con codifica URL che possiamo cURL.

Il metodo che ci interessa è ManageRecurringPaymentsProfileStatus. Possiamo cambiare lo stato dell'abbonamento scegliendo una delle seguenti tre azioni:

  • Annulla: Solo gli abbonamenti attivi o sospesi possono essere annullati. La scelta di questa azione impedisce all'utente di riattivarsi in un secondo momento.
  • Sospendere: Solo le iscrizioni attive possono essere sospese. Questa azione consente agli utenti di riattivare la propria sottoscrizione in un secondo momento.
  • riattivare: Solo le iscrizioni sospese possono essere riattivate, ripristinando l'abbonamento.

Utilizzeremo l'azione di annullamento, poiché i nostri pulsanti di sottoscrizione creano un abbonamento completamente nuovo se l'utente desidera riattivarlo in un secondo momento. Quindi la nostra richiesta sarebbe simile a questa:

$ 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' => 'Annulla', 'NOTE' => 'Utente cancellato sul sito web',); $ ch = curl_init (); // Sostituiscili se stai provando con 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 Redirect :: to ('settings') -> with ('cancellato', vero);

Ora possiamo facilmente annullare l'abbonamento, ma per qualche motivo PayPal ha scelto di non inviare una richiesta IPN. Questo non è un problema, dato che abbiamo configurato la nostra app per includere un scade colonna. Quindi possiamo controllare quel campo per determinare se l'utente è iscritto.


Step 7: Giocare nella sandbox

PayPal fornisce una sandbox in modo che possiamo testare la nostra implementazione. Se non l'hai mai usato prima, dovrai creare un account gratuito. Da lì, sarai in grado di testare più utenti e transazioni per assicurarti che il tuo codice funzioni come previsto.

Testeremo il nostro ascoltatore, assicurandoci che funzioni correttamente senza dover eseguire transazioni reali. Prima di fare qualsiasi cosa nella sandbox, dobbiamo configurare il nostro listener IPN per eseguire il ping della sandbox invece del server live.

$ listener-> use_sandbox = true;

Ora vai su Sandbox PayPal, accedi, clicca Strumenti di test a sinistra e apri il simulatore IPN.

Inserisci l'URL del listener e seleziona Cassa rapida dalla discesa. Puoi utilizzare la maggior parte dei dettagli predefiniti, ma non dimenticare di inserire il tuo JSON nel campo personalizzato verso la parte inferiore della pagina.


Passaggio 8: verifica dell'iscrizione

Quindi abbiamo impostato il nostro abbonamento e abilitato gli utenti a cancellare il servizio, ora come possiamo verificarlo? Laravel lo rende facile e il suo metodo si traduce in molte lingue e framework. Ho intenzione di aggiungere un metodo al mio Utente modello che ci consente di accedere all'abbonamento utilizzando la classe Auth di Laravel:

abbonamento a funzione pubblica () return Payment :: where ('user_id', '=', Auth :: user () -> id) -> where ('expires', '>', date ('Ymd H: i: s ', time ())) -> first (array (' subscription ',' expires ',' paypal_id ',' txn_id ')); 

Ora possiamo accedervi e controllare molto facilmente all'interno dei nostri controller e visualizzazioni. Per esempio:

sottoscrizione(); if ($ sub && $ sub-> subscription == 1) echo 'Sei sul piano standard';  elseif ($ sub && $ sub-> subscription == 2) echo 'Sei sul piano premium';  else echo 'Non sei iscritto'; ?>

In conclusione

Speriamo che questo tutorial ti abbia dato un'idea di quanto sia facile impostare pagamenti ricorrenti o in abbonamento nelle tue applicazioni. PayPal non è affatto l'unico processore di pagamento, ma è uno dei più riconosciuti e ampiamente utilizzati.

Da qui, è possibile aggiungere ricevute, promemoria di pagamento e notifiche di annullamento per creare una soluzione completamente integrata.