Die folgende Dokumentation erläutert, was sich zwischen v1.1.0 und v2.x.x des Android SDK geändert hat und was bei der Migration auf die neueste Version zu beachten ist.
Änderungen in v2.x.x
Wir haben die Parameter aktualisiert, die bei Zahlungsabschluss zurückgegeben werden. Dies beinhaltet nun:
- Liste der Antworten auf die Anfrage.
- Das Feld threedresponse (falls vorhanden).
- Alle aufgetretenen Fehler.
data class Response(
val responseJwtList: List<String> = emptyList(),
val threeDResponse: ThreeDResponse? = null,
val error: Error? = null)
sealed class PaymentSessionResponse {
sealed class Failure(): PaymentSessionResponse() {
/**
* Errors representing illegal states on payment session initialization and execution. They
* indicate merchant's development errors, which should never occur on production environment.
*/
sealed class DeveloperError(val message: String): Failure() {
object SessionAlreadyExecuted: DeveloperError("This session has already been executed")
object InvalidRequestTypes: DeveloperError("Invalid request types provided in JWT payload")
object ActivityProviderRequired: DeveloperError("Providing activityProvider parameter is mandatory if request list contains THREEDQUERY")
object ActivityResultProviderRequired: DeveloperError("Providing activityResultProvider parameter is mandatory if request list contains THREEDQUERY")
}
/**
* Generic error was returned for initialization or Cardinal initialization.
*/
object InitializationError: Failure()
/**
* Error or ParsingError was returned as TransactionResponse for initialization.
*/
data class InitializationFailure(val jwt: String, val result: TransactionResponse): Failure()
/**
* Error returned when any safety warnings have been detected by Cardinal SDK.
*/
data class SafetyError(val errors: List<DeviceSafetyWarning>): Failure()
/**
* At least one transaction returned Error or ParsingError.
*/
data class TransactionFailure(val responseParts: List<ResponsePart<TransactionResponse>>): Failure() {
val allResponses: List<TransactionResponse>
get() = responseParts.flatMapTo(arrayListOf()) { it.responses }
}
}
data class Success(val responseParts: List<ResponsePart<TransactionResponse.PaymentSuccess>>): PaymentSessionResponse() {
val allResponses: List<TransactionResponse.PaymentSuccess>
get() = responseParts.flatMapTo(arrayListOf()) { it.responses }
}
}
In v1.1.0 wurde als Teil der Success und TransactionFailure Objekten haben wir ein geparstes Transaktionsantwortobjekt zurückgegeben.
In v2.x.x haben wir jedoch nur eine Response Objekt, weil wir unseren Händlern mehr Kontrolle darüber geben wollten, wie sie die Antwort interpretieren.
Beispielszenario
In v1.1.0 wurde bei einer Anfrage von "THREEDQUERY","AUTH","SUBSCRIPTION", bei der THREEDQUERY und AUTH erfolgreich waren, aber bei SUBSCRIPTION ein Fehler auftrat, vom SDK eine TransactionFailure Objekts, obwohl die THREEDQUERY und AUTH erfolgreich verarbeitet wurden. Die Anzeige einer Fehlermeldung für den Kunden kann in diesem speziellen Szenario irreführend sein, da Gelder auf seinem Bankkonto reserviert wurden.
Um die Wahrscheinlichkeit zu verringern, dass der Kunde falsch über das Ergebnis der Zahlungstransaktion informiert wird, unterscheiden wir in v2.x.x nicht mehr zwischen Erfolg und Misserfolg, sondern geben nur noch die vollständige Liste der Ergebnisse zurück, die Sie zunächst überprüfen, analysieren und dann die errorcode in jeder der Antworten zurück.
In Bezug auf das obige Szenario könnten Sie Ihr System so konfigurieren, dass es die Antworten THREEDQUERY und AUTH als Erfolg behandelt und die entsprechende Antwortmeldung im Browser des Kunden anzeigt (um anzuzeigen, dass Mittel für die Zahlung reserviert wurden), aber auch eine Fehlermeldung anzeigt, um den Kunden darüber zu informieren, dass die automatischen Abonnementzahlungen aufgrund eines Fehlers noch nicht geplant werden konnten und dass dem Kunden empfohlen wird, sich mit Ihnen in Verbindung zu setzen.
Bevor die Informationen im Antwortobjekt vertrauenswürdig sind, müssen Sie die Signatur jeder JWT-Antwort überprüfen.
Wir stellen ein Parsing-Dienstprogramm zur Verfügung, um die Daten des Feldes payload als Teil der Überprüfung der Zahlungsantwortfelder zu extrahieren:
(Kotlin)
val response: PaymentTransactionManager.Response = paymentTransactionManager.executeSession(paymentSession)
//Every JWT returned from the SDK should be verified before further usage.
for (jwt in response.responseJwtList) {
if (!verifyJwtIntegrity(jwt)) {
throw SecurityException("JWT verification failed!")
}
}
val parsedResponse = ResponseParser.parse(response.responseJwtList)
//Process parsedResponse object in a similar manner as in v1.1.0