L'elaborazione delle carte di credito è purtroppo molto più difficile di quanto potremmo sperare, in quanto sviluppatori. Dato che è un compito così comune, è davvero necessario passare attraverso innumerevoli cerchi (circondati dal fuoco, ovviamente) al solo scopo di elaborare un pagamento? I commercianti? Gateway? SSL? Sicurezza? Molto rapidamente, un'operazione apparentemente semplice può diventare un compito estremamente confuso e, soprattutto, pericoloso. Ogni volta che ti trovi a gestire i dati sensibili di un utente, è meglio che tu stia in punta di piedi.
Stripe converte un'operazione complicata, confusa e pericolosa in una semplice chiamata API.Non sarebbe fantastico se esistesse un servizio che rendesse questo processo facile come potrebbe essere? Un servizio creato dagli sviluppatori per gli sviluppatori. Che pensiero! Inserisci Stripe; nessun account commerciante, nessun gateway. Una chiamata API, insieme ad alcune linee guida sulla sicurezza, è tutto ciò che serve per iniziare ad accettare i pagamenti con carta di credito oggi.
Mentre Stripe non è gratuito, chiede solo il 2,9% di ogni addebito (più 30 centesimi). Questo è tutto. Nessuna commissione di installazione, costi di archiviazione, costi nascosti - niente di tutto questo. Solo il 2,9%. Non male!
Venduto? Lo ero anche io Elaboriamo il nostro primo pagamento di prova. Certo, prima di iniziare, visita stripe.com
, creare un nuovo account (gratuito) e compilare i vari moduli, ad esempio il descrittore dell'istruzione e le informazioni bancarie.
Il caricamento di un utente richiede due passaggi principali:
Naturalmente, il primo passo è creare un modulo di pagamento per il tuo prodotto. Hai due opzioni: usa Stripe's check-out script, che creerà automaticamente il modulo, convaliderà l'input dell'utente e genererà il token univoco per i dati della carta di credito dell'utente. In situazioni in cui la configurazione e lo stile sono flessibili, questa è una strada eccellente da percorrere. Inserisci un tag script, insieme a una manciata di attributi HTML5 personalizzati e il gioco è fatto!
Stripe offre una forma incorporabile che accelera ulteriormente il processo di accettazione dei pagamenti.
Tuttavia, nella maggior parte delle situazioni, è necessario il pieno controllo. In quanto tale, per gli scopi di questo articolo, useremo un modulo personalizzato. In questa sezione, realizzeremo tre cose:
Un modulo di pagamento di base potrebbe essere simile a:
Nota come non abbiamo bisogno di molte informazioni per elaborare una carta di credito. Tecnicamente, l'unica informazione richiesta da Stripe è il numero di una carta di credito e la data di scadenza. Tuttavia, come regola generale, più informazioni recuperate dall'utente, meglio è. In caso di contestazione della carica, queste informazioni aggiuntive saranno utili. In altre parole, più informazioni richiedi, più è probabile che il vero proprietario della carta di credito stia effettuando la transazione. La chiave è trovare la linea in mezzo abbastanza e così tanto che l'utente non si preoccupa di compilare il modulo. Al minimo, richiedere il nome dell'utente, l'indirizzo e-mail, il numero di carta di credito, la data di scadenza e il numero CVC.
Per continuare a trivellare nella tua testa, non consentire mai dati sensibili della carta di credito di toccare il tuo server. Fare così ha il potenziale per creare un mondo di dolore, se eseguito in modo errato. Invece, prendi la strada facile: assicurati che il ingresso
s per i dati della carta di credito dell'utente non contengono nome
attributi. Omettendo questo attributo, i dati non possono essere registrati sul tuo server.
Presta particolare attenzione agli attributi personalizzati sugli input, come ad esempio Dati-stripe = "numero"
. Stripe offre un plugin, stripe.js
, che aiuta nel processo di compilazione dei dati forniti dall'utente e nella generazione del token. La striscia cercherà quegli attributi e recupererà i loro rispettivi valori.
Per fare uso di stripe.js
, fai riferimento allo script all'interno del tuo progetto e imposta la tua chiave pubblicabile, che verrà fornita quando ti iscrivi con Stripe. In questo articolo useremo anche jQuery, sebbene non sia certamente necessario.
Pensa a setPublishableKey
come modo per identificare il tuo sito web quando comunichi con Stripe. Al momento della registrazione, ti verranno presentate due versioni differenti di questa chiave, rispettivamente per il test e la produzione.
Successivamente, dobbiamo creare il token univoco, monouso per i dati della carta di credito dell'utente. Possiamo usare il Banda
oggetto, fornito dallo script che abbiamo importato, per questo scopo. Ancora meglio, non dobbiamo preoccuparci di serializzare i dati del modulo di pagamento; semplicemente passa attraverso il modulo jQuery object e Stripe gestirà il resto.
// Listener di eventi $ ('# payment-form'). On ('submit', generateToken); var generateToken = function (e) var form = $ (this); // Non premere il pulsante Acquista ora più di una volta form.find ('button'). Prop ('disabled', true); // Crea il token, basato sull'oggetto del modulo Stripe.create (form, stripeResponseHandler); // Impedisce al modulo di inviare e.preventDefault (); ; var stripeResponseHandler = function (status, response) ;
Con questo bit di JavaScript, quando viene inviato il modulo di pagamento, Stripe tenterà di generare un token monouso, utilizzando i relativi dati dagli input che includono banda-
attributi personalizzati specifici. Il secondo argomento per il creare
metodo è un callback che riceverà il token (response.id
) dal server Stripe e procedere di conseguenza.
All'interno di questo callback, è importante verificare il risultato (tutte le informazioni fornite correttamente), inserire il token in un nascosto ingresso
, e invia il modulo al tuo server. Anche in questo caso, si noti che le informazioni della carta di credito non dovrebbero / non colpiranno il server, ma solo i token e i dati non sensibili. Questo è importante, quindi accettate di scrivere o test funzionali per verificarlo.
La tua richiamata potrebbe essere simile a questa:
var stripeResponseHandler = function (status, response) var form = $ ('# payment-form'); // Qualche errore di validazione? if (response.error) // Mostra all'utente cosa ha fatto di sbagliato form.find ('. payment-errors'). text (response.error.message); // Rendi di nuovo l'invio cliccabile form.find ('button'). Prop ('disabled', false); else // Altrimenti, siamo a posto! Invia il modulo. // Inserisci il token univoco nel modulo $ ('', ' type ':' hidden ',' name ':' stripeToken ',' value ': response.id). appendTo (form); // Chiama il metodo di invio nativo nel modulo // per impedire che l'invio venga cancellato da form.get (0) .submit (); ;
È davvero abbastanza semplice! Invia una richiesta AJAX all'API di Stripe (utilizzando il relativo plug-in JavaScript utile), recupera il token generato, lo inserisce nel modulo e lo pubblica sul server!
Se in seguito, a questo punto, hai generato correttamente un token monouso e inviato il modulo di pagamento. Ora è il momento di scegliere il linguaggio sul lato server per creare fisicamente l'addebito. Ricorda, nella sezione precedente, non è stato effettuato alcun addebito. Abbiamo generato solo un token che rappresentava i dati della carta di credito.
Stripe offre un numero di librerie lato server per la registrazione di nuovi addebiti o anche l'organizzazione di abbonamenti. È probabile che la tua lingua preferita sia rappresentata (PHP, Ruby, Python, ecc.).
Simile alla sezione precedente, l'invio di un nuovo addebito può essere effettuato in pochi passaggi:
Fare riferimento alla pagina Libreria di Stripe per le istruzioni di installazione. Se utilizzi PHP, come vedremo in questo articolo, ti consigliamo di utilizzare Composer per scaricare il pacchetto Stripe.
"require": "stripe / stripe-php": "dev-master"
Il compositore è il futuro della gestione delle dipendenze di PHP, quindi sali a bordo ora, se non lo hai già fatto. Una carica di Stripe di base potrebbe assumere la forma di:
// Imposta la tua chiave API Stripe :: setApiKey ("YOUR API KEY"); prova Stripe_Charge :: create (['amount' => 2000, // questo è in centesimi: $ 20 'currency' => 'usd', 'card' => $ _POST ['stripeToken'], 'description' => 'Descrivi il tuo prodotto']); catch (Stripe_CardError $ e) // Rifiutato. Non elaborare il loro acquisto. // Torna indietro e chiedi all'utente di provare una nuova carta
Questo è tutto! La chiave API ti autenticherà come utente Stripe valido. Simile alla chiave pubblicabile, Stripe ti fornirà due versioni differenti di questa chiave: una per test e produzione, rispettivamente.
Si prega di notare che tutte le spese per Stripe devono essere dichiarate in centesimi (in base alla valuta, ovviamente). Se i prezzi sono memorizzati nel tuo database come dollari, euro o sterline, allora dovrai compensare di conseguenza, quando effettui il pagamento.
Se non viene lanciata alcuna eccezione, puoi essere certo che l'addebito è stato elaborato correttamente. Procedi offrendo all'utente il loro download digitale o registrando il loro acquisto con il tuo sistema.
Che ci crediate o no, il lavoro di Stripe è finito. C'è sicuramente altro che puoi fare, come creare clienti e gestire gli abbonamenti, ma, quando si tratta semplicemente di elaborare un singolo pagamento, hai finito! ... Tranne che non lo sei.
Mentre, sì, il lavoro di Stripe è finito, il tuo, d'altra parte, non lo è. Indipendentemente dal fornitore di servizi di pagamento, ogni volta che si lavora con le informazioni della carta di credito, la sicurezza dovrebbe essere una delle principali preoccupazioni. Abbiamo già fatto i primi passi, assicurando che i dati della carta di credito non tocchino mai il server, ma c'è ancora molto da fare. Successivamente, dobbiamo proteggere la connessione dell'utente al tuo server. In altre parole, è necessario un certificato SSL. In nessun caso si dovrebbe saltare questo passaggio!
"SSL (Secure Sockets Layer) è la tecnologia di sicurezza standard per stabilire un collegamento crittografato tra un server web e un browser. Questo collegamento garantisce che tutti i dati trasmessi tra il server Web e i browser rimangano privati e integri. "- info.ssl.com
Quando un utente offre a un sito Web i dati della carta di credito, si aspettano di vedere https
all'interno della barra degli indirizzi. Fortunatamente, l'acquisto di un certificato SSL è molto più semplice di un tempo. In effetti, la maggior parte degli host offre un add-on SSL, che trasforma l'intero processo in un singolo clic. Lo stesso vale per varie opzioni SaaS, come Pagoda Box o Heroku.
Mancia: Una volta abilitato SSL, è possibile che le immagini e le risorse si interrompano. Per risolvere questo problema, assicurati che tutti gli URL vengano utilizzati
https
, piuttosto chehttp
. Oppure, come soluzione migliore, utilizzare URL relativi al protocollo.
Con questa tecnica, resa popolare da Paul Irish, se la pagina corrente utilizza HTTPS, la risorsa verrà richiesta anche con HTTPS.
Supponendo che il tuo host offra un add-on SSL con un solo clic, punta semplicemente il tuo utente a https: //
versione della pagina dell'ordine e siete pronti per partire!
Gli esempi in questo articolo sono semplici e per lo più procedurali. Tuttavia, è probabile che lavorerai con un framework che supporta più ambienti, routing e strutture di test. Utilizzare i seguenti suggerimenti come punto di partenza per l'integrazione di Stripe con il framework scelto.
Chiaramente, non si desidera utilizzare numeri di carta di credito reali per testare i moduli di pagamento! Fortunatamente, Stripe ci ha già pensato; includono un numero di numeri di carte di credito che simulano risposte specifiche, come ad esempio addebito riuscito, numero non valido, codice CVC errato e molti altri.
Ecco alcuni numeri di carte che farai frequentemente riferimento:
Quando lavori con Stripe, avrai due chiavi univoche, che rappresentano le API e le chiavi pubblicabili. Inoltre, ci sono varianti di test e produzione per ciascuno di questi. La maggior parte dei framework offre un modo per gestire più ambienti. In questo modo, per lo sviluppo, l'applicazione utilizzerà correttamente le chiavi di test, mentre, una volta implementata, le versioni di produzione saranno referenziate.
Di seguito è riportato un progetto specifico per Laravel. Laravel fornisce un semplice sistema di ambiente. Aggiungi un file di configurazione all'interno di una cartella che corrisponde al nome dell'ambiente e quei valori avranno la precedenza sui valori predefiniti.
Innanzitutto, impostiamo le chiavi di produzione:
'PRODUCTION API KEY', 'publishableKey' => 'PRODUCTION PUBLISHABLE KEY'];
E per lo sviluppo, sostituiamo le chiavi di produzione con le loro controparti di test:
'TEST API KEY', 'publishableKey' => 'TEST PUBLISHABLE KEY'];
Ora, quando l'applicazione richiede la chiave API, usando Config :: get ( 'stripe.apiKey')
, il valore che viene restituito sarà determinato dall'ambiente. Successo!
Un errore comune che l'avvio degli sviluppatori fa derivare il collegamento delle loro applicazioni a vari provider, come Stripe. La tua applicazione non dovrebbe preoccuparsi di quale fornitore di fatturazione viene utilizzato. Riguarda solo il fatto che uno è disponibile. Con riferimenti hard-coding a Stripe nelle tue classi, stai creando una connessione diretta tra i due, che sarà probabilmente difficile da cambiare.
Chiediti: "Se, in futuro, avrò bisogno di scambiare Stripe con un altro fornitore, quanto sarà difficile?" Suggerimento: qualsiasi cosa più grande di "solo un momento"È un odore di codice.
Invece, il codice di un'interfaccia - forse BillingProvider
o BillingGateway
. In questo modo, è possibile creare varie implementazioni dell'interfaccia: una per Stripe o una per un servizio completamente diverso, in caso di necessità. Queste varie implementazioni ospiteranno la funzionalità specifica del servizio. Se, ad un certo punto, trovi un fornitore di servizi di fatturazione più economico di Stripe, sostituendo l'implementazione Stripe di BillingProvider
con un ServiceX
la versione richiederà solo un momento, ovvero una volta creata la nuova implementazione che richiede il ServiceX
API di fatturazione.
Ecco uno scheletro per come potrebbe apparire:
// Definire l'interfaccia dell'interfaccia BillingProvider carica di funzione pubblica ($ creditInfo); // Crea una classe di implementazione Stripe StripeBilling carica di funzione pubblica ($ creditInfo) // Stripe_Charge :: charge (...); // Crea una classe di implementazione ServiceX ServiceXBilling addebito funzione pubblico ($ creditInfo) // carica utente con ServiceX
Ora che abbiamo due implementazioni, possiamo fare riferimento al nostro attuale servizio di fatturazione preferito, usando l'iniezione di dipendenza.
class PaymentController protected $ billing; funzione pubblica __construct (fatturazione $ BillingProvider) $ this-> fatturazione = $ fatturazione;
Con questo stile di sviluppo, se si finisce per dover allontanarsi da Stripe, il controller non avrà bisogno di essere toccato. Perché Stripe non è hardcoded, non conosce la differenza!
Quando si vendono beni digitali, chiedetevi: "Cosa dovrebbe fare l'acquirente se qualcosa va storto sul mio capo?" Fornire sempre un modo per l'acquirente di contattare voi o la vostra azienda. Cosa succede se l'e-mail di conferma che include un collegamento per scaricare il file digitale non arriva mai nella posta in arrivo dell'acquirente? Cosa dovrebbero fare?
Un sito di supporto, o anche un semplice indirizzo email sulla home page, dovrebbe aiutare in queste situazioni inevitabili.
Se è necessario acquistare manualmente un certificato SSL, è possibile scegliere tra diversi servizi. Basandoti sull'esperienza precedente, puoi aspettarti di passare trenta minuti a un'ora per sistemare le cose. Tieni presente che la maggior parte dei certificati non è gratuita e può variare da $ 10 a $ 500, a seconda del fornitore.
Il team Stripe consiglia DigiCert e Namecheap, tuttavia, se preferisci, potresti prendere in considerazione una soluzione gratuita, come StartSSL.
Un errore frequente deriva dall'utilizzo dei dati del modulo per contenere il prezzo del prodotto acquistato, possibilmente tramite un input nascosto. Poiché un utente può facilmente modificare il valore di questo input, non è saggio dipendere da questo. Recupera sempre il prezzo del prodotto dal lato server. Mai fare affidamento sul modulo per dirti. Una semplice query di database è l'opzione preferita.
La risorsa che stai vendendo non dovrebbe mai essere accessibile al pubblico, anche se l'URL è, secondo la tua opinione, abbastanza lungo e confuso al punto che la maggior parte non lo imparerebbe mai. Questa è una cattiva pratica per una serie di motivi.
Invece, crea un download
tabella che contiene codici di acquisto unici, insieme ai rispettivi ID di prodotto associati. In questo modo, quando un URI, come / Downloads / 23gsfga831g
, è richiesto, la tua applicazione:
Per andare oltre, potresti anche imporre un limite di download. Consentire ciò richiederebbe semplicemente che a DOWNLOAD_COUNT
campo da aggiungere al acquisti
tavolo. Ad ogni richiesta, quel numero dovrebbe essere incrementato di uno. Una volta che questo numero raggiunge la soglia designata, il download non deve più essere fornito. Ciò può essere utile nei casi in cui si desidera garantire che i collegamenti per il download non siano condivisi.
La cosa meravigliosa di Stripe è che traduce un'operazione complicata, confusa e pericolosa in una singola, semplice chiamata API. Nessun conto commerciale, nessun gateway, nessuna tariffa nascosta. C'è una ragione per cui dicono che Stripe è ridicolmente facile da usare. È!