Einführung in die Stripe-API für Java

Einführung in die Stripe-API für Java

1. Überblick

Stripe ist ein Cloud-basierter Dienst, derenables businesses and individuals to receive payments over the internet sowohl clientseitige Bibliotheken (JavaScript und native mobile) als auch serverseitige Bibliotheken (Java, Ruby, Node.js usw.) bietet.

Stripe bietet eine Abstraktionsebene, die die Komplexität des Zahlungseingangs verringert. Infolgedessen istwe don’t need to deal with credit card details directly – instead, we deal with a token symbolizing an authorization to charge.

In diesem Tutorial erstellen wir ein Beispiel für ein Spring Boot-Projekt, mit dem Benutzer eine Kreditkarte eingeben und später die Karte mitStripe API for Java für einen bestimmten Betrag belasten können.

2. Abhängigkeiten

Um dieStripe API for Java im Projekt zu nutzen, fügen wir unserenpom.xml die entsprechende Abhängigkeit hinzu:


    com.stripe
    stripe-java
    4.2.0

Für unser Beispielprojekt werden wir diespring-boot-starter-parent nutzen:


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

Wir werden auchLombok verwenden, um den Boilerplate-Code zu reduzieren, undThymeleaf wird die Vorlagen-Engine für die Bereitstellung dynamischer Webseiten sein.

Da wir diespring-boot-starter-parent verwenden, um die Versionen dieser Bibliotheken zu verwalten, müssen wir ihre Versionen nicht inpom.xml aufnehmen:


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-thymeleaf


    org.projectlombok
    lombok

Beachten Sie, dassif you’re using NetBeans, you may want to use Lombok explicitly with version 1.16.16, da ein Fehler in der mit Spring Boot 1.5.2 bereitgestellten Version von Lombok dazu führt, dass NetBeans viele Fehler generiert.

3. API-Schlüssel

Bevor wir mit Stripe kommunizieren und Kreditkartengebühren ausführen können, müssen wirregister a Stripe account and obtain secret/public Stripe API keys.

Nach Bestätigung des Kontos melden wir uns an, um aufStripe dashboard zuzugreifen. Wir wählen dann "API-Schlüssel" im Menü auf der linken Seite:

Stripe Dashboard API Keys

Es gibt zwei Paare geheimer / öffentlicher Schlüssel -one for test and one for live. Lassen Sie diese Registerkarte geöffnet, damit wir diese Schlüssel später verwenden können.

4. Allgemeiner Ablauf

Die Aufladung der Kreditkarte erfolgt in fünf einfachen Schritten: Front-End (in einem Browser ausgeführt), Back-End (unsere Spring Boot-Anwendung) und Stripe:

  1. Ein Benutzer wechselt zur Checkout-Seite und klickt auf "Pay with Card".

  2. Einem Benutzer wird das Überlagerungsdialogfeld "Stripe Checkout" angezeigt, in dem die Kreditkartendetails eingegeben werden.

  3. Ein Benutzer bestätigt mit "Pay ", was:

    • Senden Sie die Kreditkarte an Stripe

    • Erhalten Sie in der Antwort ein Token, das an das vorhandene Formular angehängt wird

    • Senden Sie dieses Formular mit dem Betrag, dem öffentlichen API-Schlüssel, der E-Mail-Adresse und dem Token an unser Back-End

  4. Unsere Back-End-Kontakte Stripe mit dem Token, dem Betrag und dem geheimen API-Schlüssel.

  5. Back-End-Überprüfungen Streifenantwort und Rückmeldung des Benutzers über den Vorgang.

Stripe payment flow

Wir werden jeden Schritt in den folgenden Abschnitten detaillierter behandeln.

5. Kassenformular

Stripe Checkout ist eincustomizable, mobile ready, and localizable widget, das ein Formular zum Eingeben von Kreditkartendaten rendert. Durch die Aufnahme und Konfiguration von „checkout.js“ ist es verantwortlich für:

  • Die Schaltfläche „Mit Karte bezahlen“ rendertPay with Card button

  • Rendern des Zahlungsüberlagerungsdialogs (ausgelöst nach Klicken auf "Mit Karte bezahlen")Stripe checkout form overlay

  • Kreditkartenvalidierung

  • "Remember me" -Funktion (ordnet die Karte einer Handynummer zu)

  • Senden Sie die Kreditkarte an Stripe und ersetzen Sie sie durch einen Token im beiliegenden Formular (ausgelöst durch Klicken auf „Pay “).

