Förädling av kreditkort är tyvärr mycket svårare än vi hoppas, som utvecklare. Med tanke på att det är en sådan gemensam uppgift, är det verkligen nödvändigt att vi hoppar igenom otaliga hoops (omgiven av eld, förstås) för det enda syftet att behandla en betalning? Merchants? Gateways? SSL? Säkerhet? Mycket snabbt kan en till synes enkel operation bli en överväldigande förvirrande och, ännu viktigare, farlig uppgift. När du befinner dig som hanterar en användares känsliga data, bor du bättre på tårna.
Stripe översätter en komplicerad, förvirrande och farlig operation till ett enkelt API-samtal.Skulle det inte vara fantastiskt om det fanns en tjänst som gjorde denna process så lätt som möjligt? En tjänst som byggdes av utvecklare för utvecklare. Vilken tanke! Ange Stripe; inga handlare konton, inga gateways. Ett API-samtal, tillsammans med några säkerhetsriktlinjer, är allt som du behöver börja acceptera kreditkortsbetalningar idag.
Medan Stripe inte är gratis frågar de bara om 2,9% av varje avgift (plus .30 cent). Det är allt. Inga installationsavgifter, lagringsavgifter, dolda kostnader - inget av det. Bara 2,9%. Inte dåligt!
Såld? Jag var också. Låt oss bearbeta vår första testbetalning. Naturligtvis, innan du börjar, besök stripe.com
, skapa ett nytt konto (gratis) och fyll i de olika blanketterna, till exempel uttalande deskriptor och din bankinformation.
Att ladda en användare kräver två kärnsteg:
Naturligtvis är det första steget att skapa en betalningsblankett för din produkt. Du har två alternativ: använd Stripes checka ut script, som automatiskt skapar formuläret, validerar användarens inmatning och genererar den unika token för användarens kreditkortsdata. I situationer då konfiguration och styling är flexibla, är detta en utmärkt väg att ta. Sätt in en skript tagg tillsammans med en handfull anpassade HTML5 attribut, och du är klar!
Stripe erbjuder en inbäddbar form som påskyndar processen för att acceptera betalningar.
Men i de flesta situationer behöver du full kontroll. Som sådan, i den här artikeln använder vi en anpassad blankett. I det här avsnittet uppnår vi tre saker:
En grundläggande betalningsblankett kan se ut:
Lägg märke till hur vi inte behöver mycket information för att bearbeta ett kreditkort. Tekniskt är den enda information som Stripe kräver ett kreditkortsnummer och utgångsdatum. Men som en tumregel, desto bättre blir informationen som du hämtar från användaren. Skulle avgiften bestridas kommer denna extra information att vara till nytta. Eller, med andra ord, ju mer information du begär, desto mer sannolikt är det att den äkta ägaren av kreditkortet placerar transaktionen. Nyckeln är att hitta linjen mellan tillräckligt och så mycket att användaren inte stör om att fylla i formuläret. Minst, begära användarens namn, e-postadress, kreditkortsnummer, utgångsdatum och CVC-nummer.
För att fortsätta borra i huvudet, låt aldrig känslig kreditkortsdata röra din server. Att göra det har potential att skapa en värld av ont, om den utförs felaktigt. I stället ta den enkla vägen: se till att inmatning
s för användarens kreditkortsdata innehåller inte namn
attribut. Genom att utelämna detta attribut kan data inte läggas ut på din server.
Var uppmärksam på de anpassade attributen på ingångarna, till exempel data rand = "nummer"
. Stripe erbjuder ett plugin, stripe.js
, som hjälper till att sammanställa användarens angivna data och generera token. Stripe söker efter attributen och hämtar sina respektive värden.
Att använda stripe.js
, hänvisa manuset till ditt projekt och ange din publicerbara nyckel, som kommer att tillhandahållas när du registrerar dig med Stripe. Vi använder också jQuery i den här artikeln, men det är absolut inte nödvändigt.
Tänk på setPublishableKey
som ett sätt att identifiera din webbplats när du kommunicerar med Stripe. Vid anmälan kommer du att presenteras med två olika versioner av denna nyckel, för testning respektive produktion.
Därefter måste vi skapa det unika, enanvända token för användarens kreditkortsdata. Vi kan använda Rand
objekt, som tillhandahålls av det manus som vi importerade, för detta ändamål. Ännu bättre, vi behöver inte oroa oss för serialisering av betalningsformulärets data. gå enkelt igenom formen jQuery-objektet och Stripe hanterar resten.
// Händelsemedlemmar $ ('# betalningsformulär'). På ('skicka', genereraToken); var genereraToken = funktion (e) varform = $ (detta); // Inga tryck på knappen Köp nu mer än en gång form.find ('knapp'). Prop ('disabled', true); // Skapa token, baserat på formobjektet Stripe.create (form, stripeResponseHandler); // Förhindra formuläret från att skicka e.preventDefault (); ; var stripeResponseHandler = funktion (status, svar) ;
Med denna bit av JavaScript, när betalningsformuläret skickas, försöker Stripe skapa en enstaka token, med hjälp av relaterade data från de ingångar som inkluderar rand-
specifika anpassade attribut. Det andra argumentet till skapa
Metoden är en återuppringning som kommer att få token (response.id
) från Stripes server, och fortsätt därefter.
Inom denna återuppringning är det viktigt att verifiera resultatet (var all information tillhandahållen korrekt), sätt in token i en dold inmatning
, och skicka formuläret till din server. Observera igen att kreditkortsinformationen ska / kommer inte att slå din server - endast token och känsliga data. Detta är viktigt, så skriv acceptans eller funktionstest för att verifiera det.
Din återuppringning kan se ut så här:
var stripeResponseHandler = funktion (status, svar) varform = $ ('# betalningsformulär'); // Alla valideringsfel? om (response.error) // Visa användaren vad de gjorde fel form.find ('. betalningsfel'). text (response.error.message); // Gör inlägget klickbart igen form.find ('button'). Prop ('disabled', false); else // Annars är vi bra att gå! Skicka in formuläret. // Sätt in det unika token i formuläret $ ('', ' typ ':' dold ',' namn ':' stripeToken ',' value ': response.id). appendTo (form); // Ring den inhemska inlämningsmetoden på formuläret // för att hålla inlämningen avstängd form.get (0) .ubmit (); ;
Det är verkligen ganska enkelt! Skicka in en AJAX-begäran till Stripes API (med hjälp av deras hjälpsamma JavaScript-plugin), hämta den genererade tokenen, sätt in den i formuläret och skicka den till din server!
Om du följer med, har du nu lyckats generera en engångs-token och skickat in betalningsformuläret. Nu är det dags för ditt server-sida språk att välja att fysiskt skapa avgiften. Kom ihåg att i föregående avsnitt gjordes ingen avgift. Vi skapade bara en token som representerade kreditkortsdata.
Stripe erbjuder ett antal serverns biblioteken för att registrera nya avgifter, eller till och med arrangera abonnemang. Chansen är hög att ditt föredragna språk är representerat (PHP, Ruby, Python, etc.).
I likhet med föregående avsnitt kan en ny avgift genomföras i några steg:
Se Stripes bibliotek sida för installationsanvisningar. Om du använder PHP, som vi kommer att vara i den här artikeln, rekommenderas att du utnyttjar Komponisten för att ladda ner Stripe-paketet.
"kräver": "stripe / stripe-php": "dev-master"
Kompositör är framtiden för PHP dependence management, så gå ombord nu, om du inte redan har. En grundläggande Stripe-avgift kan ha formen av:
// Ange din API-nyckel Stripe :: setApiKey ("DIN API KEY"); försök Stripe_Charge :: create (['amount' => 2000, // det här är i cent: $ 20 'currency' => 'usd', 'card' => $ _POST ['stripeToken'], 'description' => 'Beskriv din produkt']); fånga (Stripe_CardError $ e) // Avvisad. Bearbeta inte deras köp. // Gå tillbaka och berätta för användaren att prova ett nytt kort
Det är allt! API-nyckeln kommer att verifiera dig som en giltig Stripe-användare. Liknande den publicerbara nyckeln kommer Stripe att ge dig två olika versioner av den här nyckeln: en för testning respektive produktion.
Observera att alla avgifter till Stripe ska deklareras i cent (naturligtvis beroende på valuta). Om priserna sparas i din databas som dollar, euro eller pund, då vill du kompensera i enlighet därmed när du tar betalt.
Om inget undantag kastas kan du vara säker på att avgiften har bearbetats. Fortsätt genom att erbjuda användaren sin digitala nedladdning, eller registrera deras köp med ditt system.
Tro det eller inte, Stripes arbete är klart. Det finns säkert fler som du kan göra, som att skapa kunder och hantera prenumerationer, men när det gäller att helt enkelt hantera en enda betalning är du klar! ... Om du inte är.
Medan, ja, Stripes arbete är klart, din, å andra sidan, är det inte. Oavsett betalningsleverantör, när som helst när du arbetar med kreditkortsinformation, bör säkerheten vara en viktig fråga. Vi har redan tagit de första stegen genom att se till att kreditkortsuppgifterna aldrig berör servern, men det finns fortfarande mer att göra. Vi måste därefter säkra användarens anslutning till din server. Med andra ord behöver du ett SSL-certifikat. Under inga omständigheter ska du hoppa över det här steget!
"SSL (Secure Sockets Layer) är standard säkerhetsteknik för att skapa en krypterad länk mellan en webbserver och en webbläsare. Denna länk säkerställer att all data som skickas mellan webbservern och webbläsarna är privata och integrerade. "- info.ssl.com
När en användare erbjuder en webbplats deras kreditkortsinformation, kommer de att förvänta sig att se https
inom adressfältet. Lyckligtvis är inköp av ett SSL-certifikat mycket lättare än det brukade vara. Faktum är att de flesta värdar erbjuder ett SSL-tillägg, vilket gör hela processen till ett enda klick. Detsamma gäller för olika SaaS-alternativ, till exempel Pagoda Box eller Heroku.
Tips: När du aktiverat SSL är det möjligt att bilder och tillgångar kommer att bryta. För att åtgärda detta, se till att alla webbadresser använder
https
, hellre änhttp
. Eller, som en bättre lösning, använd protokollrelevanta webbadresser.
Med denna techique, populär av Paul Irish, om den aktuella sidan använder HTTPS, kommer tillgången också att begäras med HTTPS.
Om du antar att din värd erbjuder ett SSL-tillägg med ett klick, pekar du bara på din användare på https: //
version av ordersidan, och du är redo att gå!
Exemplen i denna artikel är enkla och mest processuella. Chansen är dock hög, att du kommer att arbeta med ett ramverk som stöder flera miljöer, routing och testfaciliteter. Använd följande tips som en start för att integrera Stripe med dina valfria ramar.
Det är uppenbart att du inte vill använda riktiga kreditkortsnummer för att testa dina betalningsblanketter! Lyckligtvis har Stripe redan tänkt på detta; de innehåller ett antal kreditkortsnummer som simulerar specifika svar, till exempel en lyckad debitering, ogiltigt nummer, felaktig CVC-kod och många fler.
Här är några kortnummer som du ofta refererar till:
När du arbetar med Stripe har du två unika nycklar, som representerar API och publicerbara nycklar. Vidare finns det provnings- och produktionsvarianter för var och en av dessa. De flesta ramar erbjuder ett sätt att hantera flera miljöer. På så sätt, för utveckling, kommer din ansökan att använda testnycklarna korrekt, medan en gång distribueras kommer produktionsversionerna att refereras.
Nedan är ett Laravel-specifikt projekt. Laravel ger ett enkelt miljösystem. Lägg till en konfigurationsfil i en mapp som motsvarar miljönamnet, och de här värdena kommer att ta precenence över standardinställningarna.
Först ställer vi ner produktionsnycklarna:
"PRODUKTIONS API KEY", "publishableKey '=>" PRODUKTIONSPUBLICERINGS NYCKEL "];
Och för utveckling åsidosätter vi produktionsnycklarna med sina test motsvarigheter:
'TEST API KEY', 'publishableKey' => 'TEST PUBLISHABLE KEY'];
Nu, när programmet kräver API-nyckeln, använder du Config :: få (stripe.apiKey)
, Värdet som returneras bestäms av miljön. Framgång!
Ett vanligt misstag som börjar utvecklare ger upphov till att länka sina applikationer till olika leverantörer, som Stripe. Din ansökan bör inte ta hand om vilken fakturering leverantör används. Det handlar bara om att man är tillgänglig. Genom hårdkodande referenser till Stripe i dina klasser skapar du en direkt koppling mellan de två - en som sannolikt kommer att bli svår att förändra.
Fråga dig själv, "Om jag i framtiden måste byta ut Stripe med en annan leverantör, hur svårt blir det?" Hint: allt större än "ett ögonblick"Är en kodlukt.
I stället kodar du till ett gränssnitt - kanske BillingProvider
eller BillingGateway
. På så sätt kan du skapa olika implementeringar av gränssnittet: en för Stripe, eller en för en annan tjänst helt, om behovet skulle uppstå. Dessa olika implementeringar kommer att rymma den tjänstspecifika funktionaliteten. Om du någon gång hittar en billigare faktureringsleverantör än Stripe, byter du ut Stripe-implementeringen av BillingProvider
med en ServiceX
versionen tar bara en stund - det vill säga när du har skapat den nya implementeringen som frågar efter ServiceX
fakturerings API.
Här är ett skelett för hur det här kan se ut:
// Definiera gränssnittsgränssnittet BillingProvider public function charge ($ creditInfo); // Skapa en Stripe implementation class StripeBilling public function charge ($ creditInfo) // Stripe_Charge :: charge (...); // Skapa en ServiceX-implementeringsklass ServiceXBilling public function charge ($ creditInfo) // ladda användaren med ServiceX
Nu när vi har två implementeringar, kan vi referera till vår nuvarande föredragna faktureringstjänst, med hjälp av beroendeinsprutning.
klass PaymentController protected $ billing; offentlig funktion __construct (BillingProvider $ fakturering) $ this-> billing = $ fakturering;
Med den här utvecklingsstilen behöver du inte röra kontrollen om du slutar behöva flytta från Stripe. Eftersom Stripe inte är hårdkodad vet den inte skillnaden!
När du säljer digitala varor, fråga dig själv: "Vad ska köparen göra om något går fel i mitt ända?" Alltid ge något sätt för köparen att kontakta dig eller ditt företag. Vad händer om bekräftelsemailen som innehåller en länk för att ladda ner den digitala filen kommer aldrig i inköparens inkorg? Vad ska de göra?
En supportplats, eller till och med en enkel e-postadress på hemsidan, skulle hjälpa till i dessa oundvikliga situationer.
Om du manuellt måste köpa ett SSL-certifikat finns det ett antal tjänster att välja mellan. Baserat på tidigare erfarenhet kan du förvänta dig att spendera trettio minuter till en timme som ställer upp saker. Tänk på att de flesta certifikat inte är gratis och kan variera från $ 10 till $ 500, beroende på leverantören.
The Stripe-teamet rekommenderar DigiCert och Namecheap, men om du föredrar kan du överväga en fri lösning, som StartSSL.
Ett vanligt misstag beror på att du använder formulärdata för att innehålla priset för den produkt som köps, eventuellt via en dold ingång. Eftersom en användare enkelt kan redigera detta ingångs värde är det oklokt att det beror på det. Hämta alltid priset på produkten från serverns sida. Lita aldrig på formuläret för att berätta. En enkel databasfråga är det föredragna alternativet.
Den tillgång du säljer borde aldrig vara tillgänglig för allmänheten, även om webbadressen enligt din mening är lång och förvirrande så att de flesta aldrig skulle lära sig det. Detta är en dålig övning av ett antal skäl.
Skapa istället en Nedladdningar
bord som innehåller unika inköpskoder, tillsammans med deras associerade produktsidor. På så sätt, när en URI, t.ex. / Nedladdningar / 23gsfga831g
, begärs kommer din ansökan att
För att ta saker vidare kan du också tillämpa en hämtningsgräns. Att tillåta detta skulle helt enkelt kräva att a DOWNLOAD_COUNT
fält läggs till i inköp
tabell. Med varje förfrågan borde detta antal ökas med en. När det här numret når ditt angivna tröskelvärde, bör inte nedladdningen tillhandahållas. Detta kan vara till hjälp i fall då du vill se till att nedladdningslänkar inte delas.
Det underbara med Stripe är att det översätter en komplicerad, förvirrande och farlig operation till ett enkelt, enkelt API-samtal. Inga försäljarkonton, inga gateways, inga dolda avgifter. Det finns en anledning till varför de säger att Stripe är skrattsam lätt att använda. Det är!