Het verwerken van creditcards is helaas veel moeilijker dan we hopen, als ontwikkelaars. Gegeven het feit dat het zo'n gebruikelijke taak is, is het echt nodig dat we door ontelbare hoepels springen (natuurlijk omringd door vuur) met als enig doel een betaling te verwerken? Merchants? Gateways? SSL? Veiligheid? Zeer snel kan een schijnbaar eenvoudige handeling een overweldigend verwarrende en, nog belangrijker, gevaarlijke taak worden. Telkens wanneer u merkt dat u omgaat met de gevoelige gegevens van een gebruiker, kunt u maar beter op uw hoede zijn.
Stripe vertaalt een gecompliceerde, verwarrende en gevaarlijke bewerking in een eenvoudige API-aanroep.Zou het niet verbazingwekkend zijn als er een service was die dit proces zo gemakkelijk mogelijk maakte? Een service gebouwd door ontwikkelaars voor ontwikkelaars. Wat een gedachte! Voer Stripe in; geen verkopersaccounts, geen gateways. Een API-aanroep, samen met een paar veiligheidsrichtlijnen, is alles wat u nodig hebt om vandaag met het accepteren van creditcardbetalingen te beginnen.
Hoewel Stripe niet gratis is, vragen ze slechts 2,9% van elke lading (plus .30 cent). Dat is het. Geen opstartkosten, opslagkosten, verborgen kosten - niets van dat alles. Slechts 2,9%. Niet slecht!
Verkocht? Ik was ook. Laten we onze eerste testbetaling verwerken. Natuurlijk, voor het begin, bezoek stripe.com
, maak een nieuw account aan (gratis) en vul de verschillende formulieren in, zoals de beschrijvingsdescriptor en uw bankgegevens.
Het laden van een gebruiker vereist twee kernstappen:
Uiteraard is de eerste stap het bouwen van een betaalformulier voor uw product. Je hebt twee opties: gebruik Stripe's uitchecken script, waarmee het formulier automatisch wordt aangemaakt, de invoer van de gebruiker wordt gevalideerd en het unieke token voor de creditcardgegevens van de gebruiker wordt gegenereerd. In situaties waarin configuratie en styling flexibel zijn, is dit een uitstekende route om te nemen. Voeg een scripttag in, samen met een handvol aangepaste HTML5-kenmerken, en u bent klaar!
Stripe biedt een insluitbare vorm die het proces van het accepteren van betalingen verder versnelt.
In de meeste situaties heeft u echter volledige controle nodig. Daarom gebruiken we voor dit artikel een aangepast formulier. In deze sectie zullen we drie dingen bereiken:
Een basisbetalingsformulier kan er als volgt uitzien:
Merk op hoe we niet veel informatie nodig hebben om een creditcard te verwerken. Technisch gezien is de enige informatie die Stripe vraagt een creditcardnummer en vervaldatum. Als vuistregel geldt echter: hoe meer informatie u van de gebruiker ophaalt, hoe beter. Als de kosten worden betwist, komt deze extra informatie van pas. Of, met andere woorden, hoe meer informatie u opvraagt, hoe waarschijnlijker het is dat de echte eigenaar van de creditcard de transactie plaatst. De sleutel is om de grens tussen te vinden genoeg en zo veel dat de gebruiker niet de moeite neemt om het formulier in te vullen. Vraag ten minste om de naam, het e-mailadres, het creditcardnummer, de vervaldatum en het CVC-nummer van de gebruiker.
Als u wilt blijven boren, mag u nooit toestaan dat gevoelige creditcardgegevens uw server raken. Als je dit doet, heb je het potentieel om een wereld van pijn te creëren, als deze verkeerd wordt uitgevoerd. Neem in plaats daarvan de gemakkelijke weg: zorg ervoor dat de invoer
s voor de creditcardgegevens van de gebruiker bevatten geen naam
attributen. Door dit kenmerk weg te laten, kunnen de gegevens niet op uw server worden gepost.
Besteed veel aandacht aan de aangepaste kenmerken op de ingangen, zoals data-stripe = "nummer"
. Stripe biedt een plug-in, stripe.js
, die helpt bij het compileren van de door de gebruiker verstrekte gegevens en het genereren van het token. Stripe zoekt naar die attributen en haalt hun respectieve waarden op.
Om gebruik te maken van stripe.js
, verwijs naar het script in uw project en stel uw publiceerbare sleutel in, die wordt verstrekt wanneer u zich aanmeldt met Stripe. We zullen ook jQuery gebruiken in dit artikel, hoewel het zeker niet verplicht is.
Denken aan setPublishableKey
als een manier om uw website te identificeren wanneer u communiceert met Stripe. Als u zich aanmeldt, krijgt u twee verschillende versies van deze sleutel te zien, voor het testen en voor de productie.
Vervolgens moeten we het unieke token voor eenmalig gebruik maken voor de creditcardgegevens van de gebruiker. We kunnen de gebruiken Streep
object, geleverd door het script dat we hebben geïmporteerd, voor dit doel. Beter nog, we hoeven ons geen zorgen te maken over het serialiseren van de gegevens van het betaalformulier; ga gewoon door het formulier jQuery-object en Stripe zal de rest afhandelen.
// Event Luisteraars $ ('# payment-form'). On ('submit', generateToken); var generateToken = functie (e) var form = $ (this); // Druk niet meer één keer op de knop Nu kopen form.find ('knop'). Prop ('disabled', true); // Maak het token op basis van het formulierobject Stripe.create (form, stripeResponseHandler); // Voorkom dat het formulier e.preventDefault () indient; ; var stripeResponseHandler = function (status, antwoord) ;
Met dit bit JavaScript, wanneer het betalingsformulier wordt ingediend, probeert Stripe een token voor eenmalig gebruik te genereren met behulp van de gerelateerde gegevens van de ingangen die streep-
specifieke aangepaste kenmerken. Het tweede argument voor de creëren
methode is een callback die het token zal ontvangen (response.id
) van de Stripe-server, en volg dienovereenkomstig.
Binnen deze callback is het belangrijk om het resultaat te controleren (was alle informatie correct verstrekt), plaats het token in een verborgen invoer
, en verzend het formulier naar uw server. Nogmaals, merk op dat de creditcardgegevens uw server niet moeten / zullen raken - alleen de token en niet-gevoelige gegevens. Dit is belangrijk, dus schrijf de acceptatie of functionele tests om het te verifiëren.
Uw callback kan er als volgt uitzien:
var stripeResponseHandler = function (status, antwoord) var form = $ ('# payment-form'); // Eventuele validatiefouten? if (response.error) // Laat de gebruiker zien wat ze fout hebben gedaan form.find ('. payment-errors'). text (response.error.message); // Maak de submit klikbaar opnieuw form.find ('button'). Prop ('disabled', false); else // Anders zijn we goed om te gaan! Verzend het formulier. // Voeg het unieke token in in het formulier $ ('', ' type ':' hidden ',' name ':' stripeToken ',' value ': response.id). appendTo (formulier); // Roep de methode native submit op het formulier // om te voorkomen dat de inzending wordt geannuleerd form.get (0) .submit (); ;
Het is echt heel simpel! Dien een AJAX-verzoek in bij de Stripe-API (met behulp van hun handige JavaScript-plug-in), haal het gegenereerde token op, voeg het in het formulier in en plaats het op uw server!
Als u nu verder gaat, hebt u met succes een token voor eenmalig gebruik gegenereerd en het betalingsformulier verzonden. Nu is het tijd voor uw taalkeuze op de server om de lading fysiek te creëren. Vergeet niet dat in het vorige gedeelte geen kosten zijn gemaakt. We hebben alleen een token gegenereerd dat de creditcardgegevens vertegenwoordigt.
Stripe biedt een aantal server-side bibliotheken voor het registreren van nieuwe kosten of zelfs het regelen van abonnementen. De kans is groot dat uw voorkeurstaal wordt weergegeven (PHP, Ruby, Python, etc.).
Net als bij de vorige sectie, kan het indienen van een nieuwe lading in een paar stappen worden voltooid:
Raadpleeg de Stripe-bibliotheekpagina voor installatie-instructies. Als je PHP gebruikt, zoals we in dit artikel zullen lezen, is het raadzaam om Composer te gebruiken om het Stripe-pakket te downloaden.
"require": "stripe / stripe-php": "dev-master"
Composer is de toekomst van PHP-afhankelijkheidsbeheer, dus ga nu aan boord, als je dat nog niet hebt gedaan. Een standaard stripe-lading kan de vorm aannemen van:
// Stel uw API-sleutel in Stripe :: setApiKey ("YOUR API KEY"); probeer Stripe_Charge :: create (['amount' => 2000, // dit is in centen: $ 20 'currency' => 'usd', 'card' => $ _POST ['stripeToken'], 'description' => 'Beschrijf uw product']); catch (Stripe_CardError $ e) // Afgewezen. Verwerk de aankoop niet. // Ga terug en vertel de gebruiker om een nieuwe kaart te proberen
Dat is het! De API-sleutel verifieert u als een geldige Stripe-gebruiker. Net als de publiceerbare sleutel, biedt Stripe u twee verschillende versies van deze sleutel: een voor het testen en de productie, respectievelijk.
Houd er rekening mee dat alle kosten voor Stripe in centen moeten worden aangegeven (uiteraard op basis van de valuta). Als prijzen in uw database worden opgeslagen als dollars, euro's of ponden, dan wilt u dienovereenkomstig compenseren bij het in rekening brengen van de kosten.
Als er geen uitzondering wordt gegenereerd, kunt u er zeker van zijn dat de afschrijving met succes is verwerkt. Ga verder door de gebruiker zijn digitale download aan te bieden of zijn aankoop bij uw systeem te registreren.
Geloof het of niet, het werk van Stripe is afgelopen. Er is zeker meer dat u kunt doen, zoals het maken van klanten en het beheren van abonnementen, maar als het gaat om het eenvoudig verwerken van een enkele betaling, bent u klaar! ... Behalve dat u dat niet bent.
Terwijl, ja, het werk van Stripe is voltooid, is dat van jou echter niet het geval. Ongeacht de betalingsprovider, op elk moment dat u met creditcardgegevens werkt, moet beveiliging een topprioriteit zijn. We hebben al de eerste stappen gezet door ervoor te zorgen dat de creditcardgegevens nooit de server raken, maar er is nog meer te doen. Vervolgens moeten we de gebruikersverbinding met uw server beveiligen. Met andere woorden, u hebt een SSL-certificaat nodig. Sla deze stap in geen geval over!
"SSL (Secure Sockets Layer) is de standaardbeveiligingstechnologie voor het tot stand brengen van een gecodeerde koppeling tussen een webserver en een browser. Deze koppeling zorgt ervoor dat alle gegevens die tussen de webserver en browsers worden doorgegeven, privé en integraal blijven. "- info.ssl.com
Wanneer een gebruiker zijn of haar creditcardgegevens aanbiedt aan een website, verwachten deze te zien https
in de adresbalk. Gelukkig is het kopen van een SSL-certificaat veel eenvoudiger dan het vroeger was. In feite bieden de meeste hosts een SSL-invoegtoepassing die het hele proces in één klik omzet. Hetzelfde geldt voor verschillende SaaS-opties, zoals Pagoda Box of Heroku.
Tip: Zodra u SSL inschakelt, is het mogelijk dat afbeeldingen en items breken. U kunt dit oplossen door ervoor te zorgen dat alle URL's worden gebruikt
https
, liever danhttp
. Of gebruik als een betere oplossing protocol-relatieve URL's.
Met deze techniek, gepopulariseerd door Paul Irish, als de huidige pagina HTTPS gebruikt, wordt het item ook met HTTPS aangevraagd.
Ervan uitgaande dat uw host een SSL-invoegtoepassing met één klik biedt, wijst u uw gebruiker eenvoudigweg naar de https: //
versie van de bestelpagina, en u bent klaar om te gaan!
De voorbeelden in dit artikel zijn eenvoudig en meestal procedureel. De kans is echter groot dat je zult werken met een raamwerk dat meerdere omgevingen, routerings- en testfaciliteiten ondersteunt. Gebruik de volgende tips als een voorsprong voor de integratie van Stripe met uw gekozen framework.
Het is duidelijk dat u geen echte creditcardnummers wilt gebruiken om uw betalingsformulieren te testen! Gelukkig heeft Stripe dit al bedacht; ze bevatten een aantal creditcardnummers die specifieke antwoorden simuleren, zoals een geslaagde betaling, ongeldig nummer, onjuiste CVC-code en nog veel meer.
Hier zijn een paar kaartnummers die u vaak zult raadplegen:
Wanneer u met Stripe werkt, hebt u twee unieke sleutels, die de API- en publiceerbare sleutels vertegenwoordigen. Verder zijn er test- en productievarianten voor elk van deze. De meeste frameworks bieden een manier om meerdere omgevingen te beheren. Op deze manier zal uw toepassing, voor ontwikkeling, de testsleutels correct gebruiken, terwijl, eenmaal geïmplementeerd, naar de productieversies zal worden verwezen.
Hieronder vindt u een Laravel-specifiek project. Laravel biedt een eenvoudig omgevingssysteem. Voeg een configuratiebestand toe binnen een map die overeenkomt met de omgevingsnaam en deze waarden hebben voorrang op de standaardwaarden.
Eerst stellen we de productietoetsen in:
'PRODUCTION API KEY', 'publishableKey' => 'PRODUCTION PUBLISHABLE KEY'];
En voor ontwikkeling overschrijven we de productietoetsen met hun test-tegenhangers:
'TEST API KEY', 'publishableKey' => 'TEST PUBLISHABLE KEY'];
Nu, wanneer de applicatie de API-sleutel vereist, gebruikt u Config :: te krijgen ( 'stripe.apiKey')
, de waarde die wordt geretourneerd, wordt bepaald door de omgeving. Succes!
Een veelgemaakte fout die begint bij het maken van ontwikkelaars is het koppelen van hun applicaties aan verschillende providers, zoals Stripe. Uw applicatie zou het niet moeten uitmaken welke factureringsprovider wordt gebruikt. Het gaat alleen om het feit dat er een beschikbaar is. Door het coderen van verwijzingen naar Stripe in je klassen, creëer je een directe verbinding tussen de twee - een die waarschijnlijk moeilijk te veranderen zal zijn.
Stel jezelf de vraag: "Als ik in de toekomst Stripe met een andere provider moet ruilen, hoe moeilijk zal dat dan zijn?" Tip: alles groter dan "een momentje"Is een codegeur.
In plaats daarvan code naar een interface - misschien BillingProvider
of BillingGateway
. Op deze manier kunt u verschillende implementaties van de interface maken: een voor Stripe, of een voor een andere service volledig, mocht dit nodig zijn. Deze verschillende implementaties bevatten de servicespecifieke functionaliteit. Als u op een gegeven moment een goedkopere factureringsprovider vindt dan Stripe, waarbij u de Stripe-implementatie van BillingProvider
met een ServiceX
versie neemt slechts een moment in beslag, dat wil zeggen, als je eenmaal de nieuwe implementatie hebt gemaakt die de ServiceX
facturerings-API.
Hier is een skelet voor hoe dit eruit zou kunnen zien:
// Definieer de interface-interface BillingProvider openbare functie charge ($ creditInfo); // Maak een Stripe-implementatieklasse StripeBilling openbare functiekosten ($ creditInfo) // Stripe_Charge :: charge (...); // Maak een ServiceX-implementatieklasse ServiceXBilling openbare functiekosten ($ creditInfo) // kosten gebruiker met ServiceX
Nu we twee implementaties hebben, kunnen we verwijzen naar onze huidige voorkeursafrekening, met behulp van afhankelijkheidsinjectie.
klasse PaymentController beschermde $ facturering; openbare functie __construct (BillingProvider $ facturering) $ this-> facturering = $ facturering;
Met deze stijl van ontwikkeling hoeft de controller niet te worden aangeraakt als u uiteindelijk uit de buurt van Stripe moet komen. Omdat Stripe niet hard gecodeerd is, kent het het verschil niet!
Vraag uzelf bij de verkoop van digitale goederen af: "Wat moet de koper doen als er iets misgaat met mijn doel?" Geef de koper altijd een manier om contact met u of uw bedrijf op te nemen. Wat als de bevestigingsemail die een link bevat om het digitale bestand te downloaden nooit in de inbox van de koper arriveert? Wat moeten ze doen?
Een ondersteuningssite of zelfs een eenvoudig e-mailadres op de startpagina moet helpen in deze onvermijdelijke situaties.
Als u handmatig een SSL-certificaat moet aanschaffen, zijn er een aantal services waaruit u kunt kiezen. Op basis van eerdere ervaringen kunt u verwachten dat u dertig minuten tot een uur besteedt aan het instellen van dingen. Houd er rekening mee dat de meeste certificaten niet gratis zijn en kunnen variëren van $ 10- $ 500, afhankelijk van de provider.
Het Stripe-team beveelt DigiCert en Namecheap aan, maar als u dat wilt, kunt u een gratis oplossing overwegen, zoals StartSSL.
Een veel voorkomende fout komt voort uit het gebruik van formuliergegevens om de prijs van het gekochte product te bevatten, mogelijk via een verborgen invoer. Omdat een gebruiker de waarde van deze invoer gemakkelijk kan bewerken, is het onverstandig om ervan afhankelijk te zijn. Haal altijd de prijs van het product op aan de serverzijde. Vertrouw nooit op het formulier om het u te vertellen. Een eenvoudige databasequery heeft de voorkeur.
Het object dat u verkoopt, zou nooit toegankelijk moeten zijn voor het publiek, zelfs als de URL naar uw mening lang en verwarrend genoeg is tot het punt dat de meesten het nooit zullen leren. Dit is een slechte gewoonte om een aantal redenen.
Maak in plaats daarvan een downloads
tabel met unieke aankoopcodes, samen met de bijbehorende product-ID's. Op deze manier, wanneer een URI, zoals / Downloads / 23gsfga831g
, wordt aangevraagd, zal uw aanvraag:
Om verder te gaan, kunt u ook een downloadlimiet afdwingen. Als je dit toestaat, hoef je alleen maar een DOWNLOAD_COUNT
veld worden toegevoegd aan de aankopen
tafel. Bij elk verzoek moet dat aantal met één worden verhoogd. Zodra dit aantal de door u opgegeven drempel heeft bereikt, moet de download niet langer worden verstrekt. Dit kan handig zijn in gevallen waarin u ervoor wilt zorgen dat downloadlinks niet worden gedeeld.
Het mooie van Stripe is dat het een ingewikkelde, verwarrende en gevaarlijke bewerking vertaalt naar een enkele, eenvoudige API-aanroep. Geen verkopersaccounts, geen gateways, geen verborgen kosten. Er is een reden waarom ze zeggen dat Stripe lachwekkend gemakkelijk te gebruiken is. Het is!