Wenn wir mehr Kontrolle über das Checkout-Formular ausüben müssen als von Stripe Checkout bereitgestellt, können wirStripe Elements verwenden.

Als Nächstes analysieren wir den Controller, der das Formular erstellt, und dann das Formular selbst.

5.1. Regler

Beginnen wir mit der Erstellung eines Controllers fürprepare the model with the necessary information that the checkout form needs.

Zuerst müssen wircopy the test version of our public key from the Stripe dashboard eingeben und damit STRIPE_PUBLIC_KEY als Umgebungsvariable definieren. Wir verwenden diesen Wert dann im FeldstripePublicKey.

Wir setzen hier auchcurrency undamount (ausgedrückt in Cent) manuell nur zu Demonstrationszwecken, aber in einer realen Anwendung können wir eine Produkt- / Verkaufs-ID festlegen, die zum Abrufen der tatsächlichen ID verwendet werden kann Werte.

Anschließend senden wir an die Checkout-Ansicht, in der sich das Checkout-Formular befindet:

@Controller
public class CheckoutController {

    @Value("${STRIPE_PUBLIC_KEY}")
    private String stripePublicKey;

    @RequestMapping("/checkout")
    public String checkout(Model model) {
        model.addAttribute("amount", 50 * 100); // in cents
        model.addAttribute("stripePublicKey", stripePublicKey);
        model.addAttribute("currency", ChargeRequest.Currency.EUR);
        return "checkout";
    }
}

In Bezug auf die Stripe-API-Schlüssel können Sie diese als Umgebungsvariablen pro Anwendung definieren (Test vs. Leben).

Wie bei jedem Passwort oder vertraulichen Informationen ist es am besten, den geheimen Schlüssel von Ihrem Versionskontrollsystem fernzuhalten.

5.2. Form

Die Schaltfläche "Bezahlen mit Karte" und das Dialogfeld "Auschecken" werden eingebunden, indem ein Formular mit einem Skript hinzugefügt wird, das korrekt mit Datenattributen konfiguriert ist:

Das Skript "checkout.js" löst direkt vor dem Senden automatisch eine Anforderung an Stripe aus, die dann das Stripe-Token und die Stripe-Benutzer-E-Mail als ausgeblendete Felder "stripeToken" und "stripeEmail" anfügt. .

Diese werden zusammen mit den anderen Formularfeldern an unser Backend gesendet. Die Skriptdatenattribute werden nicht übermittelt.

Wir verwenden Thymeleaf, um die Attribute „data-key“, „data-amount“ und „data-currency“ zu rendern.

Der Betrag („data-amount“) wird nur zu Anzeigezwecken verwendet (zusammen mit „data-currency“). Die Einheit ist Cent der verwendeten Währung, daher teilen wir sie durch 100, um sie anzuzeigen.

Der öffentliche Stripe-Schlüssel wird an Stripe übergeben, nachdem der Benutzer zur Zahlung aufgefordert hat. Do not use the secret key here, as this is sent to the browser.

6. Ladevorgang

Für die serverseitige Verarbeitung müssen wir den POST-Request-Handler definieren, der vom Checkout-Formular verwendet wird. Werfen wir einen Blick auf die Klassen, die wir für den Ladevorgang benötigen.

6.1. ChargeRequest-Entität

Definieren wir dasChargeRequest POJO, das wir während des Ladevorgangs als Geschäftseinheit verwenden werden:

@Data
public class ChargeRequest {

    public enum Currency {
        EUR, USD;
    }
    private String description;
    private int amount;
    private Currency currency;
    private String stripeEmail;
    private String stripeToken;
}

6.2. Bedienung

Schreiben wir eineStripeService-Klasse incommunicate the actual charge operation to Stripe:

