Android

Registro de cambios 

[1.2.13] - 2023-10-11 - hoy en día 

Agregado 

  • Detección de comunicación.

  • Tipo de red Sim (2G,3G,4G,5G)

Cambiado 

Eliminado 

[1.2.12] - 2023-09-12 - 2023-10-11 

Agregado 

  • Método de configuración del proxy.

Cambiado 

  • Se utilizan conjuntos de cifrado.

Eliminado 

[1.2.11] - 2023-07-05 - hoy en día 

Agregado 

Cambiado 

  • Se corrigieron datos adicionales que no se enviaban.

Eliminado 

[1.2.10] - 2023-06-23 - 2023-07-05 

  • Esta versión es una actualización sin cambios funcionales. El número de versión se actualiza a 1.2.10 para mantener la secuencia de versiones.

Agregado 

Cambiado 

Eliminado 

[1.2.9.2] - 2023-06-23 - 2023-06-23 

Agregado 

Cambiado 

  • Biblioteca Commons actualizada para correcciones adicionales.

Eliminado 

[1.2.9.1] - 2023-06-22 - 2023-06-23 

Agregado 

Cambiado 

  • Biblioteca Commons actualizada para aplicar algunas correcciones de errores.

Eliminado 

[1.2.9] - 2023-05-18 - 2023-06-22

Agregado 

  • Se agregó la versión sdk al modelo de transacción.

Cambiado 

  • Manejo previo de errores para permitir la creación del servicio de fraude incluso si el proveedor de gps no está disponible.

Eliminado 

[1.2.8] - 2023-05-12 - 2023-05-12 

Agregado 

  • Se agregaron manejos de errores adicionales para evitar que la transacción falle cuando falla algún paso de compilación.

Cambiado 

Eliminado 

[1.2.7] - 2023-03-15 - 2023-05-12 

Agregado 

  • Se modificó el modelo de transacción para agregar información sobre la tarjeta SIM.

Cambiado 

Eliminado 

[1.2.6] - 2023-02-02 - 2023-03-15 

Agregado 

Cambiado 

  • Se modificó el modelo de transacción para agregar los estados de los permisos solicitados.

  • Se modificó el modelo de transacción para agregar si los proveedores de gps y wifi están habilitados.

Eliminado 

[1.2.5] - 2023-01-13 - 2023-02-02 

Agregado 

Cambiado 

  • Se corrigió la configuración de proguard que hacía que la aplicación del cliente se volviera a empaquetar en nuestra carpeta interna de la biblioteca.

Eliminado 

[1.2.4] - 2023-01-10 - 2023-01-13 

Agregado 

Cambiado 

  • Los errores durante el callback de sendTransacción ahora se registrarán en lugar de redirigirse al callback de excepción.

Eliminado 

[1.2.3] - 2022-12-09 - 2023-01-10 

Agregado 

Cambiado 

  • Se solucionó el problema con la identificación de la huella digital.

Eliminado 

[1.2.2] - 2022-11-30 - 2022-12-09 

Agregado 

Cambiado 

  • Refactorización de nombres de clase.

  • Se cambiaron las etiquetas en los registros para que coincidan con la refactorización.

  • Fraud constructor ya no admite un host de URL, solo permite seleccionar el entorno deseado.

Eliminado 

[1.2.0] - 2022-10-12 - 2022-11-22 

Agregado 

  • Se agregó la versión del kernel en las propiedades del dispositivo.

  • Registros de depuración

Cambiado 

  • Se corrigieron errores con el envío de cadenas JSON en lugar de matrices

  • Mejora en la identificación del dispositivo, identificación de instalación y huella digital

  • GPS y Signal ya no pueden causar un bloqueo en el proceso

Eliminado 

[1.1.3] - 2022-09-30 - 2022-10-12 

Agregado 

Cambiado 

  • Publicar repositorio de nexus a github.

Eliminado 

[1.1.2] - 2022-09-30 - 2022-10-12 

Agregado 

  • Compatibilidad para versiones 5+

Cambiado 

Eliminado 

[1.1.0] - 2022-09-22 - 2022-09-30 

Agregado 

  • Archivo de LICENCIA agregado al proyecto

Cambiado 

  • Refactorización del nombre del módulo

Eliminado 

[1.0.2] - 2022-09-10 - 2022-09-22 

Agregado 

  • Excepciones personalizadas

Cambiado 

  • Se excluyeron las devoluciones de llamada y las excepciones de ofuscación para facilitar el uso del cliente.

  • Se cambiaron los nombres y la estructura de los parámetros del modelo.

Eliminado 

[1.0.1] - 2022-09-10 - 2022-09-12 

Agregado 

  • CI/CD para compilar y publicar en las ramas dev, testing and release.

Cambiado 

  • Devoluciones de llamada excluidas y excepciones de ofuscación para facilitar el uso del cliente.

  • Se cambiaron los nombres y la estructura de los parámetros del modelo.

Eliminado 

[1.0.0] - 2022-09-10 

Agregado 

  • Ofuscación de código y gitignore extendido.

