In de volgende documentatie wordt uitgelegd wat er is veranderd tussen v1.1.0 en v2.x.x van de Android SDK en waar u rekening mee moet houden bij de migratie naar de nieuwste versie.
Wijzigingen in v2.x.x
We hebben de parameters bijgewerkt die worden geretourneerd bij het voltooien van de betaling. Dit omvat nu:
- Lijst van antwoorden op verzoeken.
- Het veld threedresponse (indien aanwezig).
- Eventuele fouten die zijn opgetreden.
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, als onderdeel van de Success en TransactionFailure objecten, geven we een geparseerd transactie responsobject terug.
In v2.x.x hebben we echter maar één Response object, omdat wij onze handelaren meer controle wilden geven over hoe zij het antwoord interpreteren.
Voorbeeldscenario
In v1.1.0, zou een verzoek van "THREEDQUERY","AUTH","SUBSCRIPTION" waarbij de THREEDQUERY en AUTH succesvol waren, maar de SUBSCRIPTION een fout vertoonde, de SDK een TransactionFailure object, ondanks dat de THREEDQUERY en AUTH met succes zijn verwerkt. Het tonen van een foutmelding aan de klant kan in dit specifieke scenario misleidend zijn, omdat er geld was gereserveerd op hun bankrekening.
Om de kans te verkleinen dat de klant verkeerd wordt geïnformeerd over het resultaat van de betalingstransactie, maken we in v2.x.x niet langer op deze manier onderscheid tussen succes en mislukking, en geven we nu alleen de volledige lijst met resultaten terug die u eerst moet verifiëren, parseren en vervolgens analyseren, de errorcode in elk van de antwoorden.
Wat het bovenstaande scenario betreft, zou u uw systeem zo kunnen configureren dat het de antwoorden THREEDQUERY en AUTH als een succes behandelt en het juiste antwoordbericht in de browser van de klant weergeeft (om aan te geven dat er geld is gereserveerd voor betaling), maar ook een foutbericht weergeeft om hen te informeren dat de automatische abonnementsbetalingen nog moeten worden gepland wegens een fout, en dat de klant wordt aangeraden contact met u op te nemen voor hulp.
Voordat informatie in het antwoordobject kan worden vertrouwd, moet u de handtekening van elk JWT-antwoord verifiëren.
Wij bieden een parsingprogramma om de gegevens uit payload velden te halen als onderdeel van de controle van de velden van het betalingsantwoord:
(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