@Service
public class StripeService {

    @Value("${STRIPE_SECRET_KEY}")
    private String secretKey;

    @PostConstruct
    public void init() {
        Stripe.apiKey = secretKey;
    }
    public Charge charge(ChargeRequest chargeRequest)
      throws AuthenticationException, InvalidRequestException,
        APIConnectionException, CardException, APIException {
        Map chargeParams = new HashMap<>();
        chargeParams.put("amount", chargeRequest.getAmount());
        chargeParams.put("currency", chargeRequest.getCurrency());
        chargeParams.put("description", chargeRequest.getDescription());
        chargeParams.put("source", chargeRequest.getStripeToken());
        return Charge.create(chargeParams);
    }
}

Wie inCheckoutController,the secretKey field is populated from the STRIPE_SECRET_KEY environment variable that we copied from the Stripe dashboard gezeigt wurde.

Sobald der Dienst initialisiert wurde, wird dieser Schlüssel in allen nachfolgenden Stripe-Vorgängen verwendet.

Das von der Stripe-Bibliothek zurückgegebene Objekt repräsentiertcharge operation und enthält nützliche Daten wie die Operations-ID.

6.3. Regler

Zum Schluss schreiben wir diecontroller that will receive the POST request made by the checkout form and submit the charge to Stripe über unsereStripeService.

Beachten Sie, dass der Parameter „ChargeRequest“ automatisch mit den im Formular enthaltenen Anforderungsparametern „amount“, „stripeEmail“ und „stripeToken“ initialisiert wird:

@Controller
public class ChargeController {

    @Autowired
    private StripeService paymentsService;

    @PostMapping("/charge")
    public String charge(ChargeRequest chargeRequest, Model model)
      throws StripeException {
        chargeRequest.setDescription("Example 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());
        return "result";
    }

    @ExceptionHandler(StripeException.class)
    public String handleError(Model model, StripeException ex) {
        model.addAttribute("error", ex.getMessage());
        return "result";
    }
}

Bei Erfolg fügen wir dem Modell den Status, die Vorgangs-ID, die Gebühren-ID und die Saldotransaktions-ID hinzu, damit wir sie später dem Benutzer anzeigen können (Abschnitt 7). Dies wird durchgeführt, um einige der Inhalte dercharge object zu veranschaulichen.

UnsereExceptionHandler behandeln Ausnahmen vom TypStripeException, die während des Ladevorgangs ausgelöst werden.

Wenn wir eine genauere Fehlerbehandlung benötigen, können wir separate Handler für die Unterklassen vonStripeException hinzufügen, z. B.CardException,RateLimitException oderAuthenticationException.

Die Ansicht „result“ gibt das Ergebnis des Ladevorgangs wieder.

7. Ergebnis anzeigen

Der zur Anzeige des Ergebnisses verwendete HTML-Code ist eine einfache Thymeleaf-Vorlage, in der das Ergebnis eines Ladevorgangs angezeigt wird. Der Benutzer wird hier durchChargeController gesendet, ob der Ladevorgang erfolgreich war oder nicht:



    
        Result
    
    
        

Success!

Id.:
Status:
Charge id.:
Balance transaction id.:
Checkout again

Bei Erfolg werden dem Benutzer einige Details des Ladevorgangs angezeigt:

Charge successful

Bei einem Fehler wird dem Benutzer die von Stripe zurückgegebene Fehlermeldung angezeigt:

Charge error

8. Fazit

In diesem Tutorial haben wir gezeigt, wie Sie die Stripe Java-API zum Aufladen einer Kreditkarte verwenden. In Zukunft könnten wir unseren serverseitigen Code wiederverwenden, um eine native mobile App bereitzustellen.

Um den gesamten Ladefluss zu testen, benötigen wir keine echte Kreditkarte (auch nicht im Testmodus). Wir können uns stattdessen aufStripe testing cards verlassen.

Der Ladevorgang ist eine von vielen Möglichkeiten, die die Stripe Java-API bietet. The official API reference führt uns durch alle Operationen.

Der in diesem Lernprogramm verwendete Beispielcode befindet sich inGitHub project.