static String lastProcessedTransactionId = "";
public void challengeOOBFlow(
@NonNull D1Task d1Task,
@NonNull FragmentActivity activity,
@NonNull CountDownLatch transactionWaiter) throws D1Exception {
// Implementar la interfaz conforme a AuthnCallback
D1Authn d1Authn = d1Task.getD1Authn(activity, new AuthnCallback(){
@Override
public void onTransactionDataConfirmation(@NonNull Map<String, String> map, @NonNull AuthnUserConfirmationCallback authnUserConfirmationCallback) {
//Pase el controlador de transacciones que comprueba el último ID de transacción procesado
try {
transactionHandler(map, transactionWaiter, authnUserConfirmationCallback);
} catch (InterruptedException e) {
//Procesar la excepción
}
}
@NonNull
@Override
public String onBiometricPromptMessage() {
// Proporcione un mensaje para la solicitud de autenticación. La aplicación puede personalizar el valor.
return "Mensaje que se mostrará al usuario durante la solicitud biométrica";
}
});
d1Authn.fetchAuthnRequest(new D1Task.Callback<Void>() {
@Override
public void onSuccess(Void unused) {
// Continúe con los flujos posteriores después de la verificación del usuario final.
transactionWaiter.countDown();
}
@Override
public void onError(@NonNull D1Exception e) {
// Consulte la sección Integración del SDK de D1 – Gestión de errores.
transactionWaiter.countDown();
}
});
}
public synchronized void transactionHandler(
@NonNull Map<String, String> map,
@NonNull CountDownLatch transactionWaiter,
@NonNull AuthnUserConfirmationCallback authnUserConfirmationCallback) throws InterruptedException {
// El 'map' contiene los datos de la transacción que se van a autenticar.
//Mapa de ejemplo :
// {
// "acsTransId": "2f37539c-d82e-4929-88db-2f9e72c7fa62",
// "merchantName": "CoffeeHouse2 (Dæmø)",
// "purchaseAmount": "100",
// "purchaseCurrency": "840",
// "purchaseExponent": "2",
// "purchaseDate": "20231017055638"
// }
//Obtenga el ID de la transacción actual y compárelo con el último ID de transacción procesado. Si es el mismo, no es necesario procesar la transacción y continúe cancelando la transacción
if(map.get("acsTransId") != lastProcessedTransactionId) {
lastProcessedTransactionId = map.get("acsTransId");
JSONObject json = new JSONObject();
for (Map.Entry<String, String> entry : map.entrySet()) {
try {
json.put(entry.getKey(), entry.getValue());
} catch (JSONException ignored) {}
}
// Aplicación para mostrar el contenido, solicitar al usuario final que 'proceda' o 'deniegue' la solicitud de autenticación.
// Para proceder: cuando el usuario seleccione proceder
// una vez que proceda, se solicitará autenticación en la interfaz según el AuthnType seleccionado registrado.
authnUserConfirmationCallback.proceed();
// Para cancelar: cuando el usuario seleccione cancelar
authnUserConfirmationCallback.cancel();
} else {
if(transactionWaiter.await(60, TimeUnit.SECONDS)) {
//No es necesario procesar la transacción y continúe cancelando la transacción
authnUserConfirmationCallback.cancel();
}
}
}