Procesarea cardurilor de credit este, din păcate, mult mai dificilă decât am putea să sperăm, ca dezvoltatori. Dat fiind faptul că este o sarcină obișnuită, este cu adevărat necesar să trecem prin nenumărate cercuri (înconjurate de foc, bineînțeles) numai în scopul procesării unei plăți? Comercianți? Gateway-uri? SSL? Securitate? Foarte repede, o operațiune aparent simplă poate deveni o sarcină copleșitoare și, mai important, periculoasă. Ori de câte ori vă aflați în situația în care vă gestionați datele sensibile ale unui utilizator, ar fi mai bine să vă aflați pe degetele de la picioare.
Stripe traduce o operație complicată, confuză și periculoasă într-un simplu apel API.Nu ar fi uimitor dacă ar exista un serviciu care să facă acest proces la fel de ușor cum ar putea fi posibil? Un serviciu construit de dezvoltatori pentru dezvoltatori. Ce gând! Introduceți Stripe; nici conturile comercianților, nici gateway-urile. Un apel API, împreună cu câteva instrucțiuni de siguranță, este tot ceea ce aveți nevoie pentru a începe să acceptați plățile prin carduri de credit astăzi.
În timp ce Stripe nu este gratuit, ei cer numai 2,9% din fiecare taxă (plus 30 de cenți). Asta e. Nu există taxe de instalare, taxe de stocare, costuri ascunse - niciunul din acestea. Doar 2,9%. Nu-i rău!
Vândut? Și eu am fost. Să procesăm primul nostru test de plată. Desigur, înainte de a începe, vizitați stripe.com
, creați un cont nou (gratuit) și completați diferitele formulare, cum ar fi descriptorul instrucțiunilor și informațiile dvs. bancare.
Încărcarea unui utilizator necesită doi pași principali:
Firește, primul pas este să construiți un formular de plată pentru produsul dvs. Aveți două opțiuni: folosiți-l pe Stripe verifică script, care va crea automat formularul, va valida intrarea utilizatorului și va genera tokenul unic pentru datele utilizatorului cardului de credit. În situațiile în care configurația și stilul sunt flexibile, acesta este un traseu excelent. Introduceți o etichetă de script, împreună cu câteva atribute HTML5 personalizate și ați terminat!
Stripe oferă o formă de încorporare care accelerează în continuare procesul de acceptare a plăților.
Cu toate acestea, în cele mai multe situații, veți avea nevoie de control complet. Ca atare, pentru scopurile acestui articol, vom folosi un formular personalizat. În această secțiune vom realiza trei lucruri:
Un formular de plată de bază ar putea să arate astfel:
Observați cum nu avem nevoie de multe informații pentru a procesa un card de credit. Din punct de vedere tehnic, singura informație cerută de Stripe este numărul de card de credit și data de expirare. Cu toate acestea, ca o regulă de bază, cu cât mai multe informații pe care le preluați de la utilizator, cu atât mai bine. În cazul în care taxa va fi contestată, această informație suplimentară va fi utilă. Sau, cu alte cuvinte, cu cât mai multe informații solicitați, cu atât este mai probabil ca adevăratul proprietar al cardului de credit să plaseze tranzacția. Cheia este de a găsi linia între destul și atât de mult încât utilizatorul nu deranjează completarea formularului. La minim, solicitați numele utilizatorului, adresa de e-mail, numărul cărții de credit, data de expirare și numărul CVC.
Pentru a continua forajul în cap, nu permiteți niciodată citirea datelor de pe cardul de credit sensibil la server. Acest lucru are potențialul de a crea o lume a rănii, dacă este efectuată incorect. În schimb, ia drumul ușor: asigurați-vă că intrare
s pentru datele de pe cardul de credit ale utilizatorului nu conțin Nume
atribute. Prin omiterea acestui atribut, datele nu pot fi postate pe serverul dvs..
Acordați o atenție deosebită atributelor personalizate de pe intrări, cum ar fi date benzi = „număr“
. Stripe oferă un plugin, stripe.js
, care asistă în procesul de compilare a datelor furnizate de utilizator și de generare a jetonului. Stripe va căuta acele atribute și va prelua valorile respective.
Pentru a face uz de stripe.js
, consultați scenariul din cadrul proiectului și setați cheia dvs. publicabilă, care va fi furnizată când vă înscrieți cu Stripe. De asemenea, vom folosi jQuery în acest articol, deși cu siguranță nu este necesar.
A se gandi la setPublishableKey
ca modalitate de identificare a site-ului dvs. în timpul comunicării cu Stripe. La înscriere, veți primi două versiuni diferite ale acestei chei, pentru testare și producție, respectiv.
Apoi, trebuie să creați tokenul unic de utilizare pentru datele utilizatorului cardului de credit. Putem folosi Dunga
obiect, furnizat de scriptul pe care l-am importat, în acest scop. Chiar mai bine, nu trebuie să ne facem griji cu privire la serializarea datelor din formularul de plată; pur și simplu trece prin obiectul jQuery de formă, iar Stripe se va ocupa de restul.
// Ascultători de evenimente $ ('# formular de plată') la ('trimite', generateToken); var generateToken = funcția (e) var form = $ (aceasta); // Nu apăsați butonul cumpărați acum mai mult decât o dată form.find ('button') prop ('dezactivat', true); // Creați tokenul, bazat pe obiectul formularului Stripe.create (form, stripeResponseHandler); // Preveniți formularul de a trimite e.preventDefault (); ; var stripeResponseHandler = funcție (stare, răspuns) ;
Cu acest bit de JavaScript, când se trimite formularul de plată, Stripe va încerca să genereze un jeton de o singură utilizare, utilizând datele aferente din intrările care includ dunga-
specific atribute personalizate. Al doilea argument în favoarea crea
este un apel invers care va primi simbolul (response.id
) de pe serverul Stripe și continuați în consecință.
În cadrul acestui apel invers, este important să verificați rezultatul (toate informațiile au fost furnizate corect), introduceți tokenul într-un mesaj ascuns intrare
, și trimiteți formularul pe serverul dvs. Din nou, rețineți că informațiile cardului de credit trebuie / nu vor fi afectate de serverul dvs. - numai datele token și non-sensitive. Acest lucru este important, deci acceptați scrierea sau testele funcționale pentru ao verifica.
Apelul dvs. poate arăta astfel:
var stripeResponseHandler = funcție (stare, răspuns) var form = $ ('# formular de plată'); // Orice erori de validare? dacă (answer.error) // Afișați utilizatorul ce a făcut greșit form.find ("eroare de plată") text (response.error.message); // Faceți clic pentru a trimite din nou form.find ('buton'). Prop ('dezactivat', false); altfel // În caz contrar, suntem bine să plecăm! Trimiteți formularul. // Introduceți tokenul unic în formularul $ ('', ' tip ':' ascuns ',' nume ':' stripeToken ',' value ': response.id) appendTo (form); // Apelați metoda de trimitere nativă în formularul // pentru a nu permite anularea formularului .get (0) .submit (); ;
Este foarte simplu! Trimiteți o solicitare AJAX la API-ul Stripe (utilizând pluginul JavaScript util), preluați tokenul generat, introduceți-l în formular și postați-l pe serverul dvs.!
Dacă vă urmați, în acest moment, ați generat cu succes un jeton de o singură utilizare și ați trimis formularul de plată. Acum, este timpul ca limbajul serverului de alegere să creeze fizic taxa. Rețineți că, în secțiunea anterioară, nu a fost efectuată nicio plată. Am generat doar un simbol care reprezenta datele cardului de credit.
Stripe oferă o serie de biblioteci de la server pentru a înregistra taxe noi sau chiar aranja abonamente. Există șanse mari ca limba dvs. preferată să fie reprezentată (PHP, Ruby, Python etc.).
Similar cu secțiunea anterioară, trimiterea unei taxe noi poate fi realizată în câteva etape:
Consultați pagina Bibliotecii Stripe pentru instrucțiuni de instalare. Dacă folosiți PHP, așa cum vom fi în acest articol, este recomandat să folosiți compozitorul pentru a descărca pachetul Stripe.
"necesită": "stripe / stripe-php": "dev-master"
Compozitorul este viitorul managementului dependenței de PHP, așa că ajungeți acum la bord, dacă nu ați făcut-o deja. O sarcină de bază Stripe ar putea lua forma:
// Setați tasta API Stripe :: setApiKey ("API-ul dvs. cheie"); încercați Stripe_Charge :: creați (['sum' => 2000, // acesta este în centi: $ 20 'currency' => 'usd', 'card' => $ _POST ['stripeToken' "Descrieți produsul dvs."]); captură (Stripe_CardError $ e) // Refuzat. Nu procesați achiziția. // Du-te înapoi și spune-le utilizatorului să încerce o nouă carte
Asta e! Cheia API vă va autentifica ca utilizator valid Stripe. Similar cu cheia publicabilă, Stripe vă va oferi două versiuni diferite ale acestei chei: una pentru testare și producție, respectiv.
Rețineți că toate taxele către Stripe ar trebui să fie declarate în centi (în funcție de monedă, desigur). Dacă prețurile sunt stocate în baza dvs. de date ca dolari, euro sau lire sterline, atunci veți dori să compensați în mod corespunzător, atunci când faceți taxa.
Dacă nu este aruncat nici o excepție, puteți fi siguri că taxa a fost procesată cu succes. Continuați oferindu-le utilizatorului descărcarea lor digitală sau înregistrarea achiziției cu sistemul dvs..
Credeți sau nu, lucrarea lui Stripe este terminată. Există cu siguranță mai multe lucruri pe care le puteți face, cum ar fi crearea de clienți și gestionarea abonamentelor, dar atunci când este vorba doar de procesarea unei singure plăți, ați terminat! ... Cu excepția faptului că nu sunteți.
În timp ce, da, lucrarea lui Stripe este terminată, a ta, pe de altă parte, nu este. Indiferent de furnizorul de plăți, oricând lucrați cu informații despre cartea de credit, securitatea ar trebui să fie o preocupare de vârf. Am făcut deja primii pași, asigurându-ne că datele cardului de credit nu ating niciodată serverul, dar mai sunt încă multe de făcut. Apoi, trebuie să asigurăm conexiunea utilizatorului cu serverul. Cu alte cuvinte, aveți nevoie de un certificat SSL. În nici un caz nu trebuie să treceți peste acest pas!
"SSL (Secure Sockets Layer) este tehnologia standard de securitate pentru stabilirea unei legături criptate între un server web și un browser. Această legătură asigură faptul că toate datele transmise între serverul web și browserele rămân private și integrate. "- info.ssl.com
Când un utilizator oferă un site web informațiile despre cartea de credit, se așteaptă să vadă https
în bara de adrese. Din fericire, achiziționarea unui certificat SSL este mult mai ușor decât a fost. De fapt, majoritatea gazde oferă un add-on SSL, care transformă întregul proces într-un singur clic. Același lucru este valabil și pentru diferite opțiuni SaaS, cum ar fi Pagoda Box sau Heroku.
Bacsis: Odată ce activați SSL, este posibil ca imaginile și materialele să se întrerupă. Pentru a remedia această problemă, asigurați-vă că toate adresele URL se utilizează
https
, Decathttp
. Sau, ca o soluție mai bună, utilizați adrese URL relative.
Cu această tehnică, popularizată de Paul Irish, dacă pagina curentă utilizează HTTPS, atunci activul va fi solicitat și cu HTTPS.
Presupunând că gazda dvs. oferă un add-on SSL cu un singur clic, pur și simplu indicați utilizatorul dvs. la https: //
versiune a paginii de comandă și sunteți pregătit să mergeți!
Exemplele din acest articol sunt simple și mai mult procedurale. Șansele sunt mari, totuși, că veți lucra cu un cadru care să suporte medii multiple, facilități de rutare și testare. Utilizați următoarele sfaturi ca un start-end pentru integrarea Stripe cu cadrul dvs. de alegere.
În mod evident, nu doriți să utilizați numere reale de cărți de credit pentru a testa formularele de plată! Din fericire, Stripe sa gândit deja la acest lucru; acestea includ un număr de numere de cărți de credit care simulează răspunsuri specifice, cum ar fi o încărcare reușită, un număr nevalid, un cod CVC incorect și multe altele.
Iată câteva numere de carte pe care le veți referi frecvent:
Când lucrați cu Stripe, veți avea două chei unice, care reprezintă API-ul și cheile publicabile. În plus, există variante de testare și de producție pentru fiecare dintre acestea. Cele mai multe cadre oferă o modalitate de a gestiona medii multiple. În acest fel, pentru dezvoltare, aplicația dvs. va utiliza corect tastele de testare, în timp ce, odată implementate, versiunile de producție vor fi menționate.
Mai jos este un proiect specific lui Laravel. Laravel oferă un sistem simplu de mediu. Adăugați un fișier de configurare într-un dosar care corespunde numelui de mediu, iar aceste valori vor avea prioritate față de valorile implicite.
Mai întâi, setăm cheile de producție:
'KEY API PRODUCTION', 'publishableKey' => 'KEY PUBLISHABLE PRODUCTION'];
Și pentru dezvoltare, depășim cheile de producție cu omologii lor de testare:
'TEST API KEY', 'publicableKey' => 'TEST PUBLISHABLE KEY'];
Acum, când cererea necesită cheia API, folosind Config :: get ( 'stripe.apiKey')
, valoarea returnată va fi determinată de mediul înconjurător. Succes!
O greșeală obișnuită pe care dezvoltatorii încep să o facă este legarea aplicațiilor lor de diferiți furnizori, cum ar fi Stripe. Cererea dvs. nu ar trebui să aibă în vedere furnizorul de facturare utilizat. Este doar preocupat de faptul că unul este disponibil. Prin referințe greu de codat la Stripe în clasele dvs., creați o legătură directă între cele două - una care va fi probabil dificil de schimbat.
Întrebați-vă: "Dacă în viitor trebuie să schimbați Stripe cu un furnizor diferit, cât de dificil va fi acesta?" Sugestie: orice este mai mare decât "doar un moment"Este un miros de cod.
În schimb, codul la o interfață - poate BillingProvider
sau BillingGateway
. În acest fel, puteți crea diferite implementări ale interfeței: una pentru Stripe sau una pentru un serviciu diferit în totalitate, în caz de necesitate. Aceste diferite implementări vor găzdui funcționalitatea specifică serviciului. Dacă, la un moment dat, veți găsi un furnizor de facturare mai ieftin decât Stripe, schimbând implementarea Stripe BillingProvider
cu ServiceX
versiunea va dura doar un moment - adică, odată ce ați creat noua implementare care cere întrebări ServiceX
API de facturare.
Iată un schelet pentru cum ar putea părea acest lucru:
// Definiți interfața de interfață BillingProvider taxă de funcționare publică ($ creditInfo); // Creați o clasă de implementare Stripe StripeBilling taxă de funcționare publică ($ creditInfo) // Stripe_Charge :: taxă (...); // Creați o clasă de implementare ServiceX ServiceXBilling taxă funcțională publică ($ creditInfo) // încărcați utilizatorul cu ServiceX
Acum, când avem două implementări, putem să ne referim la serviciul de facturare preferat, utilizând injecția de dependență.
clasa PaymentController facturare protejată $; funcția publică __construct (facturarea BillingProvider $) $ this-> invoicing = $ invoicing;
Cu acest stil de dezvoltare, dacă ați terminat nevoia să vă îndepărtați de Stripe, controlerul nu va trebui să fie atins. Deoarece Stripe nu este codificat greu, nu știe diferența!
Atunci când vindeți bunuri digitale, întrebați-vă: "Ce ar trebui să facă cumpărătorul dacă ceva nu merge bine în capătul meu?" Întotdeauna oferiți cumpărătorului posibilitatea de a lua legătura cu dvs. sau compania dvs. Ce se întâmplă dacă e-mailul de confirmare care include un link pentru descărcarea fișierului digital nu ajunge niciodată în căsuța de e-mail a cumpărătorului? Ce ar trebui să facă?
Un site de asistență sau chiar o adresă de e-mail simplă pe pagina de pornire ar trebui să ajute în aceste situații inevitabile.
Dacă trebuie să achiziționați manual un certificat SSL, există un număr de servicii de alegere. Bazându-vă pe experiența anterioară, vă puteți aștepta să petreceți treizeci de minute până la o oră pentru a stabili lucrurile. Rețineți că majoritatea certificatelor nu sunt gratuite și pot varia de la $ 10- $ 500, în funcție de furnizor.
Echipa Stripe recomandă DigiCert și Namecheap, dar dacă preferați, puteți lua în considerare o soluție gratuită, cum ar fi StartSSL.
O greșeală frecventă provine din utilizarea datelor din formular pentru a conține prețul produsului achiziționat, eventual printr-o intrare ascunsă. Deoarece un utilizator poate modifica cu ușurință valoarea acestei intrări, este greșit să depindem de aceasta. Intoarceți întotdeauna prețul produsului din partea serverului. Nu vă bazați niciodată pe formular pentru a vă spune. O interogare bazată pe o bază de date simplă este opțiunea preferată.
Activul pe care îl vindeți nu ar trebui să fie accesibil publicului, chiar dacă adresa URL este, după părerea dvs., suficient de lungă și confuză până la punctul în care majoritatea nu o vor învăța niciodată. Aceasta este o practică proastă din mai multe motive.
În schimb, creați un download-uri
tabel care conține coduri de achiziție unice, împreună cu ID-urile asociate ale acestora. În acest fel, când un URI, cum ar fi / De descărcări / 23gsfga831g
, este solicitată, cererea dvs. va:
Pentru a continua, puteți impune și o limită de descărcare. Permiterea acestui lucru ar necesita pur și simplu a DOWNLOAD_COUNT
câmpul trebuie adăugat la achiziții
masa. Cu fiecare cerere, acel număr ar trebui să fie incrementat cu unul. Odată ce acest număr atinge pragul dvs. desemnat, descărcarea nu mai trebuie furnizată. Acest lucru poate fi util în situațiile în care doriți să vă asigurați că legăturile de descărcare nu sunt partajate.
Lucrul minunat despre Stripe este că acesta traduce o operație complicată, confuză și periculoasă într-un singur apel API simplu. Nu conturile comercianților, nici gateway-urile, nici taxele ascunse. Există un motiv pentru care spun că Stripe este ușor de folosit. Este!