Manual de
Integración de Canales
BIOmetric ID
| BIOmetric ID Version: | BIOmetric ID 1.2 |
| Generated at: | Abril 2025 |
Table of Contents
Biometric ID - API¶
En este documento encontrará una explicación de cómo se realiza la integración con el API BiometricID
Pre requisitos¶
Para hacer uso del API debe contar con un API Key válido.
Toda petición que se realice al api debe contener el siguiente header
ApiKey: {{ apiKey }}
Nota
Según el endpoint que se use se solicitarán headers adicionales.
Flujo de uso¶
El api está diseñado para utilizarse de manera secuencial, el flujo es el siguiente:
flowchart LR
A([Consulta de documento]) --> B([Verificación biometrica])
B --> C([Consulta de información adicional])
Endpoints expuestos¶
DocumentQuery¶
Este endpoint permite consultar si un documento está disponible para su verificación biométrica.
Nota
Se debe enviar el correo del usuario que está realizando la petición {{ USUARIO_SELFSERVICE }}, solo serán válidos correos de usuarios creados en el selfservice por el cliente dueño del ApiKey
Headers requeridos:
ApiKey: {{ apiKey }}
Authorization: ApiKey {{ apiKey }}
Content-Type: application/json
Ejemplo de request:
curl --location --request POST 'https://apibiometricid.racsa.go.cr/bioapi/api/DocumentQuery' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'ApiKey: {{ APIKEYVALID }}' \
--header 'Authorization: ApiKey {{ APIKEYVALID }}' \
--data-raw '{
"documentType": "Foreigner",
"documentNumber": "1234566",
"userEmail": "{{ USUARIO_SELFSERVICE }}"
}'
Ejemplo de respuesta para un documento disponible:
{
"biometricAvailable": true,
"token": "{{ JWTVALIDTOKEN }}",
"availableFingers": [
"RightThumb",
"RightIndex"
],
"facialRecognitionAvailable": false,
"name": "Pepito",
"surname": "Peréz",
"secondSurname": "HIT",
"transactionId": "c3717a3c-32d5-b62b-b5d4-3a092a3dcb84"
}
Nota
En este caso la respuesta nos entrega un token que será requerido para hacer la verificación biométrica
Ejemplo de respuesta para un documento no disponible:
{
"transactionId": "ab57808b-b6cd-c8db-5485-3a092a1ffc54",
"biometricAvailable": false
}
BiometricVerification¶
Este endpoint permite realizar la verificación biométrica de una persona dada la imagen de su rostro o la imagen de una huella en formato wsq.
Headers requeridos:
ApiKey: {{ apiKey }}
Authorization: Bearer {{ JWTVALIDTOKEN }}
Content-Type: application/json
JWTVALIDTOKEN
Este token es entregado por la respuesta de DocumentQuery
Ejemplo de request verificación facial:
curl --location --request POST 'https://apibiometricid.racsa.go.cr/bioapi/api/BiometricVerification' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {{ JWTVALIDTOKEN }}' \
--header 'ApiKey: {{ APIKEYVALID }}' \
--data-raw '{
"fullFacePhoto": "BASE64ENCODEDJPEGIMAGE"
}'
Formato de la fotografía
El campo fullFacePhoto debe ser la fotografía del rostro de la persona codificada en Base64, en formato JPEG.
Ejemplo de request verificación por huella:
curl --location --request POST 'https://apibiometricid.racsa.go.cr/bioapi/api/BiometricVerification' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {{ JWTVALIDTOKEN }}' \
--header 'ApiKey: {{ APIKEYVALID }}' \
--data-raw '{
"finger": "RightThumb",
"fingerPrint": "BASE64ENCODEDWSQFINGER"
}'
Dedos disponibles
Los valores válidos para el campo finger son: RightThumb, RightIndex, RightMiddle, RightRing, RightLittle, LeftThumb, LeftIndex, LeftMiddle, LeftRing, LeftLittle.
Los dedos disponibles para un documento en particular se retornan en el campo availableFingers de la respuesta de DocumentQuery.
Ejemplo de respuesta para una verificación exitosa:
{
"hit": true,
"documentImage": "BASE64ENCODEDDOCUMENTIMAGE",
"documentExpirationDate": "2024-10-25T00:00:00",
"token": "JWTVALIDTOKEN",
"externalDataSources": [],
"transactionId": "c3717a3c-32d5-b62b-b5d4-3a092a3dcb84",
"remainingTries": 1,
"scoreResult": 0,
"scoreLimit": 0,
"documentNumber": "123456789",
"oldDocumentNumber": "2223333444",
"lastName": "Carter",
"secondLastName": "Doo",
"name": "John",
"category": "CATEGORY",
"birthDay": "2023-06-09T15:07:11.978Z",
"dateIssue": "2023-06-09T15:07:11.978Z",
"nationality": "Colombian",
"gender": "M",
"status": "STATUS"
}
Nota
En este caso la respuesta nos entrega un token que será requerido para consultar las fuentes de información externas a través del endpoint ExternalSourceQuery.
Ejemplo de respuesta para una verificación fallida:
{
"transactionId": "c3717a3c-32d5-b62b-b5d4-3a092a3dcb84",
"remainingTries": 1,
"hit": false,
"scoreResult": 0,
"scoreLimit": 0
}
Códigos de respuesta¶
DocumentQuery¶
| Código HTTP | Mensaje | Descripción |
|---|---|---|
200 |
— | Consulta exitosa. El campo biometricAvailable indica si el documento está disponible para verificación biométrica. |
400 |
(detalle de validación) | La solicitud no pudo ser procesada con la información provista. Revisar los campos enviados. |
404 |
— | No se encontró el documento consultado. |
500 |
An error occurred when querying document types |
No se lograron obtener los tipos de documentos habilitados desde el backoffice. |
500 |
Document type {documentType} is not available for the query |
Se intentó consultar con un tipo de documento que no está habilitado para el cliente. |
500 |
The {userEmail} is required |
No se envió el correo del usuario en la solicitud. |
500 |
Ocurrio un error al consultar el usuario |
No se logró consultar el usuario en el backoffice. |
500 |
Error de autenticación |
No se logró obtener el identificador del cliente. |
500 |
No se encontró una sucursal válida dentro de la sesión |
No se encontró una sucursal válida asociada al usuario o ApiKey (documentos nacionales, TSE). |
500 |
Ocurrio un error con la respuesta de TSE |
El servicio de TSE no respondió con éxito al consultar el documento (documentos nacionales). |
500 |
Ocurrio un error al conectarse con el servicio de nacionales |
Excepción al comunicarse con TSE (documentos nacionales). |
500 |
Error en la conexión con el servicio |
Error de conexión con el proveedor del documento (documentos de extranjería). |
BiometricVerification¶
| Código HTTP | Mensaje | Descripción |
|---|---|---|
200 |
— | Verificación biométrica exitosa. hit: true. Incluye datos del documento y un token para consultar fuentes externas. |
400 |
(detalle de validación) | La solicitud no pudo ser procesada con la información provista. Revisar los campos enviados. |
404 |
— | La biometría no coincide con el registro del documento. hit: false. El campo remainingTries indica los intentos restantes. |
500 |
Debe enviar huella o foto |
La solicitud no incluyó ni fotografía (fullFacePhoto) ni huella (finger + fingerPrint). |
500 |
Intentos máximos alcanzados |
Se agotaron los intentos de verificación permitidos (remainingTries llegó a 0). |
500 |
Ocurrio un error al verificar el liveness |
El servicio de liveness no respondió con éxito al procesar la fotografía. |
500 |
Ocurrio un error con el servicio de liveness |
Excepción al procesar la respuesta del servicio de liveness. |
500 |
Error en la conexión con el servicio |
Error de conexión con el servicio biométrico (Innovatrics o DGME). |
500 |
Ocurrio un error con la verificación facial |
Error interno al procesar la verificación facial (DGME). |
500 |
No se encontró una sucursal válida dentro de la sesión |
No se encontró una sucursal válida asociada al usuario o ApiKey. |
500 |
Ocurrio un error con el servicio de TSE, código: {código}, mensaje: {mensaje} |
TSE no respondió con éxito o devolvió una respuesta inválida durante la verificación de huella. |
500 |
No se encontró al menos una huella de la persona en TSE |
TSE no devolvió huellas disponibles para el documento consultado. |
500 |
Ocurrio un error al conectarse con el servicio de nacionales |
Excepción al comunicarse con TSE durante la verificación de huella (documentos nacionales). |
ExternalSourceQuery¶
| Código HTTP | Mensaje | Descripción |
|---|---|---|
200 |
— | Consulta exitosa a la fuente externa. |
400 |
(detalle de validación) | La solicitud no pudo ser procesada con la información provista. |
401 |
— | El token de la sesión ha expirado o se intentó consultar una fuente externa no autorizada para el token. Se debe realizar una nueva verificación biométrica. |
404 |
La persona no fue encontrada |
No se encontró información en la fuente externa consultada. |
500 |
No coinciden los datos con la transacción de origen |
El número de documento, tipo o número de transacción no coincide con la solicitud biométrica original. |
500 |
Ocurrio un error con el servicio |
Error de conexión con la fuente externa (CCSS o CST). |
Estructura de error
Los errores devuelven una estructura ProblemDetails con el siguiente formato:
{
"title": "La solicitud fue recibida pero no pudo ser procesada",
"status": 500,
"detail": "Mensaje con el detalle del error"
}
Los errores de validación devuelven una estructura ValidationProblemDetails:
{
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"Campo": ["Descripción del error de validación"]
}
}
Más información:¶
Puede ver la documentación actualizada del enpoint en el swagger
Biometric ID - SDK Android¶
En este documento encontrará una explicación de cómo se realiza la integración con el SDK Android BiometricID
Última versión estable: 1.0.191
Pre requisitos¶
Para hacer uso del SDK se debe contar con
ApiKey válido: {{ API_KEY }}
Usuario Maven: {{ USUARIO_MAVEN }}
Password Maven: {{ PASSWORD_MAVEN }}
Correo de usuario creado desde el selfservice: {{ USUARIO_SELFSERVICE }}
Crear un Api Key¶
Para usar el sdk se necesita tener un api key válido, en caso de que tengas uno omite este paso
-
Inicia sesión en el selfservice con tus credenciales