Cambiado 

  • Secciones de código migradas del código a una biblioteca común.

  • Modificado el comportamiento del servicio de GPS

Eliminado

Configuración 

Versiones soportadas 

Plataforma Versiones soportadas
Android 5.0.0+

Agregue el SDK de fraude basado en la ubicación de Ironchip 

Agregar nuestra biblioteca en otros proyectos 

Primero, en el fichero setting.gradle, se deberá referenciar al repositorio remoto donde se encuentra la librería.

dependencyResolutionManagement {
...

repositories {
maven { url 'https://jitpack.io' }
...
}
}

A continuación, en el fichero gradle.build, se deberá añadir la dependencia del sdk. Then, inside the file, add the dependency to the sdk.


dependencies {
...
implementation "com.github.Ironchip-Security:LBFraud-SDK-Android:1.2.13"
...
}

Permisos 

Añada los siguientes permisos a su manifest:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-permission android:name="android.permission.INTERNET" />

Uso 

Usar en una aplicación 

Para aprovechar todo el potencial del sdk, es necesario conceder el permiso ACCESS_FINE_LOCATION.  

Como solicitar permisos

import com.ironchip.ironchiplbfraudandroidsdk.LBFraudSDK;
...

// Reemplace APIKEY con la clave API generada deseada.
LBFraudSDK fraud = new LBFraudSDK(this, "APIKEY");
// Por defecto nuestro SDK apunta al entorno de producción.
// En caso de que desee apuntar a un entorno diferente:
// LBFraudSDK fraud = new LBFraudSDK(this, "APIKEY", LBFraudSDK.Environment.Testing);

//public enum Environment {
// Production,
// Testing,
// Development
//}

Map<String, Object> extraData = new HashMap<>();
extraData.put("concept", "Book august");
extraData.put("amount", new Integer(30));
extraData.put("operation", "booking");

// TransactionID (required,unique): transaction identifier request for fraud results
// UserID (required): User identifier
// ExtraData (optional): extra information for analysis
// The sendTransaction can be provided with 2 callbacks, one is executed when the transaction is finished
// and the other one is called in case an error did occure during the transaction process.
ironchipLBFraud.sendTransaction("random_identifier_generated", "john.doe@gmail.com", extraData, () -> {
// Add here any code you want to be executed after the transaction
// has finished.
}, exception -> {
// Add here any code you want to perform in case of an error
// during the transaction.
// exception.printStackTrace()
});

Ejemplo

import com.ironchip.ironchiplbfraudandroidsdk.LBFraudSDK;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

...

// Reemplace APIKEY con la clave API generada deseada.
LBFraudSDK fraud = new LBFraudSDK(this, "APIKEY");

// Método asincrónico para realizar el inicio de sesión del usuario
private void login(String username, String password) {
performLogin(username, password).thenAccept(loginSuccessful -> {
if (loginSuccessful) {
// Si el inicio de sesión es exitoso, llama a sendTransaction con los parámetros necesarios
String transactionID = generateRandomTransactionID(10); // Generate or fetch your transaction ID
String userID = "john.doe@gmail.com"; // Identificador de usuario
String anonymizedUserID = anonymizeUserID(userID); // ID de usuario anonimizado

Map<String, Object> extraData = new HashMap<>(); // Información adicional para análisis
extraData.put("amount", 30); // Usa Integer.valueOf(30) si fuera necesario
extraData.put("operation", "login");

sendTransactionAfterLogin(transactionID, anonymizedUserID, extraData);
} else {
// Manejar el fallo en el inicio de sesión
}
});
}

// Función de inicio de sesión asincrónica que devuelve un Future<Boolean>
private CompletableFuture<Boolean> performLogin(String username, String password) {
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);

// Reemplaza con tu lógica de inicio de sesión real
// Por ejemplo, autentica al usuario y devuelve true si es exitoso
return true;
} catch (InterruptedException e) {
return false; // En caso de un error, devuelve false
}
});
}

// Función para enviar la transacción después de un inicio de sesión exitoso
private void sendTransactionAfterLogin(String transactionID, String anonymizedUserID, Map<String, Object> extraData) {
// Enviando la transacción
fraud.sendTransaction(transactionID, anonymizedUserID, extraData, () -> {
// Agrega aquí cualquier código que quieras ejecutar después de que la transacción haya finalizado.
}, exception -> {
// Agrega aquí cualquier código que quieras ejecutar en caso de un error durante la transacción.
});
}

// Función para recortar, convertir a minúsculas y hashear el userID
public static String anonymizeUserID(String userID) {
String trimmedLowercaseUserID = userID.trim().toLowerCase();
return hashString(trimmedLowercaseUserID);
}

// Función para realizar el hashing utilizando SHA-256
public static String hashString(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));

StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Error while calculating hash", e);
}
}

private String generateRandomTransactionID(int length) {
// Implementa tu método para generar un ID de transacción único.
const String chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890";
Random rnd = new Random();
return IntStream.range(0, length)
.mapToObj(i -> String.valueOf(chars.charAt(rnd.nextInt(chars.length()))))
.collect(Collectors.joining());
}