Eventos de los webhooks

Hola, buena tarde. Al registrar un webhook podemos indicar los eventos de los que queremos ser notificados. El endpoint de transactions que regresa el evento refresh viene como:
“/v1/transactions?id_credential=ID_CREDENTIAL&limit=5000&skip=0”.

el endpoint vendrá solamente con el id_credential o este vendrá también con el id_transaction para poderlo ubicar? También se notificará de una transacción a la vez por request?

Hola buenas tardes Javier, el evento refresh te notifica cuando hay nuevas Cuentas y Transacciones.

El mensaje que recibes es algo como esto:

{
    "endpoints": {
        "accounts": [
            "/v1/accounts?id_credential=ID_CREDENTIAL&limit=5000&skip=0"
        ], 
        "credential": [
            "/v1/credentials/ID_CREDENTIAL"
        ], 
        "transactions": [
            "/v1/transactions?id_credential=ID_CREDENTIAL&limit=5000&skip=0"
        ]
    }, 
    "event": "refresh", 
    "id_credential": "ID_CREDENTIAL", 
    "id_external": null, 
    "id_job": "ID_JOB", 
    "id_job_uuid": "ID_JOB_UUID", 
    "id_site": "ID_SITE", 
    "id_site_organization": "ID_SITE_ORGANIZATION", 
    "id_site_organization_type": "ID_SITE_ORGANIZATION_TYPE", 
    "id_user": "ID_USER"
}

Como puedes ver, el mensaje ya trae construidas las peticiones para obtener los objetos de interés (Credentials, Accounts, Transactions) e incluso vienen paginados para que sólo consumas mediante la iteración de cada arreglo. Una vez que consumas las peticiones de transactions obtendrás cada una de las Transacciones nuevas con su respectivo ID.
En el siguiente link verás un ejemplo de ésto que trato de describir implementado en Python con Flask: https://github.com/Paybook/code-samples/blob/master/webhooks/code/python/main_webhook.py

Tal vez te llame la atención que en el ejemplo no se hacen las peticiones con un token de sesión, la razón es que por lo general todo el proceso se trabaja en el back-end por lo tanto sugerimos que en lugar de crear un token de sesión envíes API_KEY e ID_USER siguiendo prácticas de seguridad descritas aquí: Mejores prácticas para la implementación de Sync

Espero haber resuelto tu duda.

Entonces en el caso de refresh no se indicarián cuales son las nuevas transacciónes? Solamente a que account y credential pertenecen (por lo que veo las peticiones regresarían todas las transacciones de una credencial). Lo que me intriga es como identificar las nuevas transacciones

Hola Javier buenas tardes

El evento “refresh” notifica transacciones nuevas y transacciones actualizadas recientemente. Para las transacciones nuevas creo que se entiende perfectamente. Las transacciones actualizadas recientemente se pueden ejemplificar de la siguiente manera:

  • En el caso de transacciones del SAT a veces los archivos adjuntos tardan más tiempo en bajarse (problemas de red, timeouts, etc), entonces el webhook avisaria cuando se baja la transacción y cuando el adjunto este listo notificaria de nuevo.
  • Algunos bancos reportan una transacción con una descripción hoy, pero pasa un periodo de tiempo y la descripción cambia. Entonces el webhook te notificaría que algo cambio (en este caso la descripción).

Lo que hace el webhook es identificar si esa cuenta ha sido actualizada o no.


Cuentas Nuevas

En el caso de las cuentas nuevas lo que hace es reportar un arreglo para accounts, transactions y attachments en donde se generan todos los llamados que se necesitaría para hacer la replica inicial. En el ejemplo que mencionas solo te regreso un llamado, supongo que existen menos de 5000 transacciones en esa credencial por eso solo existe un solo llamado.

Pero supongamos que la credencial hubiera tenido 6,000 transacciones, entonces hubieras visto dos llamados:

transactions: [
  '/v1/transactions?id_credential=...&limit=5000&skip=0',
  '/v1/transactions?id_credential=...&limit=5000&skip=5000'
]

Con estos dos llamados obtendrías todas las transacciones que estuvieran registradas en ese momento.


Cuentas Registradas

Si la cuenta no es nueva entonces los llamados tendrán un campo adicional dt_refresh_from y dt_refresh_to, para indicar en qué fecha buscar.

transactions: [
  '/v1/transactions?id_credential=...&dt_refresh_from=xxxxx&dt_refresh_to=yyyyy&limit=5000&skip=0',
  '/v1/transactions?id_credential=...&dt_refresh_from=xxxxx&dt_refresh_to=yyyyy&limit=5000&skip=5000'
]

La idea es que ese llamado o llamados te regresen los datos nuevos o los que han sido actualizado recientemente, estos llamados pueden representar N registros. Puede ser 1 transacción o 100,000 transacciones representado en multiples llamados.

Internamente el campo dt_refresh se va incrementando en automático, y el webhook lo va reportando en base a como se va actualizando los datos a través del tiempo.


Para identifcar si la transacción es nueva puedes guardar el id_transaction en tu base de datos y comprobar si se necesita actualizar o agregar.

Gracias,
Saludos.

2 Me gusta

Hola, estoy retomando un proyecto sobre este tema y me surgió una duda más. El evento refresh regresa todas las transacciones y cuentas de una credencial, supongo a manera de ejemplo. Mi pregunta es ¿En el ambiente de producción, se mandará una notifiación por cuenta bancaria (con todas las nuevas transacciónes de esta)? o ¿Podrá llegar una notificación con 4 cuentas diferentes, y todas las transacciónes de estas?

Hola Javier buenos días

Los webhooks se agrupan por credencial, y solo debería entregar información de lo que ha cambiado (actualizado o agregado).

Por ejemplo:
Tenemos la credencial X, y esta tiene 3 cuentas A, B y C.

Si después de una ejecución la cuenta A tiene nuevas transacciones, entonces ese webhook tendrá como obtener solo esa cuenta y sus transacciones que fueron agregados o modificados.

Me llama la atención que comentas que “regresa todas las transacciones”, esto es cierto cuando es una credencial nueva , si sucede en otro caso sería cuestión de revisarlo.

Otro punto que es bueno que lo tengas en mente (por el momento solo aplica para credenciales del SAT), es que si existe más de un webhook por credencial, la información se agrupara y se enviara a los 5 minutos. El primero se envía al instante, y cualquier otro de la misma ejecución se enviara a los 5 minutos. El propósito es no saturar de peticiones.

Gracias,
Saludos.

2 Me gusta