Payment

With the Payment API, the browser native payment dialog can be used to facilitate card payments. Currently only BasicCard is supported, above that can be here can be read further. With the API the user can be queried for all his map information, this can then be checked by the server and if necessary the invalid fields can then be marked for the user.

Example:

// Erstellt das Payment-Objekt und h├Ąngt dieses an unser HTML-Dokument an.
final Payment payment = new Payment(this);

// Hier setzen wir fest, welche Karten wir unterst├╝tzen. Notiz: Zurzeit wird nur basic-card unterst├╝tzt.
final List<CardNetworkIdentifier> supportedCards = Arrays.asList(CardNetworkIdentifier.visa, CardNetworkIdentifier.mastercard);
final List<PaymentRequestMethodData> methodData = Arrays.asList(new PaymentRequestMethodData("basic-card", new BasicCardRequest(supportedCards)));

// Als n├Ąchstes setzen wir die Artikel fest, damit der Benutzer sehen kann, wie viel er und f├╝r was er zahlt.
final List<PaymentItem> items = Arrays.asList(
  new PaymentItem("Rubber Ducky", new PaymentAmount("EUR", "1.00")),
  new PaymentItem("Shower Head", new PaymentAmount("EUR", "5.79")),
  new PaymentItem("Toilet Paper", new PaymentAmount("EUR", "0.90")));

// Dann wie viel gesamt gezahlt werden muss (Diese Zahlen werden nicht ├╝berpr├╝ft, aber diese sollten nat├╝rlich dynamisch richtig kalkuliert werden)
final PaymentItem total = new PaymentItem("Total cost", new PaymentAmount("EUR", "7.69"));

// Diese Optionen stellen fest, wie die Artikel versendet werden sollen
final List<PaymentShippingOption> shippingOptions = Arrays.asList(
  new PaymentShippingOption("standard-shipping", "Standard Shipping", new PaymentAmount("EUR", "5.30"), true));

final PaymentRequestDetails requestDetails = new PaymentRequestDetails(total, items, shippingOptions);

// Diese Optionen geben an, welche Felder Pflichtfelder sind und ob der Benutzer den Shipping-Type ausw├Ąhlen kann
final PaymentRequestOptions requestOptions = new PaymentRequestOptions()
  .setRequestPayerName(true)
  .setRequestPayerEmail(true)
  .setRequestPayerPhone(false)
  .setRequestShipping(true)
  .setShippingType(ShippingType.shipping);

final Consumer<PaymentResult> onResultReceived = result -> {
  // Hier k├Ânnen die Felder validiert werden, wenn alles geklappt hat, kann payment.complete(Result.success) aufgerufen werden
  // Falls etwas nicht valide ist kann wie folgt vorgegangen werden:
  final PayerError payerError = new PayerError()
    .setEmail("The email is not valid!");
  final BasicCardErrors cardError = new BasicCardErrors()
    .setCardNumber("The card number is not valid!");
  final AddressErrors addressErrors = new AddressErrors(); // Nothing wrong so don't set anything

  final PaymentValidationError errors = new PaymentValidationError("Some fields are not valid!", payerError, cardError, addressErrors);
  // Anstatt lambdas k├Ânnte f├╝r den error und success callback auch Methoden angegeben werden. Dann k├Ânnten wir diese einfach rekursiv nochmal aufrufen.
  payment.retry(errors, this::dummyOnSuccess, error -> {
    // Falls das Payment abgebrochen werden soll, kann payment.complete(Result.fail) aufgerufen werden.
    payment.complete(Result.fail, (error) -> { /* Exception oder so einfach ausgeben oder weiter bearbeiten */});
  });
};

final Consumer<JavascriptError> onErrorReceived = error -> {
  System.err.println("An error ocurred: " + error.getMessage());
};

// Zuletzt m├╝ssen wir einfach den Payment-Dialog ├Âffnen
payment.requestPayment(methodData, requestDetails, requestOptions, onResultReceived, onErrorReceived);