Uvod u Stripe API za Javu

1. Pregled

Stripe je usluga zasnovana na oblaku koja omogućuje tvrtkama i pojedincima primanje plaćanja putem Interneta i nudi knjižnice na strani klijenta (JavaScript i izvorni mobitel) i knjižnice na strani poslužitelja (Java, Ruby, Node.js itd.).

Stripe pruža sloj apstrakcije koji smanjuje složenost primanja plaćanja. Kao rezultat, ne moramo se izravno baviti podacima o kreditnoj kartici - umjesto toga imamo posla s tokenom koji simbolizira autorizaciju za naplatu.

U ovom uputstvu stvorit ćemo uzorak projekta Spring Boot koji korisnicima omogućuje unos kreditne kartice, a kasnije će karticu naplatiti za određeni iznos pomoću Stripe API-ja za Javu.

2. Ovisnosti

Da bismo u projektu koristili Stripe API za Javu, dodajemo odgovarajuću ovisnost u naš pom.xml:

 com.stripe pruga-java 4.2.0 

Njegovu najnoviju verziju možemo pronaći u spremištu Maven Central.

Za naš ogledni projekt koristit ćemo proljeće-čizma-starter-roditelj:

 org.springframework.boot spring-boot-starter-parent 2.2.6.OSLOBODI 

Također ćemo upotrijebiti Lombok za smanjenje šifre uzorka, a Thymeleaf će biti predložak za isporuku dinamičkih web stranica.

Budući da koristimo proljeće-čizma-starter-roditelj da bismo upravljali inačicama ovih knjižnica, ne moramo uključivati ​​njihove verzije u pom.xml:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf org.projectlombok lombok 

Imajte na umu da ako koristite NetBeans, možda ćete htjeti eksplicitno koristiti Lombok s verzijom 1.16.16, budući da greška u verziji Lomboka koja se pruža s Spring Boot 1.5.2 uzrokuje da NetBeans generira puno pogrešaka.

3. API ključevi

Prije nego što možemo komunicirati sa Stripeom i izvršiti terećenje kreditne kartice, moramo registrirajte Stripe račun i nabavite tajne / javne Stripe API ključeve.

Nakon potvrde računa, prijavit ćemo se kako bismo pristupili nadzornoj ploči Stripe. Zatim odabiremo "API ključeve" na lijevom bočnom izborniku:

Bit će dva para tajnih / javnih ključeva - jedan za test i jedan za uživo. Ostavimo ovu karticu otvorenom da bismo kasnije mogli koristiti ove tipke.

4. Opći tok

Naplata kreditne kartice izvršit će se u pet jednostavnih koraka koji uključuju prednji kraj (pokrenut u pregledniku), pozadinski (naša aplikacija Spring Boot) i Stripe:

  1. Korisnik odlazi na stranicu za naplatu i klikće "Plati karticom".
  2. Korisniku se prikazuje dijalog za preklapanje Stripe Checkout, u kojem se popunjavaju podaci o kreditnoj kartici.
  3. Korisnik potvrđuje s "Plati" što će:
    • Pošaljite kreditnu karticu Stripeu
    • Uzmite žeton u odgovoru koji će biti dodan postojećem obrascu
    • Pošaljite obrazac s iznosom, javnim API ključem, e-poštom i tokenom na naš back-end
  4. Naši pozadinski kontakti obrubljuju token, iznos i tajni API ključ.
  5. Pozadinske provjere Stripe odgovora i pružaju korisniku povratne informacije o operaciji.

Svaki ćemo korak detaljnije pokriti u sljedećim odjeljcima.

5. Obrazac za naplatu

Stripe Checkout prilagodljiv je widget za mobilne uređaje koji se može lokalizirati i koji pruža obrazac za uvođenje podataka o kreditnoj kartici. Kroz uključivanje i konfiguraciju „checkout.js“, Odgovorna je za:

  • Prikaz gumba "Plati karticom"

  • Dijaloško prikazivanje sloja za plaćanje (pokreće se nakon klika na „Plati karticom“)

  • Provjera kreditne kartice
  • Značajka "Zapamti me" (povezuje karticu s brojem mobitela)
  • Slanje kreditne kartice Stripeu i zamjena sa žetonom u priloženom obrascu (aktivira se nakon klika na „Plati“)

