# Introducción a la Validación de Centavos

La validación de centavos es un método que Belvo utiliza para confirmar que una cuenta bancaria existe y es propiedad de un individuo o entidad específica.

```mermaid
sequenceDiagram
    autonumber
    participant Client as Cliente
    participant Belvo as Belvo
    participant Provider as Proveedor

    Client->>Belvo: Crear un cliente
    Belvo-->>Client: 201 - Cliente Creado
    Client->>Belvo: Crear un método de pago
    Belvo-->>Client: 201 - Método de Pago Creado
    Belvo->>Provider: Enviar "centavo" a la cuenta bancaria registrada
    Provider-->>Belvo: CEP generado
    rect rgba(0, 0, 0, .03)
        Note over Client,Provider: Belvo valida la información en el CEP contra la información proporcionada al crear el cliente
        Note over Client,Provider: Belvo actualiza el estado del Método de Pago
    end
    Belvo-->>Client: Belvo envía el estado del Método de Pago
```

El flujo general de la validación de centavos de Belvo es:

1. Creas un cliente y un método de pago.
2. Belvo envía un “centavo” utilizando SPEI a la cuenta especificada cuando creaste el método de pago.
3. Se genera un Comprobante Electrónico de Pago (CEP) para la transacción y Belvo recupera los datos del documento.
4. Belvo compara la información del propietario del CEP con la información que proporcionaste al crear el cliente para verificar la cuenta dada.


## Validación de centavo para Métodos de Pago (API)

1. Creas un cliente.
2. Creas un Método de Pago para el cliente.
3. El estado del Método de Pago se establece en `pending_agreement_acceptance`.
4. Una vez que se acepta el acuerdo, el estado del Método de Pago se establece en `pending_validation`.
5. Belvo envía el "centavo" a la cuenta registrada en el Paso 2.
6. Se genera un Comprobante Electrónico de Pago (CEP) para la transacción y Belvo recupera los datos del documento.
7. Belvo compara el `documentType` y `documentNumber` proporcionados en el Paso 1 con la información proporcionada en el CEP.
  1. Si la información es la misma, el estado del Método de Pago se establece en `active`. Recibes el webhook `payment_method_registration_successful` con la siguiente información:

```json Penny Validation Success
{
  "eventType": "payment_method_update",
  "eventCode": "payment_method_registration_successful",
  "datetime": "2022-01-01T12:34:56.789Z",
  "details": {
    "id": "3118128a-6792-4b06-bd61-4acf6f6ad6b5",
    "reference": "your_reference_here",
    "status": "active",
    "failedReason": null,
    "failedMessage": null,
    "cep": {
      "name": "Juan Perez",
      "document": "PELJ900101ABC",
      "url": "https://example.com/cep/3118128a-6792-4b06-bd61-4acf6f6ad6b5.pdf",
      "accountType": "savings",
      "bank": "mx_bancoppel",
      "accountNumber": "012345678901234567"
    }
  }
}
```
  2. Si la información no es la misma, el estado del Método de Pago se establece en `error`. Recibes el webhook `payment_method_registration_failed` con la siguiente información de error:

```json Penny Validation Error
{
  "eventType": "payment_method_update",
  "eventCode": "payment_method_registration_failed",
  "datetime": "2022-01-01T12:34:56.789Z",
  "details": {
    "id": "3118128a-6792-4b06-bd61-4acf6f6ad6b5",
    "reference": "your_reference_here",
    "status": "error",
    "failedReason": "account_validation_failed",
    "failedMessage": "Account owner validation was not successful",
    "cep": {
      "name": "Juan Perez",
      "document": "PELJ900101ABC",
      "url": "https://example.com/cep/3118128a-6792-4b06-bd61-4acf6f6ad6b5.pdf",
      "accountType": "savings",
      "bank": "mx_bancoppel",
      "accountNumber": "012345678901234567"
    }
  }
}
```


Cuando están disponibles, ambos webhooks pueden incluir un objeto `cep` opcional en `details`. Este objeto contiene los datos del CEP que Belvo recuperó durante la validación de centavo: `name` (nombre del titular de la cuenta), `document` (RFC del titular de la cuenta), `url` (URL del documento CEP), `accountType` (tipo de cuenta del beneficiario), `bank` (institución contraparte) y `accountNumber` (número de cuenta del beneficiario).

## Validación de Penny usando Importaciones por Lote

1. Envías tu CSV para Importación Masiva de Pagos por Débito Directo.
2. Si es necesario, Belvo crea los clientes asociados para cada fila en tu CSV.
3. Belvo crea un Método de Pago para cada nuevo cliente (es decir, para cualquier cliente que no estaba previamente registrado con la misma información).
4. El estado del Método de Pago se establece en `pending_validation`.
5. Belvo envía el “penny" a la cuenta registrada en el Paso 3.
6. Se genera un Comprobante Electrónico de Pago (CEP) para la transacción y Belvo recupera los datos del documento.
7. Belvo compara el `documentType` y `documentNumber` proporcionados al crear el cliente con la información proporcionada en el CEP.
  1. Si la información es la misma, el estado del Método de Pago se establece en `active`.
  2. Si la información no es la misma, el estado del Método de Pago se establece en `failed`. En nuestra interfaz, verás la razón del fallo (`validation_failed`) junto con un mensaje detallando la razón detrás del fallo (`Account owner validation was not successful`).


## **Solicitudes de Pago con Métodos de Pago Adhoc**

1. Creas un cliente (ver referencia de la API).
2. Creas una Solicitud de Pago con un Método de Pago Adhoc para el cliente (ver referencia de la API).
3. El estado de la Solicitud de Pago se establece en `pending_validation`.
4. Belvo envía el “centavo" a la cuenta registrada en el Paso 2.
5. Se genera un Comprobante Electrónico de Pago (CEP) para la transacción y Belvo recupera los datos del documento.
6. Belvo compara el `documentType` y `documentNumber` proporcionados en el Paso 1 con la información proporcionada en el CEP.
  1. Si la información es la misma, el estado de la Solicitud de Pago se establece en `initial`.
  2. Si la información no es la misma, el estado de la Solicitud de Pago se establece en `failed`. Recibirás un webhook `payment_request_failed` con la siguiente información de fallo:

```json
{
  "eventType": "payment_request_update",
  "eventCode": "payment_request_failed",
  "datetime": "2022-01-01T12:34:56.789Z",
  "details": {
    "id": "3118128a-6792-4b06-bd61-4acf6f6ad6b5", // El paymentRequestId
    "reference": "your_reference_here",
    "status": "failed",
    "failedReason": "account_validation_failed",
    "failedMessage": "La validación del propietario de la cuenta no fue exitosa"
  }
}
```


-->