Inleiding tot de Stripe API voor Java

1. Overzicht

Stripe is een cloudgebaseerde service die stelt bedrijven en particulieren in staat om betalingen via internet te ontvangen en biedt zowel bibliotheken aan de clientzijde (JavaScript en native mobiel) als bibliotheken aan de serverzijde (Java, Ruby, Node.js, enz.).

Stripe biedt een abstractielaag die de complexiteit van het ontvangen van betalingen vermindert. Als resultaat, we hoeven niet rechtstreeks met creditcardgegevens om te gaan - in plaats daarvan hebben we te maken met een token dat een machtiging tot afschrijving symboliseert.

In deze zelfstudie maken we een voorbeeld van een Spring Boot-project waarmee gebruikers een creditcard kunnen invoeren en later een bepaald bedrag op de kaart kunnen belasten met behulp van de Stripe API voor Java.

2. Afhankelijkheden

Om in het project gebruik te maken van de Stripe API voor Java, voegen we de bijbehorende afhankelijkheid toe aan onze pom.xml:

 com.stripe stripe-java 4.2.0 

We kunnen de nieuwste versie vinden in de Maven Central-repository.

Voor ons voorbeeldproject zullen we gebruikmaken van de spring-boot-starter-parent:

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

We zullen ook Lombok gebruiken om de standaardcode te verminderen, en Thymeleaf zal de sjabloonengine zijn voor het leveren van dynamische webpagina's.

Omdat we de spring-boot-starter-parent om de versies van deze bibliotheken te beheren, hoeven we hun versies niet op te nemen in pom.xml:

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

Let daar op als je NetBeans gebruikt, wil je Lombok misschien expliciet gebruiken met versie 1.16.16, aangezien een bug in de versie van Lombok voorzien van Spring Boot 1.5.2 ervoor zorgt dat NetBeans veel fouten genereert.

3. API-sleutels

Voordat we met Stripe kunnen communiceren en creditcardafschrijvingen kunnen uitvoeren, moeten we dat doen registreer een Stripe-account en verkrijg geheime / openbare Stripe API-sleutels.

Nadat we het account hebben bevestigd, loggen we in om toegang te krijgen tot het Stripe-dashboard. We kiezen vervolgens "API-sleutels" in het menu aan de linkerkant:

Er zullen twee paar geheime / openbare sleutels zijn: een voor test en een voor live. Laten we dit tabblad open laten zodat we deze toetsen later kunnen gebruiken.

4. Algemene stroom

Het in rekening brengen van de creditcard wordt gedaan in vijf eenvoudige stappen, waarbij de front-end (uitgevoerd in een browser), back-end (onze Spring Boot-applicatie) en Stripe betrokken zijn:

  1. Een gebruiker gaat naar de afrekenpagina en klikt op "Betalen met kaart".
  2. Een gebruiker krijgt een overlaydialoogvenster van Stripe Checkout te zien, waarin de creditcardgegevens worden ingevuld.
  3. Een gebruiker bevestigt met "Betalen", wat het volgende zal doen:
    • Stuur de creditcard naar Stripe
    • Ontvang een token in het antwoord dat aan het bestaande formulier wordt toegevoegd
    • Verzend dat formulier met het bedrag, de openbare API-sleutel, e-mail en het token naar onze back-end
  4. Onze back-end neemt contact op met Stripe met het token, het bedrag en de geheime API-sleutel.
  5. Back-end controleert Stripe-respons en geeft de gebruiker feedback over de bewerking.

In de volgende secties zullen we elke stap gedetailleerder behandelen.

5. Afrekenformulier

Stripe Checkout is een aanpasbare, mobiele en lokaliseerbare widget die een formulier weergeeft om creditcardgegevens in te voeren. Door de opname en configuratie van “checkout.js“, Het is verantwoordelijk voor:

  • Weergave van de knop "Betaal met kaart"

  • Weergave van dialoogvensters voor betalingsoverlay (geactiveerd nadat u op 'Betalen met kaart' hebt geklikt)

  • Creditcard validatie
  • "Onthoud mij" -functie (koppelt de kaart aan een mobiel nummer)
  • De creditcard naar Stripe sturen en deze vervangen door een token in het bijgevoegde formulier (geactiveerd na klikken op 'Betalen')