Ako trebamo izvršiti veću kontrolu nad obrascem za naplatu nego što pruža Stripe Checkout, tada možemo koristiti Stripe Elements.

Zatim ćemo analizirati kontroler koji priprema obrazac, a zatim i sam obrazac.

5.1. Kontroler

Počnimo sa stvaranjem kontrolera za pripremite model s potrebnim informacijama koje trebaju obrazac za naplatu.

Prvo, trebat ćemo kopirajte testnu verziju našeg javnog ključa s nadzorne ploče Stripe i upotrijebite ga za definiranje STRIPE_PUBLIC_KEY kao varijable okruženja. Zatim koristimo ovu vrijednost u prugaPublicKey polje.

Također postavljamo valuta i iznos (izraženo u centima) ovdje ručno samo u svrhu demonstracije, ali u stvarnoj aplikaciji mogli bismo postaviti ID proizvoda / prodaje koji bi se mogao koristiti za dohvaćanje stvarnih vrijednosti.

Zatim ćemo poslati u prikaz na blagajni koji sadrži obrazac za naplatu:

@Controller javna klasa CheckoutController {@Value ("$ {STRIPE_PUBLIC_KEY}") private String stripePublicKey; @RequestMapping ("/ checkout") javna provjera niza (model modela) {model.addAttribute ("iznos", 50 * 100); // u centima model.addAttribute ("stripePublicKey", stripePublicKey); model.addAttribute ("valuta", ChargeRequest.Currency.EUR); povratak "naplata"; }}

Što se tiče Stripe API ključeva, možete ih definirati kao varijable okruženja po aplikaciji (test u odnosu na live).

Kao što je slučaj s bilo kojom lozinkom ili osjetljivim informacijama, najbolje je tajni ključ čuvati izvan svog sustava kontrole verzija.

5.2. Oblik

Gumb "Plati karticom" i dijalog za naplatu uključeni su dodavanjem obrasca sa skriptom unutar, ispravno konfiguriranom s atributima podataka:

  Cijena: 

"checkout.js"Skripta automatski pokreće zahtjev za Stripe neposredno prije slanja, koji zatim dodaje token Stripe i e-poštu korisnika Stripe kao skrivena polja"prugaToken"I"prugaEmail“.

Oni će biti poslani na naš back-end zajedno s ostalim poljima obrasca. Atributi podataka skripte nisu poslani.

Thymeleaf koristimo za generiranje atributa "podatkovni ključ“, “količina podataka“, I“data-valuta“.

Količina ("količina podataka") Koristi se samo za prikaz (zajedno s"data-valuta“). Njegova je jedinica centi korištene valute, pa je dijelimo sa 100 da bismo je prikazali.

Javni ključ Stripe prosljeđuje se Stripeu nakon što korisnik zatraži plaćanje. Ovdje nemojte koristiti tajni ključ jer se on šalje pregledniku.

6. Operacija punjenja

Za obradu na strani poslužitelja moramo definirati obrađivač zahtjeva POST koji koristi obrazac za naplatu. Pogledajmo razrede koji će nam trebati za postupak punjenja.

6.1. Subjekt ChargeRequest

Definirajmo Zahtjev za naplatu POJO koji ćemo koristiti kao poslovni subjekt tijekom postupka naplate:

@Data javna klasa ChargeRequest {public enum Valuta {EUR, USD; } opis privatnog niza; privatni int iznos; privatna valuta valute; private String stripeEmail; private String stripeToken; }

6.2. Servis

Napišimo a StripeService razred do priopći Stripeu stvarni postupak punjenja:

@Service javna klasa StripeService {@Value ("$ {STRIPE_SECRET_KEY}") private String secretKey; @PostConstruct public void init () {Stripe.apiKey = secretKey; } javni trošak naplate (ChargeRequest chargeRequest) baca AuthenticationException, InvalidRequestException, APIConnectionException, CardException, APIException {Map chargeParams = new HashMap (); chargeParams.put ("iznos", chargeRequest.getAmount ()); chargeParams.put ("valuta", chargeRequest.getCurrency ()); chargeParams.put ("opis", chargeRequest.getDescription ()); chargeParams.put ("izvor", chargeRequest.getStripeToken ()); vratiti Charge.create (chargeParams); }}

Kao što je prikazano u CheckoutController, the tajniKljuč polje popunjava se iz varijable okoline STRIPE_SECRET_KEY koju smo kopirali s nadzorne ploče Stripe.

Jednom kad je usluga inicijalizirana, ovaj se ključ koristi u svim sljedećim Stripe operacijama.

Objekt koji je vratila knjižnica Stripe predstavlja operaciju punjenja i sadrži korisne podatke poput ID-a operacije.

6.3. Kontroler

Napokon, napišimo kontrolor koji će primiti POST zahtjev izrađen putem obrasca za naplatu i predati naplatu Stripeu putem našeg StripeService.

Imajte na umu da „Zahtjev za naplatu"Parametar se automatski inicijalizira s parametrima zahtjeva"iznos“, “prugaEmail“, I“prugaToken”Uključeno u obrazac:

@Controller javna klasa ChargeController {@Autowired private StripeService paymentsService; @PostMapping ("/ charge") naplata javnog niza (ChargeRequest chargeRequest, model modela) baca StripeException {chargeRequest.setDescription ("Primjer naplate"); chargeRequest.setCurrency (Currency.EUR); Naplatiti naknadu = paymentsService.charge (chargeRequest); model.addAttribute ("id", charge.getId ()); model.addAttribute ("status", charge.getStatus ()); model.addAttribute ("chargeId", charge.getId ()); model.addAttribute ("saldo_transaction", charge.getBalanceTransaction ()); povratak "rezultat"; } @ExceptionHandler (StripeException.class) javni niz HandError (Model modela, StripeException ex) {model.addAttribute ("pogreška", ex.getMessage ()); povratak "rezultat"; }}

U uspjehu u model dodajemo status, ID operacije, ID naplate i ID transakcije salda kako bismo ih kasnije mogli prikazati korisniku (odjeljak 7). To je učinjeno radi ilustracije nekih sadržaja predmeta naboja.

Naše ExceptionHandler bavit će se iznimkama tipa StripeException koji se bace tijekom postupka punjenja.

Ako trebamo više fino zrnastih postupaka s pogreškama, možemo dodati zasebne rukovatelje za podrazrede StripeException, kao što su CardException, RateLimitException, ili AuthenticationException.

"proizlazitiPrikaz prikazuje rezultat postupka punjenja.

7. Prikazivanje rezultata

HTML koji se koristi za prikaz rezultata osnovni je predložak Thymeleaf koji prikazuje rezultat operacije punjenja. Korisnika ovdje šalje ChargeController je li operacija punjenja bila uspješna ili ne:

   Proizlaziti 

Uspjeh!

Id .: Status: ID naplate: ID stanja transakcije: Ponovno plaćanje

Nakon uspjeha korisnik će vidjeti neke pojedinosti postupka punjenja:

U slučaju pogreške, korisniku će se prikazati poruka o pogrešci koju je vratio Stripe:

8. Zaključak

U ovom uputstvu pokazali smo kako se koristi Stripe Java API za punjenje kreditne kartice. U budućnosti bismo mogli ponovno koristiti kôd na strani poslužitelja za posluživanje izvorne mobilne aplikacije.

Da bismo testirali čitav tijek naplate, ne trebamo koristiti pravu kreditnu karticu (čak ni u testnom načinu). Umjesto toga možemo se osloniti na kartice za testiranje Stripe.

Punjenje je jedna od mnogih mogućnosti koje nudi Stripe Java API. Službena referenca za API vodit će nas kroz čitav niz operacija.

Uzorak koda korištenog u ovom vodiču nalazi se u projektu GitHub.