-
Da click en la sección de Api Keys

-
Da click agregar apikey

-
Ingresa un nombre y selecciona el tipo sdk android por último escribe el application Id de tu proyecto

Instalación¶
Aplicación demo¶
- Aquí encontrará una aplicación de ejemplo android.zip
Instalacion del SDK¶
1 . Vamos a settings.gradle y en la sección de repositories añadimos la sección de maven:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url 'https://pkgs.dev.azure.com/getlatam/Racsa/_packaging/BiometricID/maven/v1'
name 'BiometricID'
credentials {
username "{{ USUARIO_MAVEN }}"
password "{{ PASSWORD_MAVEN }}"
}
authentication {
basic(BasicAuthentication)
}
}
}
2 . En el build.gradle de la app en la sección de android colocamos el minSdk con un valor minimo de 22 en compileSdk y targetSdk 34, además debemos habilitar multiDex, viewBinding y añadimos las versiones kotlin
android {
compileSdk 34
defaultConfig {
minSdk 22
targetSdk 34
...
multiDexEnabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
viewBinding true
}
composeOptions {
kotlinCompilerExtensionVersion '1.5.1'
}
}
3 . En el build.gradle de la app en la sección de android añadimos la sección packagingOptions
android {
...
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libopencv_java4.so'
pickFirst 'lib/arm64-v8a/libopencv_java4.so'
pickFirst 'lib/arm64-v8a/libncnn.so'
pickFirst 'lib/armeabi-v7a/libncnn.so'
}
}
4 . En el build.gradle de la app en la sección de dependencies añadimos la dependencia del sdk y unas dependencias adicionales
dependencies {
//sdk
implementation(group: 'com.getgroup', name: 'integraid-sdk', version: '1.0.191')
//dependencias adicionales requeridas
implementation(group: 'getgroup.integraid', name: 'integraid-java-client', version: '1.0.24191.1')
implementation(group: 'com.getgroup', name: 'opencv', version: '4.6.0')
//android x requeridas
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.8.0'
}
Instalación dagger¶
El sdk necesita instalar dagger para trabajar con inyección de dependencias
1 . En el build.gradle de la app en la sección dependencies añadimos
dependencies {
//inyección de dependencias
implementation "com.google.dagger:hilt-android:2.42"
kapt "com.google.dagger:hilt-compiler:2.42"
kapt "androidx.hilt:hilt-compiler:1.0.0"
}
2 . En el build.gradle de la app en la sección plugins añadimos
plugins {
//inyeccion de dependencias
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
//plugins requeridos
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
3 . En el build.gradle de la app en la sección defaultConfig añadimos
android {
defaultConfig {
//inyeccion de dependencias
javaCompileOptions.annotationProcessorOptions.arguments['dagger.hilt.disableCrossCompilationRootValidation'] = 'true'
}
}
4 . En el build.gradle del proyecto añadimos
plugins {
id 'com.android.application' version '8.2.0' apply false
id 'com.android.library' version '8.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}
5 . En el settings.gradle en la sección pluginManagement
pluginManagement{
//inyeccion de dependencias
resolutionStrategy {
eachPlugin {
if( requested.id.id == 'dagger.hilt.android.plugin') {
useModule("com.google.dagger:hilt-android-gradle-plugin:2.39.1")
}
}
}
}
Inyectar la configuración al sdk¶
1 . Creamos una clase llamada App que hereda de ApplicationBase y vamos a sobreescribir el metodo getSdkConfigModule
import com.getgroup.integraidsdk.ApplicationBase
import com.getgroup.integraidsdk.Domain.SdkConfig.SdkConfigModule
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class App : ApplicationBase() {
//para sobreescribir la configuración
override fun getSdkConfigModule(): SdkConfigModule {
return AppConfigModule(this)
}
}
2 . Creamos la clase AppConfigModule
import android.app.Application
import com.getgroup.integraidsdk.Domain.SdkConfig.SdkConfig
import com.getgroup.integraidsdk.Domain.SdkConfig.SdkConfigModule
class AppConfigModule(private val context: Application) : SdkConfigModule() {
override fun provideSdkConfig(): SdkConfig {
return SdkConfig(
UrlBaseApi = "{URL_API}",
ShowScore = false,
IsDebug = false,
TimeOutApi = 20 * 1000,
TimeOutMostrarDocumento = 5 * 60 * 1000,
ApiKey = "{API_KEY}",
WriteLogsConsola = false,
WriteLogsDispositivo = false,
UrlTerminosCondiciones = "{URL_TERMINOS}",
LivenessEscaneoFacial = 0.8,
ScoreMinimoEscaneoFacial = 40f,
LivenessScoreMinimoEscaneoHuella = 0.5f,
Nist2qualityMinimoEscaneoHuella = 40,
HuellaWidth = 800,
HuellaHeight = 800,
HuellaCompressionRatio = 0f,
)
}
}
3 . Vamos al manifest y asociamos la clase de la app como el contexto en la sección de application
<application
android:name=".App"
tools:replace="android:name,android:theme"
...
Compatibilidad con android con Android Studio Narwhal¶
En caso de presentarse errores de compilación se debe realizar la siguiente configuración:
-
Ir al menu File, settings, Build Tools, Gradle, en el gradle jdk se debe seleccionar la versión 17
-
En el archivo gradle.properties se debe añadir lo siguente:
org.gradle.jvmargs=--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
kapt.use.worker.api=false
kapt.include.compile.classpath=false
- Limpiar cache: Ir al menu File, Ivalidate caches, seleccionar todas las opciones y click en el botón Invalidate and restart
Definiciones¶
Variables de configuración (SdkConfig)¶
| Nombre | Tipo | Descripción |
|---|---|---|
| UrlBaseApi | String | Url del api https://apibiometricid.racsa.go.cr/bioapi |
| ShowScore | bool | Si esta en true cuando falle la verificación biometrica mostrará el score o puntaje |
| IsDebug | bool | Para definir si la app esta en debug |
| TimeOutApi | int | Asigna el tiempo máximo de espera en la conexión con el api, el valor recomendado es de 20000 milisegundos oséa 20 segundos |
| TimeOutMostrarDocumento | long | Asigna el tiempo máximo que permitirá mostrar la información del documento consultado en InformacionPersonalView |
| ApiKey | string | El token generado por el self service que tiene asociado el applicationId del proyecto, el apikey permite realizar peticiones al api |
| WriteLogsConsola | bool | Si está en true escribirá logs en la consola |
| WriteLogsDispositivo | bool | si está en true escribirá logs en el dispositivo, sin embargo se deberán declarar permisos de lectura y escritura en el manifest |
| UrlTerminosCondiciones | string | Asigna la url de terminos y condiciones que se mostrará al usuario cuando realice una consulta de documento |
| LivenessEscaneoFacial | double | Valor entre 0 y 1 entre más alto el número verificará que el escaneo se le tome a una persona para evitar fraudes, el valor recomendado es 0.8 |
| LivenessEscaneoHuella | float | Valor entre 0 y 1 entre más alto el número verificará que el escaneo se le tome a una huella real para evitar fraudes |
| ScoreMinimoEscaneoFacial | float | Valor entre 0f y 100f, es el score o puntuación mínima local de rostro que realiza el sdk antes de enviarlo al api |
| ScoreMinimoEscaneoHuella | float | Valor entre 0f y 1f, es el score o puntuación mínima local de huellas que realiza el sdk antes de enviarlo al api |
| HuellaWidth | int | Ancho de la imagen de la huella que será enviada |
| HuellaHeight | int | Alto de la imagen de la huella que será enviada |
| HuellaCompressionRatio | float | valor entre 0f y 1f, que corresponde al nivel de compresión de la imagen de la huella |
Clases¶
| Nombre | Descripción | Propiedades |
|---|---|---|
| Documento | Clase que muestra la información básica de un documento consultado | Nombre: String, Apellido: String, SegundoApellido: String, Huellas: List<HuellaEscanearEnum?>, IsVerificacionFacial: Boolean, TipoDocumentoEnum:TipoDocumentoEnum, TransactionId:String |
| TipoDocumentoEnum | Enumerador con el tipo de documento | NACIONAL, EXTRANJERO |
| ResponseException | clase que trae las excepciones internas y del api | code: Int, error: String, response: Any?,, responseBody: String?, transactionId: String, extras: Any? |
| HuellaEscanearEnum | Enumerador con los tipos de huella para escanear | PULGAR_DERECHO = 1, PULGAR_IZQUIERDO = 6, INDICE_DERECHO= 2, INDICE_IZQUIERDO = 7, MEDIO_DERECHO = 3, MEDIO_IZQUIERDO = 8, ANULAR_DERECHO = 4, ANULAR_IZQUIERDO= 9, MENIQUE_DERECHO = 5, MENIQUE_IZQUIERDO = 10 |
| VerificarFacialHuella | clase para realizar la verificación biometrica (facial o huella) | Token: String, Documento: String, NombreCompleto: String, Huella: HuellaEscanearEnum, PathHuellaWsq: String, PathFoto: String |
| InformacionPersonal | clase de información personal de un documento consultado y que haya pasado la verificación biometrica | TransactionId: String, ImagenDocumento: String, FechaExpiracion: String, NombreCompleto: String, Documento: String, ListFuentesExternas:List<FuenteExterna> |
| FuenteExterna | clase de fuente externa disponible para consultar | Id: Int, Nombre: String, Seleccionada: Boolean |
Códigos de error¶
Cada variable se encuentra en la clase ApiConstants
| Nombre | Código | Explicación |
|---|---|---|
| RESPONSE_OK | 200 | Todo fue correcto |
| RESPONSE_NOT_FOUND | 404 | No encontró el documento consultado |
| RESPONSE_ERROR_VALIDATIONS | 400 | Errores de validación, por ejemplo no se están enviando datos con el formato correcto |
| RESPONSE_INTERNAL_ERROR | 500 | Error interno del servidor |
| RESPONSE_UNAUTHORIZARED | 401 | Petición sin autorización, el token de consulta de documento expiro ó se esta enviando un Api Key sin autorización |
| RESPONSE_UNAUTHORIZARED_FORBIDDEN | 403 | Se esta enviando un Api Key inválido |
| RESPONSE_IMAGES_NOT_FOUND | 512 | Error local de la aplicación que ocurre cuando se perdió el cache de la verificación facial o huella, se debe realizar una nueva verificación |
Permisos¶
El sdk ya tiene definidos los permisos y no es necesario declararlos en el manifest de tu proyecto sin embargo a continuación se muestran
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
Diagrama de navegación¶
Cada interfaz (activity) debe usar un view que se encarga de la logica de negocio, a continuación el flujo de los activities por defecto con el nombre del view que utliza

Activities por defecto¶
Para invocar el flujo de navegación por defecto debes hacer un intent a ConsultarDocumentoActivity
val intent = Intent(this, ConsultarDocumentoActivity::class.java)
startActivity(intent)
Crea tus activities¶
Activity¶
Cada activity debe heredar de BaseActivity y arriba de la clase colocar @AndroidEntryPoint para que recibir las dependencias del sdk por ejemplo:
@AndroidEntryPoint
class CustomActivity : BaseActivity() {
}
xml¶
En el xml del activity se debe de usar el view deseado
<com.getgroup.integraidsdk.Ui.ViewDeseado
android:id="@+id/identificador"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Evento¶
Cada view tiene una función init donde se le pasa un evento que te notificará para que puedas tomar acción, por ejemplo:
private val event = object : Evento{
override fun onEvento(): Boolean {
return super.onEvento()
}
}
Consultar documento¶
Este view permite realizar la consulta de un documento especificando el tipo de documento y aceptando los términos y condiciones, existen 2 views que solo cambiará la manera de mostrar los tipos de documento
paquete view en forma seleccionable: com.getgroup.integraidsdk.Ui.ConsultarDocumento.ConsultarDocumentoView
paquete view en forma de lista: com.getgroup.integraidsdk.Ui.ConsultarDocumento.ConsultarDocumentoSpinnerListView
| Método | Descripción |
|---|---|
init(event: ConsultarDocumentoViewEvent?, accessToken:string?, correoUsuario:String?) |
Se llama para inicializar el view, se le pasa el evento y el correo del usuario {USUARIO_SELFSERVICE} que está realizando la petición (El accessToken se envía null) |
OnActivityResult(requestCode: Int, resultCode: Int, data: Intent?) |
Se debe llamar en el onActivityResult del activity donde se usa el view, pasandole los mismos argumentos |
mostrarError(ex: ResponseException?) |
Permite mostrar un error enviando una instancia de tipo ResponseException |
mostrarError(text: String) |
Permite mostrar un error enviando una cadena de texto |
ConsultarDocumentoViewEvent¶
| Método | Descripción |
|---|---|
onLoader(isVisible: Boolean) |
Método que notifica que si se debe o no mostrar un loader |
onResultTiposDocumento(result: Result<List<TipoDocumentoEnum>>) |
Método que traerá un resultado la lista de tipos de documento disponibles para consultar o un error. Para saber si todo fue correcto preguntar result.isSuccess, para obtener la lista de tipos de documento result.getOrNull(), para obtener el error val error = result.exceptionOrNull() as ResponseException. NOTA: se debe tener en cuenta que los tipos de documento que aparecerán en el View serán los que estén configurados en el tipo de suscripción al que pertenece el cliente del Selfservice, en caso de no tener algúno habilitado entonces comunicarse con el administrador. |
onResult(result: Result<Documento?>) |
Método que traerá un resultado de Documento o un error. Para saber si todo fue correcto preguntar result.isSuccess, para obtener el documento result.getOrNull(), para obtener el error val error = result.exceptionOrNull() as ResponseException |
onEndShowError(code: Int) |
Método que notifica una vez se haya terminado de mostrar un error desde el view mConsultarDocumentoView.mostrarError(error) |
Documento encontrado¶
Este view muestra el documento encontrado y las opciones para la verificación facial o huella
paquete: com.getgroup.integraidsdk.Ui.DocumentoEncontrado.DocumentoEncontradoView
| Método | Descripción |
|---|---|
init(context: Activity, model: Documento, event: DocumentoEncontradoEvent?, escanearHuellaMano:Bool) |
inicializa el view, se le debe enviar el activity, un objeto de tipo Documento, el evento de tipo DocumentoEncontradoEvent y se pasa un valor booleano para el parametro escanearHuellaMano en caso de que sea true el sdk pide que el usuario ponga su mano y solo escanea la huella que se haya solicitado, por defecto su valor es false entonces solo se escanea el dedo requerido |
| OnActivityResult(requestCode: Int, resultCode: Int, data: Intent?) | Se debe llamar en el onActivityResult del activity enviando los mismos argumentos |
DocumentoEncontradoEvent¶
| Método | Descripción |
|---|---|
| onEscaneoFacial(): Boolean | Cuando se le da click a la verificación facial llega aquí, si se retorna el metodo super().onEscaneoFacial() entonces continua, en caso de retornar false no permite continuar con el escaneo facial |
| onEscaneoHuella(huella: HuellaEscanearEnum?): Boolean | Al dar click para escanear una huella llega aquí y entrega la huella que va a escanear, si return super().onEscaneoHuella() continua si return false entonces no realiza el escaneo |
| onVerificarEscaneoFacial(model: VerificarFacialHuella): Boolean | una vez realiza el escaneo facial o por huella si pasa el score mínimo local que se le ha configurado al sdk llega aquí, entrega un objeto para realizar la verificación biométrica, para realizar la verificación con una activity propia se retorna false |
| onShowMensajes(mensaje: String) | cada vez que el view necesite mostrar un mensaje llega aquí una cadena que se puede mostrar con un Toast por ejemplo |
Verificación biométrica (facial o huella)¶
Es un view que se comunica con el api enviando la foto o huella y retorna la información personal con las fuentes externas disponibles
paquete: com.getgroup.integraidsdk.Ui.VerificacionFacialHuella.VerificacionFacialHuellaView
| Método | Descripción |
|---|---|
| init(event: VerificacionFacialHuellaEvent?) | para inicializar el view, se le debe enviar un evento de tipo VerificacionFacialHuellaEvent |
| verificar(model: VerificarFacialHuella) | para realizar la verificación biometrica (por huella o facial), se le debe enviar el objeto que se extrae de DocumentoEncontradoView |
VerificacionFacialHuellaEvent¶
| Método | Descripción |
|---|---|
| onLoader(isVisible: Boolean) | cada vez que el view necesite mostrar o no un loader |
| onError(mensaje: String, error: ResponseException?) | aquí llegarán los errores como texto o como un objeto ResponseException |
| onResult(result: Result |
metodo que traera un objeto de tipo InformacionPersonal, para obtener el resultado val informacionPersonal = result.getOrNull() as InformacionPersonal |
Nota
No se recomienda enviar el modelo a otro activity con un intent usando extras, debido a que la longitud de la imagen en base64 puede generar una excepción
Ejemplo enviar y recibir información personal¶
//Enviar información como una variable estática
val informacionPersonal = result.getOrNull() as InformacionPersonal
InformacionPersonalActivity.EXTRAS.MODEL = informacionPersonal
val intent = Intent(baseContext, InformacionPersonalActivity::class.java)
startActivity(intent)
//Recibir información de la variable estática
@AndroidEntryPoint
class InformacionPersonalActivity : BaseActivity() {
object EXTRAS {
var MODEL: InformacionPersonal? = null
}
private var model: InformacionPersonal? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
model = EXTRAS.MODEL
if (model == null) {
finish()
showToast("No se recibió la información correctamente")
return
}
binding.mInformacionPersonalView.init(event, model!!)
}
Información personal¶
Muestra la información personal de un documento consultado (Nombres, Apellidos, Foto del documento, fecha de expiración y la opción de zoom en el documento)
paquete: com.getgroup.integraidsdk.Ui.InformacionPersonal.InformacionPersonalView
| Método | Descripción |
|---|---|
| init(event: InformacionPersonalEvent?, model: InformacionPersonal) | inicializa el view, se debe pasar un evento de tipo InformacionPersonalEvent y el objeto InformacionPersonal extraído de VerificacionFacialHuellaView. |
| Iniciara un temporizador con el tiempo que se haya configurado el sdk | |
| destroy() | detiene el temporizador y destruye el view |
InformacionPersonalEvent¶
| Método | Descripción |
|---|---|
| onMostrarFuentesExternas(model: InformacionPersonal): Boolean | cuando hay fuentes externas disponibles, el usuario puede dar click para verlas y primero pasará por aquí, para mostrarlas en un activity propio retornar false |
Fuentes externas¶
Muestra la lista de fuentes externas disponibles de un usuario, cuando el usuario de expanda la fuente externa realiza la consulta y se cargan los resultados con la posibilidad de ocultarlos
paquete: com.getgroup.integraidsdk.Ui.FuentesExternas.View.FuentesExternasView
| Método | Descripción |
|---|---|
| init(event: FuentesExternasEvent?, model:InformacionPersonal) | inicializa el view, se le pasa un evento de tipo FuentesExternasEvent y el objeto InformacionPersonal que se extrae de InformacionPersonalView |
FuentesExternasEvent¶
| Método | Descripción |
|---|---|
| onQuery(model:FuenteExterna) | Evento que notifica la fuente externa que se esta consultando |
| onResultErrorQuery(message: String, error: ResponseException?, fuenteExterna: FuenteExterna) | Evento que notifica excepciones durante la consulta de una fuente externa |
| onResultQuery(result: FuenteExternaResponseOk, fuenteExterna: FuenteExterna) | Evento que notifica trae el resultado de la consulta y la fuente externa asociada |
Casos de uso¶
En caso de querer utilizar la lógica sin interactuar con los views se puede hacer utilizar los casos de uso, para lograrlo se debe crear un ViewModel y solicitar el caso de uso desde el constructor
Ejemplo de ViewModel
//Se crea un evento para notificar del resultado
interface CustomEvent {
fun onTiposDocumentoRecived(result: List<TipoDocumentoEnum>)
fun onDocumentoRecived(result: Documento)
fun onErrorRecived(exception: Throwable)
}
//Se crea el ViewModel para interactuar con los casos de uso
@HiltViewModel
class CustomViewModel @Inject constructor(
@Named(DI.CONSULTAR_DOCUMENTO_USECASE) val useCase: IConsultarDocumentoUseCase,
) : BaseViewModel() {
private val TAG = "CustomViewModel"
private var event: CustomEvent? = null
fun init(event: CustomEvent){
this.event = event
}
fun consultarTiposDocumento(context: Context) {
viewModelScope.launch(Dispatchers.IO) {
try {
val result = useCase.ConsultarTiposDocumento(accessToken = null)
if (!result.isSuccess) {
val exception = result.exceptionOrNull()?:Exception("Ocurrio un error")
//Manejar la exception
LogsUtils.log(context, TAG, exception)
return@launch
}
val tiposDocumento = result.getOrNull() as List<TipoDocumentoEnum>
//Manejar el resultado actualizando la UI en caso de ser necesario
when (context) {
is Activity -> context.runOnUiThread {
event?.onTiposDocumentoRecived(tiposDocumento)
}
else -> {
event?.onTiposDocumentoRecived(tiposDocumento)
}
}
} catch (ex: Exception) {
LogsUtils.log(context, TAG, ex)
}
}
}
fun consultarDocumento(context: Context, tipoDocumento: TipoDocumentoEnum, numeroDocumento:String) {
viewModelScope.launch(Dispatchers.IO) {
try {
val result = useCase.Consultar(tipo=tipoDocumento, documento = numeroDocumento, correoUsuario = BuildConfig.USER_EMAIL, accessToken = null)
if (!result.isSuccess) {
val exception = result.exceptionOrNull()?:Exception("Ocurrio un error")
//Manejar la exception
LogsUtils.log(context, TAG, exception)
when (context) {
is Activity -> context.runOnUiThread {
event?.onErrorRecived(exception)
}
else -> {
event?.onErrorRecived(exception)
}
}
return@launch
}
val documento = result.getOrNull() as Documento
//Manejar el resultado actualizando la UI en caso de ser necesario
when (context) {
is Activity -> context.runOnUiThread {
event?.onDocumentoRecived(documento)
}
else -> {
event?.onDocumentoRecived(documento)
}
}
} catch (ex: Exception) {
LogsUtils.log(context, TAG, ex)
}
}
}
}
Posteriormente desde el Activity se obtiene la instancia del ViewModel y se realiza el llamado al metodo correspondiente
@AndroidEntryPoint
class ConsultarDocumentoCasoUsoActivity : BaseActivity() {
private lateinit var binding: ActivityConsultarDocumentoCasosUsoBinding
private val viewModel: CustomViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityConsultarDocumentoCasosUsoBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel.init(event)
binding.btnConsultarTiposDocumento.setOnClickListener {
viewModel.consultarTiposDocumento(baseContext)
}
binding.btnConsultarExtranjero.setOnClickListener {
viewModel.consultarDocumento(baseContext, TipoDocumentoEnum.EXTRANJERO, binding.txtDocumento.text.toString())
}
binding.btnConsultarNacional.setOnClickListener {
viewModel.consultarDocumento(baseContext, TipoDocumentoEnum.NACIONAL, binding.txtDocumento.text.toString())
}
}
private val event = object : CustomEvent {
override fun onTiposDocumentoRecived(result: List<TipoDocumentoEnum>) {
binding.txtResultado.setTextColor(getColor(com.getgroup.demo.R.color.green))
binding.txtResultado.text = JsonConvertUtils.serialize(result)
}
override fun onDocumentoRecived(result: Documento) {
binding.txtResultado.setTextColor(getColor(com.getgroup.demo.R.color.green))
binding.txtResultado.text = JsonConvertUtils.serialize(result)
//continuar el flujo por medio de los views
/*val intent =
Intent(baseContext, DocumentoEncontradoManualActivity::class.java).apply {
putExtra(
DocumentoEncontradoManualActivity.EXTRAS.EXTRA_JSON,
JsonConvertUtils.serialize(result)
)
}
startActivity(intent)*/
}
override fun onErrorRecived(exception: Throwable) {
binding.txtResultado.setTextColor(getColor(com.getgroup.demo.R.color.red))
if (exception is ResponseException) {
val responseException = exception as ResponseException
//Se entregan más detalles de la excepcion
}
binding.txtResultado.text = JsonConvertUtils.serialize(exception)
}
}
}
Consultar Documento UseCase¶
Dependencia¶
@Named(DI.CONSULTAR_DOCUMENTO_USECASE) private val useCase: IConsultarDocumentoUseCase
Funciones¶
- Consultar tipos de documentos
suspend fun ConsultarTiposDocumento(
accessToken: String? //Token de acceso se envia null
): Result<List<TipoDocumentoEnum>>
- Consultar documento
suspend fun Consultar(
tipo: TipoDocumentoEnum, //TipoDocumentoEnum.NACIONAL | TipoDocumentoEnum.EXTRANJERO
documento: String, //Número de documento
accessToken: String?, //Token de acceso se envia null
correoUsuario: String?, //Enviar el correo de usuario que está realizando la solicitud
): Result<Documento>
Escaneo Facial UseCase¶
Dependencia¶
@Named(DI.ESCANEO_FACIAL_USECASE) val useCase: IEscaneoFacialUseCase
Funciones¶
- Escanear
fun EscaneoFacial(
context: Activity,//Activity que realiza la solicitud
listener: FaceCapturedListener?, //Evento para recibir la respuesta del escaneo
usarCamaraFrontal: Boolean, //true | false
)
interface FaceCapturedListener {
fun OnError(errorMessage: String, details: FaceCapturedDetail?)// Fallo el escaneo o no se cumplio el score requerido
fun OnResult(keyImage: String, details: FaceCapturedDetail)// Escaneo correcto
}
class FaceCapturedDetail(
val score: Float,// Score resultante del escaneo
val scoreLimit: Float,// Limite configurado sdkConfig.ScoreMinimoEscaneoFacial
)
Ejemplo¶
useCase.EscaneoFacial(this, mFaceCaptureListener, true)
private var mFaceCaptureListener = object : FaceCapturedListener{
override fun OnError(
errorMessage: String,
details: FaceCapturedDetail?
) {
val message = if(!MainUtils.isNullOrEmpty(errorMessage)) errorMessage else "Intenta de nuevo por favor"
showMensajes(
message
)
}
override fun OnResult(
keyImage: String,
details: FaceCapturedDetail
) {
val nombreCompleto =
modelDocumento.Nombre + " " + modelDocumento.Apellido + " " + modelDocumento.SegundoApellido
val verificarFacialHuellaModel = VerificarFacialHuella(
modelDocumento.Token,
modelDocumento.Documento,
nombreCompleto,
null,
"",
keyImage
)
val doAction =
event?.onVerificarEscaneoFacial(verificarFacialHuellaModel) ?: true
//continuar con la verificación
useCaseVerificacionFacialHuella.VerificarIntent(
_uiState.value.activity!!,
verificarFacialHuellaModel,
_uiState.value.showScore
)
}
Escaneo Huellas UseCase¶
Dependencia¶
@Named(DI.ESCANEO_HUELLA_USECASE) val useCase: IEscaneoHuellaUseCase
Funciones¶
- Escanear huella
fun EscanearHuella(
context: Activity,//Activity que realiza la solicitud
documento: String,//Número de documento
huella: HuellaEscanearEnum?,//Tipo de huella solicitada
listener: FingerCapturedListener?,//Evento para recibir la respuesta del escaneo
): Result<Boolean>
fun EscanearHuellaMano(
context: Activity,//Activity que realiza la solicitud
documento: String,//Número de documento
huella: HuellaEscanearEnum?,//Tipo de huella solicitada
listener: FingerCapturedListener?,//Evento para recibir la respuesta del escaneo
): Result<Boolean>
interface FingerCapturedListener {
fun OnError(errorMessage: String, details: FingerCapturedDetail?) // Fallo el escaneo o no se cumplio el score o calidad requerida
fun OnResult(keyImage: String, details: FingerCapturedDetail) // Escaneo correcto
}
class FingerCapturedDetail(
val score: Float,// score resultante
val scoreLimit: Float,// sdkConfig.LivenessScoreMinimoEscaneoHuella
val quality: Int,// quality resultante
val qualityLimit: Int// sdkConfig.QualityMinimoEscaneoHuella
)
Ejemplo¶
useCase.EscanearHuellaMano(this, modelDocumento.Documento, modelDocumento.Huellas[0], mFingerCaptureListener, true)
private var mFingerCaptureListener = object : FingerCapturedListener {
override fun OnError(
errorMessage: String,
details: FingerCapturedDetail?
) {
val message = if(!MainUtils.isNullOrEmpty(errorMessage)) errorMessage else "Intenta de nuevo por favor"
showMensajes(
message
)
}
override fun OnResult(
keyImage: String,
details: FingerCapturedDetail
) {
val nombreCompleto =
modelDocumento.Nombre + " " + modelDocumento.Apellido + " " + modelDocumento.SegundoApellido
val verificarFacialHuellaModel = VerificarFacialHuella(
modelDocumento.Token,
modelDocumento.Documento,
nombreCompleto,
_uiState.value.huellaEscanear,
keyImage,
""
)
//Continuar con la verificación
useCaseVerificacionFacialHuella.VerificarIntent(
_uiState.value.activity!!,
verificarFacialHuellaModel,
_uiState.value.showScore
)
}
}
IImagesUseCase¶
Para realizar la verificación facial o huellas no envia directamente la imagen sino una llave (key) en caso de querer obtener la imagen en base64 se hace por medio de la dependencia IImagesUseCase
interface IImagesUseCase {
fun set(base64: String?): String //Se envia el base64 y retorna la key
fun get(key: String): String//Para obtener la imagen en base64 por medio de la key
}
Dependencia¶
@Named(DI.IMAGES_USECASE) val useCase: IImagesUseCase
Verificacion Facial o Huella UseCase¶
Dependencia¶
@Named(DI.ESCANEO_HUELLA_USECASE) private val useCase: IVerificacionFacialHuellaUseCase
Funciones¶
- Verificar
class VerificarFacialHuella(
var Token: String="",//Token
var Documento: String="",//Número de documento
var NombreCompleto: String="",//Nombre
var Huella: HuellaEscanearEnum?=null,//Tipo de huella
var PathHuellaWsq: String?=null,//Llave de la huella en wsq, se obtiene con LocalDataSource
var PathFoto: String?=null,//Llave de la foto, se obtiene con LocalDataSource
)
suspend fun Verificar(
model: VerificarFacialHuella//
): Result<InformacionPersonal>
Consultar fuentes externas UseCase¶
Dependencia¶
@Named(DI.FUENTE_EXTERNA_USECASE) private val useCase: IFuenteExternaUseCase
Funciones¶
- Consultar
class ConsultarFuenteExterna (
val FuenteExternaTipo:ExternalSourceEnumeration,//Tipo de fuente externa CCSS | CST
val AccessTokenFuentesExternas:String//Enviar token obtenido del modelo InformacionPersonal después de pasar la verificación
)
suspend fun Consultar(
request: ConsultarFuenteExterna//Enviar instancia de ConsultarFuenteExterna
): Result<FuenteExternaResponseOk>
Otras funciones¶
Cambiar tipografías¶
Existen 2 tipografía en los views bold y regular, para reemplazarlas solo se debe crear una carpeta font dentro de la carpeta res y pegarlas con los nombres font_bold.ttf y font_regular.ttf

Cambiar textos¶
En el archivo de strings del proyecto se pueden cambiar los valores de estos strings
<string name="doc_nacional">Nacional</string>
<string name="doc_extranjero">Extranjero Residente</string>
<string name="numero_identificacion">Número de identificación</string>
<string name="consultar">Consultar</string>
<string name="regresar">Regresar</string>
<string name="wait">Espera un momento por favor...</string>
<string name="verificacion_facial">Reconocimiento Facial</string>
<string name="verificacion_huella">Verificación por huella</string>
<string name="seleccione_tipo_verificacion">Selecciona el tipo de verificación para</string>
<string name="intentar_de_nuevo">Intentar de nuevo</string>
<string name="verificar">Verificar</string>
<string name="necesitas_conceder_permisos">Necesitas conceder permisos</string>
<string name="consultar_mas_informacion">Consultar más información</string>
<string name="aceptar">Aceptar</string>
<string name="informacion_eliminada">La información ha sido eliminada del dispositivo</string>
<string name="antes_continuar">Antes de continuar:</string>
<string name="antes_continuar_lea">Antes de continuar:\n\nPor favor, lea atentamente lo siguiente.\nAl continuar, usted confirma que está de acuerdo con las siguientes declaraciones:</string>
<string name="terminos_condiciones">Ver términos y condiciones</string>
<string name="acepto_terminos">He leído y estoy de acuerdo con estos términos y condiciones</string>
<string name="confirmar_ciudadano">Por favor confirmar que el ciudadano:</string>
<string name="no_documento">No. Documento</string>
<string name="esta_confirmando">Esta confirmando que esta de acuerdo con las siguientes declaraciones</string>
<string name="declaraciones">Acepta dar su consentimiento para usar su fotografía (Selfie) y Huellas dactilares para verificar su identidad.\n\nHa leido y aceptado la politica de privacidad\n\nHa leido y acepta las condiciones de uso</string>
<string name="autorizo">Autorizo</string>
<string name="ok_">Ok</string>
<string name="exp">EXP:</string>
<string name="No">No:</string>
<string name="limpiar">Limpiar</string>
<string name="camara_frontal">Cámara frontal</string>
<string name="camara_trasera">Cámara trasera</string>
<string name="no_hay_fuentes">No hay fuentes para consultar</string>
<string name="transaccion_copiada">¡Transacción copiada!</string>
<string name="transaccion">Transacción</string>
<string name="identificacion">Identificación</string>
<string name="confirmar">Confirmar</string>
<string name="iniciar_nueva_consulta">Iniciar nueva consulta</string>
<string name="doble_click_zoom">Doble click para zoom</string>
<string name="cuatro_dedos">4 dedos de la mano</string>
<string name="los_pulgares">Los Pulgares</string>
<string name="el_pulgar_de_mano">El Pulgar de la mano</string>
<string name="derecha">Derecha</string>
<string name="izquierda">Izquierda</string>
<string name="ubique">Ubique</string>
<string name="acerque_su_mano">Acerque su mano</string>
<string name="aleje_su_mano">Aleje su mano</string>
<string name="enfoque_mano">Mueva su mano para enfocar</string>
<string name="mantenga_mano_quita">Mantenga su mano quieta</string>
<!--sdk facial-->
<string name="camera_close_message">Acercate a la cámara</string>
<string name="camera_far_message">Alejate un poco de la cámara</string>
<string name="camera_up_message">Sube la cámara hacia ti</string>
<string name="camera_down_message">Baja la cámara hacia ti</string>
<string name="open_eyes_message">Abre los ojos y mira a la cámara</string>
<string name="multiple_faces_detected">Multiples rostros detectados</string>
<string name="detection_failed_message">Detección de rostro fallida</string>
<string name="no_faces_detected_message">No se reconoce un rostro</string>
<string name="look_straight_message">Mira recto</string>
<string name="mask_detected_message">Máscara detectada</string>
<string name="sunglasses_detected_message">Gafas detectadas</string>
<string name="eyes_closed_message">Abre los ojos</string>
<string name="hold_still_message">Quedate quieto</string>
<string name="spoof_detected_message">Falsificación detetada</string>
<string name="ok_str">Capturando...</string>
<string name="please_wait">Por favor espera...</string>
<string name="network_activity_error">Algo va mal, por favor intenta de nuevo</string>
<string name="label_occulusion">Oclusión</string>
<string name="label_eye_close">Ojo cerrado</string>
<string name="label_livehness">Liveness</string>
<string name="hold_still_and_center">Centra tu rostro y quédate quieto</string>
<string name="te_queda">"Te queda: "</string>
<string name="error_documento_no_encontrado">El documento no esta disponible para consulta</string>
<string name="error_generico">Ocurrio un error, comuniquese con el administrador</string>
<string name="error_conexion">Error en la conexión, intente de nuevo ó comuniquese con el administrador</string>
<string name="error_no_autorizado">Su sesión ha expirado</string>
<string name="error_apikey_revocado">No estas autorizado para esta consulta [Apikey revocado]</string>
<string name="error_no_autorizado_forbidden">No estas autorizado para esta consulta [Apikey invalido]</string>
<string name="error_req_identificacion">Ingrese el número de identificación</string>
<string name="error_req_tipo_identificacion">Seleccione el tipo de documento</string>
<string name="error_timeout">La solicitud excedió el tiempo máximo de espera</string>
<string name="error_unauthorizes_verificacion">El token expiro por favor realice la consulta del documento nuevamente</string>
<string name="error_intentos_maximos">Se alcanzaron la cantidad de intentos máximos</string>
<string name="error_no_coincidencias">No se encontraron coincidencias ó no alcanzó el rango de verificación mínimo</string>
<string name="error_imagenes_cache">Ocurrio un error con la memoria del disposito, se necesita realizar la verificación facial o de huellas nuevamente</string>
<string name="error_req_terminos">Debes aceptar los terminos y condiciones</string>
<string name="error_score">No se alcanzo el score mínimo, intentalo de nuevo</string>
<string name="error_req_firma">Necesitas firmar para autorizar</string>
<string name="error_seguridad">Error de seguridad</string>
<string name="error_desconocido">Error desconocido</string>
<string name="error_copiar_transaccion">Ocurrio un error al copiar la transacción</string>
<string name="error_cargar_pagina">Ocurrio un error al cargar la pagina</string>
<string name="error_tomar_captura">Ocurrio un error al tomar la captura</string>
<string name="error_liveness">No se identificó una persona</string>
<string name="error_response">Error en el servidor, por favor intenta de nuevo</string>
<string name="error_fuente_no_seleccionada">Debes seleccionar al menos una fuente</string>
<string name="error_servicio">Ocurrio un error con el servicio</string>
<string name="cargar">Cargar</string>
<string name="error_fuente_externa_not_found">La persona no fue encontrada</string>
<string name="si">Si</string>
<string name="no">No</string>
<string name="error_token_expirado_fuentes_externas">El token ha expirado, necesitas realizar una nueva consulta</string>
<string name="identidad_verificada">Identidad Verificada</string>
<string name="id">ID:</string>
<string name="info_adicional">Información adicional para:</string>
<string name="CCSS_descripcion">Caja Costarricense de Seguro Social</string>
<string name="CST_descripcion">Condición Tributaria</string>
<string name="pulgar_derecho">Dedo Pulgar</string>
<string name="indice_derecho">Dedo Indice</string>
<string name="medio_derecho">Dedo Medio</string>
<string name="anular_derecho">Dedo Anular</string>
<string name="menique_derecho">Dedo Meñique</string>
<string name="pulgar_izquierdo">Dedo Pulgar</string>
<string name="indice_izquierdo">Dedo Indice</string>
<string name="medio_izquierdo">Dedo Medio</string>
<string name="anular_izquierdo">Dedo Anular</string>
<string name="menique_izquierdo">Dedo Meñique</string>
Biometric ID - SDK - IOS¶
En este documento encontrará una explicación de cómo se realiza la integración con el SDK BiometricID en iOS
Pre requisitos¶
- Para hacer uso del SDK debe contar con un API Key válido.
- El Bundle Identifier debe ser previamente autorizado para activar el uso del SDK
Flujo de uso¶
El SDK está diseñado para utilizarse de manera secuencial, el flujo es el siguiente:
flowchart LR
A([Consulta de documento]) --> B([Verificación biometrica])
B --> C([Consulta de información adicional])
Modo de uso¶
Existen 2 formas de usar el SDK
- Haciendo uso de los View predefinidos
- Haciendo uso de los ViewModel predefindos
Nota
El SDK está diseñado usando el patron MVVM
- Puede descargar un demo desde acá: DemoBio.zip
Instalación del SDK¶
Prerequisitos de instalación¶
- Debe descargar el zip con los componentes de instalación ios.zip
Instalación¶
- Agregue el SDK como dependencia SPM al proyecto
- Agregue los Assets al proyecto
Parametros de configuración¶
Debe inicializar el SDK con el ApiKey y la Url del api
let apiUrl = "https://apibiometricid.racsa.go.cr/bioapi"
let apiKey = ""
BiometricIdSDK.Initialize(URL: apiUrl, API_KEY: apiKey, SHOW_DEBUG: false)
Views¶
En caso de hacer uso de las vistas, estas están diseñadas con la siguiente secuencia, sin embargo cada una funciona de manera independiente, permitiendo al desarrollador control en el paso a paso de las vistas.
flowchart LR
A([DocumentQueryView]) --> B([BiometricQueryView])
B --> C([BiometricMatchView])
DocumentQueryView¶
Esta vista permite ingresar los datos de consulta, en Tipo de documento y Número de documento
El constructor de la vista contiene 3 parametros:
- model
Debe ser de tipo DocumentQueryViewModel
- onNext
Acción a ser llamada al oprimirse el botón de Continuar
- content
El contenido entre el TextField de número de documento y el Button de Continuar es un ViewContent que permite ingresar lo que se necesite.
@ObservedObject var documentQueryViewModel = DocumentQueryViewModel()
DocumentQueryView(
model: documentQueryViewModel,
onNext:{
print("onNext")
//Paso sugerido:
//Usar documentQueryViewModel.Query para consultar el documento
})
{
VStack{
Text("Antes de continuar").padding(.bottom, 20)
Text("Por favor, lea atentamente lo siguiente.\nAl continuar, usted confirma que está de acuerdo con las siguientes declaraciones:").padding(.bottom, 20)
Link("Ver términos y condiciones", destination: URL(string: "https://biometricid.racsa.go.cr/terminoscondiciones")!).padding(.bottom, 20)
Text("He leído y estoy de acuerdo con estos términos y condiciones").padding(.bottom, 20)
}
}
BiometricQueryView¶
Esta vista permite iniciar la verificación biometrica por reconocimiento facial o captura de huella según estén disponibles los metodos de validación para el documento consultado.
Info
A partir de esta vista se puede identificar el ID asociado a esta transacción.
var available = DocumentAvailableResponse()
Nota
DocumentAvailableResponse es la respuesta obtenida al consultar si un documento está disponible para su verificación biometrica usando DocumentQueryViewModel.Query
var biometricQueryViewModel = BiometricQueryViewModel(model: available, documentNumber: documentQueryViewModel.documentNumber, documentType: documentQueryViewModel.documentType))
BiometricQueryView(model: biometricQueryViewModel, onFaceCaptured: { image in
//la imagen del rostro fue capturada
biometricQueryViewModel.QueryByPhoto(fullFacePhoto: image) { response in
//Resultado de verificación biometrica
onBiometricQueryResponse(response: response, viewModel: viewModel)
}
}, onFingerCaptured: { finger , fingerPrint in
//la imagen de la huella fue capturada
biometricQueryViewModel.QueryByFinger(finger: finger, fingerPrint: fingerPrint) { response in
//Resultado de verificación biometrica
onBiometricQueryResponse(response: response, viewModel: viewModel)
}
}, onFaceFailed: { error in
//La captura del rostro falló
}, onFingerFailed: { error
in
//La captura de la huella falló
})
func onBiometricQueryResponse(response:Result<BiometricVerificationResponseBase?, Error>, viewModel:BiometricQueryViewModel){
switch response {
case .success(let data):
if let match = data as? BiometricVerifiedResponse, match.hit == true
{
//La verificación biometrica fue exitosa
//Paso sugerido, Mostrar resultado en BiometricMatchView
}else{
//La verificación biometrica no exitosa
if(data?.remainingTries ?? 0 <= 0){
//Se alcanzó el limite de intentos
}else{
//Aún cuenta con intentos disponibles
}
}
break;
case .failure(let error):
if let validationProblem = error as? ValidationProblemDetails{
//Ocurrió un error de validación
if(validationProblem.errors != nil && !validationProblem.errors!.isEmpty){
//Fallas de validación de entrada
var message = "";
validationProblem.errors?.forEach({ key, errors in
message += errors.joined(separator: "\n")
})
}else {
//Ocurrió otro error de validación
}
} lse if let problem = error as? ProblemDetails {
//Ocurrió un error en el servidor
}else{
//Ocurrió un error inesperado o de red
}
}
}
BiometricMatchView¶
Esta vista permite mostrar el resultado de la verificación biometrica exitosa en un formato estandarizado.
var biometricMatchViewModel = BiometricMatchViewModel(
currentBiometricResult: match,
currentQuery: biometricQueryViewModel.currentQuery,
documentNumber: biometricQueryViewModel.documentNumber)
BiometricMatchView(model: biometricMatchViewModel,
onFinish: {
//Acción a ser ejecutada al finalizar el contador de tiempo
},
onGetMoreInformation: {
//Acción a ser ejecutada al oprimir el botón de más información
//Paso suguerido:
//Mostrar fuentes adicionales disponibles
})
ViewModels:¶
DocumentQueryViewModel¶
- Query
Metodo que permite ejecutar la consulta de documento.
documentQueryViewModel.Query(completionHandler: { response in
switch response {
case .success(let data):
if let available = data as? DocumentAvailableResponse, available.biometricAvailable == true
{
//El número de documento está disponible para su consulta
//Paso sugerido:
//Mostrar view para capturar huella o foto del rostro según corresponda.
}else{
//El número de documento no está disponible para su verificación
}
case .failure(let error):
if let validationProblem = error as? ValidationProblemDetails{
//Ocurrio un error de validación de la entrada
}else if let problem = error as? ProblemDetails {
//"Ocurrió un error en el servidor")
}else{
//Ocurrió un error inesperado
}
}
})
BiometricQueryViewModel¶
- Constructor
Recibe como modelo la respuesta a la llamada de documentQueryViewModel.Query cuando el documento esta disponible para su consulta.
init(model:DocumentAvailableResponse,
documentNumber:String,
documentType:DocumentTypeEnumeration)
- StartFaceCapture
Inicia la camara del dispositivo para el proceso de captura facial.
Nota
Solo funciona en dispositivos fisicos. En caso de usar el SDK para emulador, esta función no ejecuta código
func StartFaceCapture(
isUseBackCamera:Bool,
isAutoCapture:Bool,
isFastCapture:Bool,
isoEnabled:Bool,
isGetFullFrontalCrop:Bool,
useCompresion:Bool,
onFaceCaptured: @escaping (NSData?,[String],[String]) -> Void,
onCancelled: @escaping() -> Void,
onFaceCaptureFailed: @escaping (String) -> Void,
onTimedout: @escaping (NSData?) -> Void) -> Void
Ejecuta la consulta de verificación biometrica por rostro usando una imagen en base64
func QueryByPhoto(
fullFacePhoto:String,
completionHandler:
@escaping (Result< BiometricVerificationResponseBase?, Error>) -> Void
Inicia la camara del dispositivo para el proceso de captura de huella.
Nota
Solo funciona en dispositivos fisicos. En caso de usar el SDK para emulador, esta función no ejecuta código
func StartFingerCapture(
finger:Finger,
onFingersCaptured: @escaping ([CapturedFinger]) -> Void,
onFingerCaptureFailed: @escaping (String)->Void) -> Void
Ejecuta la consulta de verificación biometrica por huella usando una huella WSQ en base64
func QueryByFinger(
finger:Finger,
fingerPrint:String,
completionHandler:
@escaping (Result< BiometricVerificationResponseBase?, Error>) -> Void
BiometricMatchViewModel¶
-
Constructor
Recibe el resultado exitoso de una verificación biometrica y el resultado exitoso de la consulta de documento
init(currentBiometricResult: BiometricVerifiedResponse,
currentQuery:DocumentAvailableResponse,
documentNumber:String)
Biometric ID - SDK Web¶
En este documento encontrará una explicación de cómo se realiza la integración con el SDK Web BiometricID
Pre requisitos¶
Para hacer uso del SDK se debe contar con un Api Key válido: {{ API_KEY }} y un correo de usuario creado desde el selfservice: {{ USUARIO_SELFSERVICE }}
Para hacer uso del lector de huellas debe contar con el SDK correspondiente instalado
Se debe tener en cuenta que los tipos de documento que aparecerán para consulta serán los que estén habilitados en el tipo de suscripción al que pertenece el cliente del Selfservice, en caso de no tener algúno habilitado entonces comunicarse con el administrador
Definiciones¶
| Nombre | Descripción |
|---|---|
| {{ URL_SDK }} | https://websdkbiometricid.racsa.go.cr |
| {{ CLIENTE_ID }} | Identificador del cliente |
Crear un Api Key¶
Para usar el sdk se necesita tener un api key válido {{ API_KEY }}, en caso de que tengas uno omite este paso
-
Inicia sesión en el selfservice con tus credenciales

-
Da click en la sección de Api Keys

-
Da click agregar apikey

-
Ingresa un nombre y selecciona el tipo sdk web, por último escribe los dominios autorizados separados por coma

Obtener el identificador del cliente¶
Para usar el sdk se necesita tener el id del cliente {{ CLIENTE_ID }}, en caso de que tengas uno omite este paso
-
Inicia sesión en el selfservice con tus credenciales

-
Da click en la sección de Api Keys

-
Da click en el botón "Copiar cliente id"

Integración del sdk web¶
Paso 1¶
En el html definimos un iframe y le asignamos la {{ URL }} del sdk y el id del cliente
<iframe id="sdkFrame" class="sdk" src="{{ URL_SDK }}?id={{ CLIENTE_ID }}" frameborder="0" allow="camera 'src'"></iframe>
Ejemplo de como quedaría:
<iframe id="sdkFrame" class="sdk" src="https://websdkbiometricid.racsa.go.cr?id=abcdefghijk" frameborder="0" allow="camera 'src'"></iframe>
Paso 2¶
Creamos un script que iniciará el iframe index.js
let frameId = 'sdkFrame';
document.getElementById(frameId).onload = function () {
var msg = {
apiKey:”{{ API_KEY }}”,
userEmail:”{{ USUARIO_SELFSERVICE }}”
};
this.contentWindow.postMessage(msg,this.src);
};
Paso 3¶
Cargar el script al html al final del body
<script src="index.js"></script>
Biometric ID - SDK - REACT NATIVE¶
En este documento encontrará una explicación de cómo se realiza la integración con el SDK BiometricID en React Native
El SDK solo funciona en dispositivos fisicos, no puede ser usado en emuladores.
Pre requisitos¶
- Para hacer uso del SDK debe contar con un API Key válido.
- El Bundle Identifier debe ser previamente autorizado para activar el uso del SDK
- Debe tener un usuario creado desde el selfservice
Flujo de uso¶
El SDK está diseñado para utilizarse de manera secuencial, el flujo es el siguiente:
flowchart LR
A([Consulta de documento]) --> B([Verificación biometrica])
B --> C([Consulta de información adicional])
Modo de uso¶
Existen 2 formas de usar el SDK
- Haciendo uso de los Componentes predefinidos
- Haciendo uso de los Hook predefindos
Instalación del SDK¶
Prerequisitos de instalación¶
- Debe recibir el token de instalación TOKEN_DE_INSTALACION
- Debe descargar el zip con los componentes extra de instalación extras.zip
Instalación¶
- Agregue las siguientes lineas al archivo .npmrc (creelo si no existe en la raíz del proyecto)
@getlatam:registry=https://pkgs.dev.azure.com/getlatam/Racsa/_packaging/BiometricID/npm/registry/
always-auth=true
- Agregue las siguientes lineas al archivo .yarnrc.yml (creelo si no existe en la raíz del proyecto)
nodeLinker: node-modules
nmHoistingLimits: workspaces
npmScopes:
getlatam:
npmRegistryServer: https://pkgs.dev.azure.com/getlatam/Racsa/_packaging/BiometricID/npm/registry/
npmAuthIdent: 'getlatam:TOKEN_DE_INSTALACION'
npmAlwaysAuth: true
- Agregue la siguiente linea al archivo package.json de su proyecto
"packageManager": "yarn@3.6.1",
- Instale los paquetes y dependencias necesarios:
yarn install
yarn add @getlatam/airsnap-ui
yarn add @getlatam/biometric-id-sdk
yarn add react-native-permissions
yarn add react-native-svg
yarn add react-native-paper
- Copie la carpeta Frameworks en la ruta node_modules/@getlatam/airsnap-ui/ios
Android¶
- En la carpeta android en
settings.gradleagregue lo siguiente:
apply from: file("../node_modules/@getlatam/airsnap-ui/android/native_module.gradle");
applyT5NativeModulesSettingsGradle(settings);
- Copie la carpeta models en la ruta android/app/src/main/assets/models
- Copie la carpeta jniLibs en la ruta android/app/src/main/jniLibs
- Abra el archivo
build.gradlede la carpeta app y agregue la siguiente sección endependencies:
def camerax_version = '1.3.1'
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:$camerax_version"
implementation 'com.google.android.material:material:1.9.0'
- Agregue el permiso de Camera al archivo
AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
- Asigne un applicationid el archivo
build.gradlede la ruta android/app
iOS¶
- Reemplace el script del archivo Podfile que contiene este texto:
# Resolve react_native_pods.rb with node to allow for hoisting
require Pod::Executable.execute_command('node', ['-p',
'require.resolve(
"react-native/scripts/react_native_pods.rb",
{paths: [process.argv[1]]},
)', __dir__]).strip
con el siguiente:
def node_require(script)
# Resolve script with node to allow for hoisting
require Pod::Executable.execute_command('node', ['-p',
"require.resolve(
'#{script}',
{paths: [process.argv[1]]},
)", __dir__]).strip
end
node_require('react-native/scripts/react_native_pods.rb')
node_require('react-native-permissions/scripts/setup.rb')
-
Agregue
setup_permissions(['Camera'])después deprepare_react_native_project!en el Podfile -
Agregue las siguientes lineas después de
config = use_native_modules!
use_frameworks!
pod 'OpenSSL-Universal'
Agrege el permiso de camara en el app Info.plist
<key>NSCameraUsageDescription</key>
<string>YOUR TEXT</string>
- ejecute el comando
pod install
- Abra el proyecto xcworkspace en xcode y copie la carpeta models en la raiz del proyecto creando las referencias a la carpeta y copiando los items
Parametros de configuración¶
- El SDK debe ser usado dentro de un proveedor de estado `BiometricIdContextStateProvider``
...
import { BiometricIdContextStateProvider } from '@getlatam/biometric-id-sdk';
...
<BiometricIdContextStateProvider>
...
</BiometricIdContextStateProvider>
- Configure el endpoint y apikey
...
import { BiometricIdStateContext, useBiometricIdSdkConfig } from "@getlatam/biometric-id-sdk";
...
const { setSdkConfig } = useBiometricIdSdkConfig();
useEffect(()=>{
setSdkConfig({
apiUrl: "https://apibiometricid.racsa.go.cr/bioapi",
apiKey: "APIKEY"
});
},[]);
CUSTOMIZATION OF UI COMPONENTS IN ANDROID¶
Strings¶
String resources can be overridden in application and alternative strings for supported languages can be provided using standard Android localization mechanism
<string name="title">%s capture</string>
<string name="title_left_hand">Left hand</string>
<string name="title_right_hand">Right hand</string>
<string name="title_left_thumb">Left thumb</string>
<string name="title_right_thumb">Right thumb</string>
<string name="label_sdk_init_failed">SDK initialization failed code( %d )</string>
<string name="label_progress">Processing…</string>
<string name="label_right">Right</string>
<string name="label_left">Left</string>
<string name="label_four_fingers">4 fingers</string>
<string name="label_finger">finger</string>
<string name="label_fingers">fingers</string>
<string name="label_left_or_right_num_fingers">%1$s %2$d fingers</string>
<string name="label_thumbs">Thumbs</string>
<string name="label_thumb">thumb</string>
<string name="label_right_index_finger">Right index finger</string>
<string name="label_right_middle_finger">Right middle finger</string>
<string name="label_right_ring_finger">Right ring finger</string>
<string name="label_right_little_finger">Right little finger</string>
<string name="label_left_index_finger">Left index finger</string>
<string name="label_left_middle_finger">Left middle finger</string>
<string name="label_left_ring_finger">Left ring finger</string>
<string name="label_left_little_finger">Left little finger</string>
<string name="label_too_few_fingers_detected">Too few fingers detected</string>
<!-- ex: More than 2 fingers , More than 1 finger ,
%1d -> expected finger count for specified position,
%2s -> finger(expected count 1) or fingers(expected count > 1)
-->
<string name="label_too_many_fingers_detected">More than %1$d %2$s</string>
<!--Hold Right 4 fingers vertcally, Hold Left 4 fingers vertcally -->
<string name="hold_vertically">Hold %s vertically</string>
<string name="hold_horizontally">Hold %s horizontally</string>
<string name="label_too_far">Please bring your hand closer</string>
<string name="label_too_close">Please move your hand further</string>
<string name="label_low_focus">Low focus. Try to move hand</string>
<string name="label_good_focus">Hold your hand steady</string>
<string name="label_frame_hand">Frame %s</string>
Colours¶
Colours can be customized in application. To use custom colours override the specific colour.
<color name="bounding_boxes_border_color">#aa89CFF0</color>
<color name="bounding_boxes_fill_color">#3000FF00</color>
<color name="border_color_error">#FFFF2020</color>
<color name="border_color_info">#FFDDDD00</color>
<color name="border_color_pass">#FF00FF00</color>
<color name="airsnapfinger_overlay_color">#4D5F717D</color>
CUSTOMIZATION OF UI COMPONENTS IN IOS¶
Strings¶
String resources can be overridden in application and alternative strings for supported languages can be provided using standard iOS localization mechanism. Add the strings in Localizable.strings file and add the desired language.
//frame 4 fingers
"label.frame" = "Frame %@";
//(More than 4 fingers) or (More than 1 finger)
"label.morethan_expected_fingers" = "More than %d %@";
"label.fingers" = "Fingers";
"label.finger" = "Finger";
//Hold Right 4 fingers horizontally
"label.hold_fingers_horizantally" = "Hold %@ horizontally";
"label.hold_fingers_vertically" = "Hold %@ vertically";
"label.tooFar" = "Please bring your hand closer";
"label.tooClose" = "Please move your hand further";
"label.lowFocus" = "Low focus. Try to move hand";
"label.goodFocus" = "Hold your hand steady";
"label.right_4_fingers" = "Right 4 fingers";
"label.left_4_fingers" = "Left 4 fingers";
"label.thumbs" = "Thumbs";
"label.right_thumb" = "Right thumb";
"label.left_thumb" = "Left thumb";
"label.right_index" = "Right index finger";
"label.right_middle" = "Right middle finger";
"label.right_ring" = "Right ring finger";
"label.right_little" = "Right little finger";
"label.left_index" = "Left index finger";
"label.left_middle" = "Left middle finger";
"label.left_ring" = "Left ring finger";
"label.left_little" = "Left little finger";
"label.right" = "Right";
"label.left" = "Left";
"label.four_fingers" = "4 fingers";
"label.left_or_right_num_fingers" = "%@ %d fingers";
"label.thumb" = "thumb";
"label.too_few_fingers_detected" = "Too few fingers detected";
Componentes¶
En caso de hacer uso de los componentes, están diseñadas con la siguiente secuencia, sin embargo cada una funciona de manera independiente, permitiendo al desarrollador control en el paso a paso de las vistas.
flowchart LR
A([DocumentQueryView]) --> B([BiometricQueryView])
B --> C([BiometricMatchView])
DocumentQueryView¶
Este componente permite ingresar los datos de consulta, en Tipo de documento y Número de documento
El componente permite definir sus children para mostrar el texto de términos y condiciones,
Metodos:
- onNext(documentNumber, documentType)
Acción a ser llamada al oprimirse el botón de Continuar
Se debe definir el email del usuario que está usando la aplicación, así como solicitar los tipos de documento disponibles.
const userEmail:string = "usuarioautorizado@gmail.com";
//uso del proveedor de estado y reducer
const { state, dispatch } = useContext(BiometricIdStateContext);
//Uso del hook useDocumentQuery
const { documentQuery } = useDocumentQuery();
//Destruturación para obtener el metodo para obtener los tipos de documento
const { documentTypesQuery } = useDocumentTypesAvailable();
//Reliza llamado al api para solicitar tipos de documento disponible, cuando la configuración del SDK esté disponible
useEffect(()=>{
documentTypesQuery();
}, [state.sdkConfig]);
<DocumentQueryView onNext={() => {
documentQuery(documentNumber, documentType, userEmail).then((documentQueryResult) =>{
if(documentQueryResult?.biometricAvailable === true){
//Show BiometricQueryView
}else{
console.log('Document not found')
}
}).catch(e =>{
console.log('Error', e);
});
}}>
<Text
onPress={() => Linking.openURL("https://biometricid.racsa.go.cr/terminoscondiciones")}
>
Ver términos y condiciones
</Text>
</DocumentQueryView>
BiometricQueryView¶
Este componente permite iniciar la verificación biometrica por reconocimiento facial o captura de huella según estén disponibles los metodos de validación para el documento consultado.
Info
A partir de esta vista se puede identificar el ID asociado a esta transacción.
const { dispatch } = useContext(BiometricIdStateContext);
const documentNumber = '123456';//Current document number suggested to pass as route paramaters
const { biometricVerification } = useBiometricQuery();
<BiometricQueryView
onFaceCaptured={() => {
console.log('Face captured');
}}
onFingerCaptured={(finger, fingerPrint) => {
console.log('Finger captured');
biometricVerification(finger, fingerPrint).then((biometricQueryResult) =>{
if(biometricQueryResult.hit){
//La huella obtenida de la persona pertenece al número de documento consultado
//Show BiometricResultView
}
else{
console.log(biometricQueryResult);
}
}).catch((e) =>{
console.log('Error', e);
});
}}
onFingerFailed={(error) => {
console.log('Finger failed', error);
}}
onfaceFailed={() => {
console.log('Face failed');
}}
documentNumber={documentNumber}
requestPermissionsMessage={{
title: 'BiometricId Camera Permission',
message:
'BiometricIdneeds access to your camera ' +
'so you can take fingerprints pictures.',
buttonNeutral: 'Ask Me Later',
buttonNegative: 'Cancel',
buttonPositive: 'OK',
}}>
</BiometricQueryView>
BiometricMatchView¶
Este componente permite mostrar el resultado de la verificación biometrica exitosa en un formato estandarizado.
<BiometricResultView onFinish={()=>{
console.log('onFinish')
//Acción a ser ejecutada al finalizar el contador de tiempo
}} onGetMoreInformation={()=>{
console.log('onGetMoreInformation')
//Acción a ser ejecutada al oprimir el botón de más información
//Paso suguerido:
//Mostrar fuentes adicionales disponibles
}}>
</BiometricResultView>
ExternalQueryView¶
Este componente permite mostrar el resultado de consultas de bases de datos externas
<ExternalSourceView />
Hooks¶
useDocumentTypesAvailable¶
- documentTypesQuery
Metodo que ejecuta la consulta de tipos de documento disponibles
useDocumentQuery¶
- documentQuery
Metodo que ejecuta la consulta de tipos de documento disponibles
- isRunningApiQuery
Booleana que indica si hay una petición al api ejecutandose
- documentQueryViewModel
Modelo usado por el componente, para definir tipo de documento, número de documento y email
- setDocumentQueryViewModel
Metodo que permite actualizar el documentQueryViewModel
useBiometricQuery¶
- biometricQueryResult
Modelo donde se almacena el resultado de la consulta
- isRunningApiQuery
Booleana que indica si hay una petición al api ejecutandose
- biometricVerification
Metodo que ejecuta la consulta biometrica, debe ejecutarse después de obtener la huella o la foto de la persona
Biometric ID - Lectores USB - Instaladores¶
Futronic Instalador
1. Descargar el instalador.
2. Descomprimir y ejecutar el archivo que se encuentra dentro de la carpeta descomprimida en Setup\Setup_FtrScanHttpServer.msi
3. Reiniciar el equipo.
Digitalpersona Instalador
1. Descargar el instalador.
2. Descomprimir y ejecutar el archivo que se encuentra dentro de la carpeta descomprimida en SDK\x64\setup.exe
3. Reiniciar el equipo
Workaround - Local network access restrictions¶
Desde Chrome 142 se habilitó una carácteristica que bloquea el acceso a redes locales. Ver https://chromestatus.com/feature/5152728072060928
Esto bloquea el acceso a los SDK de huella, por lo que debe deshabilitarse este feature mientras se reciben actualizaciones del fabricante.
edge://flags/#local-network-access-check
chrome://flags/#local-network-access-check