Notificaciones
Las notificaciones son enviadas cada vez que:
- se realiza un cambio de estado de una Transacción, Suscripción o Autorización
- se produce un error al intentar confirmar una Transacción, Suscripción o Autorización
- se genera o no un nuevo pago después de un charge a una Autorización
- se genera o no un nuevo pago debido a una Suscripción
- se realizan acciones sobre un Pago
Se envía una notificación POST
a la url definida en el campo notify_url
que se envió en el momento de la creación de dicho objeto.
Gracias a que la url de notificación se define al crear el objeto (Transaction, Subscription o Authorization), en el campo
notify_url
, la url puede ser dinámica pudiendo ser diferente para cada objeto creado.
Contenido de la notificación
La notificación consiste en un POST que envía un JSON con los siguientes campos:
signature
: Firma de la notificación, para validar que la notificación es enviada por ZRU. Ver más adelante como calcular la firma.fail
: En el caso de que este campo incluya contenido nos referimos a una notificación de error. El contenido sería un código de error, los cuales podemos ver aquí.id
: ID de la Transacción, Suscripción o Autorización relacionada con la notificación.type
: Tipo de objeto relacionado con la notificación (P - Transacción, S - Suscripción, A - Autorización).order_id
: Incluye el contenido enviado en el campoorder_id
al crear el objeto.status
: Estado de la transacción (P - Pendiente, D - Completado, C - Cancelado, E - Expirado).
Los estados Completado, Cancelado y Expirado son estados finales.
subscription_status
: Estado de la Suscripción, solo se envía si la notificación es relacionada con una suscripción (W - En Espera, A - Activa, P - Pausada, S - Parada).
El estado Parada es un estado final.
authorization_status
: Estado de la Autorización, solo se envía si la notificación es relacionada con una autorización (A - Activa, R - Eliminada).
El estado Eliminada es un estado final.
amount
: Cantidad cobrada al cliente.sale_id
: En el caso de que se haya cobrado al cliente incluirá el ID del Sale relacionado con el pago.action
: Última acción del objeto, ver más adelante posibles opciones.sale_action
: Última acción del Sale, ver más adelante posibles opciones._extra
: Incluye el contenido enviado en el campoextra
al crear el objeto o al realizar un charge. No se envía en el caso de que no se haya enviado._charge_id
: Incluye el contenido enviado en el campocharge_id
al realizar un charge._method
: En el caso de pagos con tarjeta incluye la información de la tarjeta utilizada, ver más adelante campos que incluye.
Es importante tened en cuenta al realizar la implementación que en cualquier momento puede añadirse un nuevo campo al JSON recibido.
Posibles valores del campo action
- I: Error
- D: Completado
- E: Expirado
- C: Cancelado
- A: Suscripción Activa (solo en el caso de suscripción)
- T: Suscripción Iniciada (solo en el caso de suscripción)
- P: Suscripción Pausada (solo en el caso de suscripción)
- S: Suscripción Parada (solo en el caso de suscripción)
- R: Autorización Eliminada (solo en el caso de autorización)
- Y: Pago recibido (solo en el caso de suscripción o autorización)
Posibles valores del campo sale_action
- I: Error
- G: Cantidad cobrada
- H: Cantidad en hold
- V: Cantidad liberada
- C: Cantidad capturada
- R: Cantidad devuelta
- S: Cantidad liquidada
- E: Cantidad en escrow rechazada
Valores del campo _method
name
: Nombre de la tarjetamasked
: Número de tarjeta enmascaradaunique_hash
: Hash que representa a la tarjeta de manera única. Siempre que un cliente utilice el mismo número de tarjeta y la misma fecha de expiración recibirán el mismo hash.brand
: Marca de la tarjetaexpiration_month
: Mes de expiración de la tarjetaexpiration_year
: Año de expiración de la tarjeta
Calcular la firma
Los pasos para calcular la firma y verificar que es correcta son los siguientes:
Partimos del diccionario JSON recibido e ignoramos los keys:
fail
signature
- cualquier otro que empiece por
_
El resto de keys del JSON los ordenamos por orden alfabético, por ejemplo:
['action', 'amount', 'authorization_status', 'id', 'order_id', 'sale_action', 'sale_id', 'status', 'subscription_status', 'type']
Por ese orden ponemos los valores uno detrás de otro en una variable ignorando los que sean null, reemplazando en los valores los símbolos <, >, ", ', (, ), \ por espacio y quitando los espacios del inicio y del final de cada valor, por ejemplo:
D5.0d825c974-7288-4ddf-ae8b-21635c44eac3323232G545b8519-3e3c-4ee7-adef-9da7eefe5283DP
A eso le agregamos al final la Clave Secreta de vuestro entorno, por ejemplo:
D5.0d825c974-7288-4ddf-ae8b-21635c44eac3323232G545b8519-3e3c-4ee7-adef-9da7eefe5283DP18754581c5434008b9262dd5a6938ed3
Finalmente le hacemos sha256 a esa variable y obtendríamos el signature para comprobarlo con el recibido en el JSON, por ejemplo:
783600a129c93cad54f561bca60e60c9b8dc328209841751a600a5e1c941ccee
Flujo de notificaciones más importantes
Aquí vamos a distinguir los flujos de notificación más importantes en dependencia del tipo de objeto:
Transacción (Transaction)
- Notificación de error mientras el cliente intenta confirmar y le falla, verificar código de error en el campo
fail
. - Notificación única de cancelación (
status=C
). - Notificación única de expiración (
status=E
). - Notificación única de transacción completada (
status=D
) que incluye en el camposale_id
el id del Pago. - Resto de notificaciones posibles siempre serán relacionadas con el pago.
- Notificación de error mientras el cliente intenta confirmar y le falla, verificar código de error en el campo
Suscripción (Subscription)
- Notificación de error mientras el cliente intenta confirmar y le falla o se intenta realizar un cobro a una suscripción activa (en este último caso el
status=D
), verificar código de error en el campofail
. - Notificación única de cancelación (
status=C
). - Notificación única de expiración (
status=E
). - Notificación única de suscripción completada (
status=D
), no incluyesale_id
. - Notificación de pago recibido, incluye en el campo
sale_id
el id del Pago. Se lanza la primera vez si incluye un cobro el confirmar la suscripción y cada vez que se realice un cobro correcto a dicha suscripción. - Resto de notificaciones posibles siempre serán relacionadas con los pagos de la suscripción.
- Notificación de error mientras el cliente intenta confirmar y le falla o se intenta realizar un cobro a una suscripción activa (en este último caso el
Autorización (Authorization)
- Notificación de error mientras el cliente intenta confirmar y le falla o se intenta realizar un cobro a una autorización activa (en este último caso el
status=D
), verificar código de error en el campofail
. - Notificación única de cancelación (
status=C
). - Notificación única de expiración (
status=E
). - Notificación única de autorización completada (
status=D
), no incluyesale_id
. - Notificación de pago recibido, incluye en el campo
sale_id
el id del Pago. Se lanza la primera vez si incluye un cobro el confirmar la autorización y cada vez que se realice un cobro correcto a dicha autorización utilizando el endpoint decharge
. - Resto de notificaciones posibles siempre serán relacionadas con los pagos de la autorización.
- Notificación de error mientras el cliente intenta confirmar y le falla o se intenta realizar un cobro a una autorización activa (en este último caso el
Pago (Sale)
- Estas notificaciones siempre incluyen en el campo
id
el objeto relacionado con el pago y elstatus=D
. - Notificación de error de cualquier acción realizada al sale, como devolución, liberación, etc, verificar código de error en el campo
fail
. - Notificación de captura, puede ser parcial, verificar campo
amount
(sale_action=C
). - Notificación de liberación, puede ser parcial, verificar campo
amount
(sale_action=V
). - Notificación de devolución, puede ser parcial, verificar campo
amount
(sale_action=R
). - Notificación de liquidación (
sale_action=S
).
- Estas notificaciones siempre incluyen en el campo
Panel
En el Panel podemos ver las notificaciones enviadas por ZRU en tiempo real desde la sección Desarrolladores / Notificaciones y también podemos reenviarlas seleccionando la notificación y dando click en el botón Volver a enviar.