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);