Als we meer controle over het afrekenformulier moeten uitoefenen dan wordt aangeboden door Stripe Checkout, dan kunnen we Stripe Elements gebruiken.

Vervolgens analyseren we de controller die het formulier opstelt en vervolgens het formulier zelf.

5.1. Controller

Laten we beginnen met het maken van een controller voor bereid het model voor met de nodige informatie die het afrekenformulier nodig heeft.

Ten eerste moeten we kopieer de testversie van onze openbare sleutel van het Stripe-dashboard en gebruik het om STRIPE_PUBLIC_KEY als omgevingsvariabele te definiëren. We gebruiken deze waarde vervolgens in de stripePublicKey veld.

We zijn ook aan het zitten valuta en bedrag (uitgedrukt in cent) hier handmatig alleen voor demonstratiedoeleinden, maar in een echte toepassing kunnen we een product- / verkoop-id instellen die kan worden gebruikt om de werkelijke waarden op te halen.

Vervolgens gaan we naar de afrekenweergave met het afrekenformulier:

@Controller openbare klasse CheckoutController {@Value ("$ {STRIPE_PUBLIC_KEY}") private String stripePublicKey; @RequestMapping ("/ checkout") openbare String checkout (modelmodel) {model.addAttribute ("amount", 50 * 100); // in cent model.addAttribute ("stripePublicKey", stripePublicKey); model.addAttribute ("valuta", ChargeRequest.Currency.EUR); terug "afrekenen"; }}

Wat betreft de Stripe API-sleutels, u kunt ze definiëren als omgevingsvariabelen per applicatie (test vs. live).

Zoals het geval is met elk wachtwoord of gevoelige informatie, is het het beste om de geheime sleutel uit uw versiebeheersysteem te houden.

5.2. Het formulier

De knop "Betalen met kaart" en het afrekenvenster worden toegevoegd door een formulier toe te voegen met een script erin, correct geconfigureerd met gegevensattributen:

  Prijs: 

De "checkout.js"-Script activeert automatisch een verzoek aan Stripe vlak voor het indienen, die vervolgens het Stripe-token en het Stripe-gebruikers-e-mailadres als de verborgen velden toevoegt"stripeToken"En"stripeE-mail“.

Deze worden samen met de andere formuliervelden naar onze back-end gestuurd. De scriptgegevensattributen zijn niet verzonden.

We gebruiken Thymeleaf om de attributen "data-key“, “data-hoeveelheid", En"data-valuta“.

De hoeveelheid ("data-hoeveelheid") Wordt alleen gebruikt voor weergavedoeleinden (samen met"data-valuta“). De eenheid is cent van de gebruikte valuta, dus we delen deze door 100 om deze weer te geven.

De openbare sleutel van Stripe wordt aan Stripe doorgegeven nadat de gebruiker om betaling heeft gevraagd. Gebruik hier niet de geheime sleutel, deze wordt naar de browser gestuurd.

6. Oplaadbediening

Voor verwerking op de server moeten we de POST-aanvraaghandler definiëren die wordt gebruikt door het afrekenformulier. Laten we eens kijken naar de klassen die we nodig hebben voor het opladen.

6.1. ChargeRequest-entiteit

Laten we de ChargeRequest POJO die we als zakelijke entiteit zullen gebruiken tijdens de kostenverrichting:

@Data openbare klasse ChargeRequest {openbare opsomming Valuta {EUR, USD; } private String beschrijving; privé int bedrag; particuliere valuta; private String stripeEmail; privé String stripeToken; }

6.2. Onderhoud

Laten we een StripeService klas naar communiceer de daadwerkelijke lading aan Stripe:

@Service openbare klasse StripeService {@Value ("$ {STRIPE_SECRET_KEY}") private String secretKey; @PostConstruct public void init () {Stripe.apiKey = secretKey; } openbare Charge charge (ChargeRequest chargeRequest) gooit AuthenticationException, InvalidRequestException, APIConnectionException, CardException, APIException {Map chargeParams = new HashMap (); chargeParams.put ("amount", chargeRequest.getAmount ()); chargeParams.put ("valuta", chargeRequest.getCurrency ()); chargeParams.put ("beschrijving", chargeRequest.getDescription ()); chargeParams.put ("source", chargeRequest.getStripeToken ()); Return Charge.create (chargeParams); }}

Zoals werd aangetoond in de CheckoutController, de geheime sleutel veld wordt ingevuld vanuit de STRIPE_SECRET_KEY omgevingsvariabele die we hebben gekopieerd van het Stripe-dashboard.

Nadat de service is geïnitialiseerd, wordt deze sleutel gebruikt in alle volgende Stripe-bewerkingen.

Het object dat door de Stripe-bibliotheek wordt geretourneerd, vertegenwoordigt de charge-bewerking en bevat nuttige gegevens zoals de bewerkings-ID.

6.3. Controller

Laten we tot slot het controller die het POST-verzoek van het afrekenformulier ontvangt en de afschrijving bij Stripe indient via onze StripeService.

Merk op dat de "ChargeRequest"Parameter wordt automatisch geïnitialiseerd met de verzoekparameters"bedrag“, “stripeE-mail", En"stripeToken”Opgenomen in het formulier:

@Controller openbare klasse ChargeController {@Autowired privé StripeService paymentService; @PostMapping ("/ charge") public String charge (ChargeRequest chargeRequest, Model model) gooit StripeException {chargeRequest.setDescription ("Voorbeeld charge"); chargeRequest.setCurrency (Currency.EUR); Charge charge = paymentsService.charge (chargeRequest); model.addAttribute ("id", charge.getId ()); model.addAttribute ("status", charge.getStatus ()); model.addAttribute ("chargeId", charge.getId ()); model.addAttribute ("balance_transaction", charge.getBalanceTransaction ()); retourneer "resultaat"; } @ExceptionHandler (StripeException.class) openbare String handleError (Modelmodel, StripeException ex) {model.addAttribute ("error", ex.getMessage ()); retourneer "resultaat"; }}

Bij succes voegen we de status, de operatie-id, de kosten-id en de saldotransactie-id toe aan het model, zodat we ze later aan de gebruiker kunnen tonen (sectie 7). Dit wordt gedaan om een ​​deel van de inhoud van het ladingsobject te illustreren.

Onze ExceptionHandler zal omgaan met uitzonderingen van het type StripeException die tijdens het opladen worden geworpen.

Als we meer fijnmazige foutafhandeling nodig hebben, kunnen we afzonderlijke handlers toevoegen voor de subklassen van StripeException, zoals CardException, RateLimitException, of AuthenticationException.

De "resultaat”-Weergave geeft het resultaat van de oplaadoperatie weer.

7. Resultaat weergeven

De HTML die wordt gebruikt om het resultaat weer te geven, is een basissjabloon van Thymeleaf die het resultaat van een oplaadbewerking weergeeft. De gebruiker wordt hierheen gestuurd door de ChargeController of het opladen is gelukt of niet:

   Resultaat 

Succes!

Id .: Status: Kosten-id .: Saldotransactie-id .: Opnieuw afrekenen

Bij succes ziet de gebruiker enkele details van het opladen:

Bij een fout krijgt de gebruiker het foutbericht te zien zoals geretourneerd door Stripe:

8. Conclusie

In deze zelfstudie hebben we laten zien hoe u gebruik kunt maken van de Stripe Java API om een ​​creditcard te belasten. In de toekomst zouden we onze server-side code kunnen hergebruiken om een ​​native mobiele app te bedienen.

Om de volledige laadstroom te testen, hebben we geen echte creditcard nodig (zelfs niet in testmodus). We kunnen in plaats daarvan vertrouwen op Stripe-testkaarten.

Het opladen is een van de vele mogelijkheden die de Stripe Java API biedt. De officiële API-referentie leidt ons door de hele reeks bewerkingen.

De voorbeeldcode die in deze zelfstudie wordt gebruikt, is te vinden in het GitHub-project.


$config[zx-auto] not found$config[zx-overlay] not found