Die erste Transaktion ausführen
Eine Transaktion ist ein zweistufiger Vorgang: Zunächst erstellen Sie einen Transaktionskontext, anschließend führen Sie ihn aus. Das SDK gibt bei der Erstellung einen TransactionContext zurück, den Sie an die Ausführungsfunktion übergeben. Durch diese Aufteilung können Sie die Transaktion vor Beginn der Ausführung abbrechen und den Zustand wiederherstellen, falls der App-Prozess abstürzt.
!Wichtig!
Um erfolgreiche Zahlungen durchzuführen, können Sie nur mit geraden Beträgen wie 6,00 testen.
1. Erstellen Sie eine Transaktionsanforderung
Eine Kaufanforderung enthält den Betrag, die Währung, eine Händlerreferenz für den Abgleich sowie eine oder mehrere Einzelposten:
Kotlin
val request = TransactionRequest.purchase(
BaseTransactionRequest.builder()
.currency("CHF")
.merchantReference("order-123")
.addLineItem(
PaymentLineItem.builder("item-1", BigDecimal("10.00"))
.name("Demo item")
.build()
)
.build()
)
Der Gesamtbetrag der Transaktion ergibt sich aus den Einzelposten. Verwenden Sie für Beträge BigDecimal – niemals Double oder Float.
2. Erstellen und Ausführen (Kotlin-Coroutinen)
Kotlin
lifecycleScope.launch {
try {
val context = sdk.terminal.payments.createTransaction(request)
val result = sdk.terminal.payments.executeTransaction(context.transactionId)
if (result is PurchaseResult && result.outcome == TransactionOutcome.APPROVED) {
val ref = result.transaction?.transactionReferenceNumber
// Persist ref against your order
} else {
// Handle declined, cancelled, or failed outcome
}
} catch (error: TerminalException) {
// Technical failure — connection lost, service crashed, etc.
}
}
3. Erstellen und ausführen (Java-Callback)
Java
sdk.getTerminal().getPayments().createTransaction(
request,
new TerminalCallback<TransactionContext>() {
@Override
public void onSuccess(TransactionContext context) {
sdk.getTerminal().getPayments().executeTransaction(
context.getTransactionId(),
new TerminalCallback<TransactionResult>() {
@Override
public void onSuccess(TransactionResult result) {
// Inspect outcome
}
@Override
public void onFailure(TerminalException error) {
// Technical failure
}
}
);
}
@Override
public void onFailure(TerminalException error) {
// Technical failure during create
}
}
);
4. Eine laufende Ausführung abbrechen
Wenn der Benutzer den Zahlungsbildschirm verlässt, während das Terminal auf das Einführen der Karte wartet, fordern Sie den Dienst auf, den Vorgang abzubrechen:
Kotlin
val cancellation = sdk.terminal.payments.cancelTransactionExecution(context.transactionId)
Eine Abbruchaktion durch den Benutzer oder das Terminal wird als TransactionResult mit dem entsprechenden Ergebnis zurückgegeben – nicht als Ausnahme. TerminalCall.cancel() hebt lediglich das lokale Aufrufer-Handle auf; es stoppt das Terminal nicht.
Wichtige Begriffe
- TransactionContext: Der von
createTransactionzurückgegebene Laufzeitkontext. EnthälttransactionId. - transactionId: Identifiziert den Laufzeitkontext. Wird für „execute“, „cancel“ und „recovery“ verwendet. Lokal für die SDK-Sitzung.
- transactionReferenceNumber: Die nach der Ausführung zurückgegebene Acquirer-/Zahlungsreferenz. Dies ist die dauerhafte Kennung – speichern Sie sie zusammen mit Ihrer Bestellung.
Diese drei sind unterschiedlich. Verwechseln Sie transactionId nicht mit transactionReferenceNumber.
Häufige Fallstricke
- Ausführung ohne Erstellung:
executeTransactionerfordert eintransactionIdaus einem vorherigencreateTransaction-Aufruf. - Wiederverwendung eines
transactionId: Jeder Kontext ist nur einmal verwendbar. Erstellen Sie pro Transaktion einen neuen. - Float-basierte Beträge: Führen zu Rundungsfehlern. Verwenden Sie immer
BigDecimal. - Fehlende Händlerreferenz: Die Abstimmung wird mühsam. Legen Sie immer ein eindeutiges
merchantReferencefest. - Ablehnung als Fehler behandeln: Ablehnungen sind Geschäftsergebnisse bei
TransactionResult, keineTerminalException-Fälle.
Mehr als nur der Kauf
Das gleiche „Create/Execute“-Muster gilt auch für andere Vorgänge im Zahlungsbereich:
Kotlin
val refund = sdk.terminal.payments.createRefund(refundRequest)
val capture = sdk.terminal.payments.createReservationCapture(captureRequest)
val adjustment = sdk.terminal.payments.createReservationAdjustment(adjustmentRequest)
val cancellation = sdk.terminal.payments.createReservationCancellation(cancellationRequest)
val voidContext = sdk.terminal.payments.createVoid(voidRequest)
Jede gibt einen TransactionContext zurück, den Sie dann an executeTransaction übergeben.
Das vollständige Anforderungsschema, die Optionen für einzelne Zeilen und die Ergebnistypen finden Sie in der Terminal-API-Referenz.