HTTPS y JSONata: Gestión de Pagos
Caso de uso
En el contexto de una compra en un comercio electrónico, considere una integración que gestiona el procesamiento de pagos a través de las siguientes etapas:
-
Recepción del pedido
-
Búsqueda de información de la compra
-
Transformación de los datos
-
Procesamiento del pago
-
Actualización del estado
-
Respuesta final
Descripción de los steps
A continuación, se detalla la descripción de los steps ejecutados:
-
Recepción del pedido: el flujo comienza cuando se recibe un pedido con un código de identificación (ClientID). La solicitud
POST
se envía al endpoint/simple
. La respuesta de la solicitud se registra en los logs.- from: uri: rest:post:/simple - setProperty: expression: simple: expression: ${header[ClientID]} name: "clientID" - log: message: ${exchangeProperty.clientID}
-
Búsqueda de información de la compra: con el ClientID, el sistema realiza una consulta a un servicio interno para obtener más detalles. La consulta
GET
se realiza en el endpoint de compras, pasando el ClientID como parámetro. La respuesta de la solicitud se registra en los logs.- toD: uri: https://{{URL}}/interno/compras parameters: bridgeEndpoint: true httpMethod: GET ClientID: '${exchangeProperty.clientID}' - log: message: 'COMPRAS - ${body}'
-
Transformación de los datos: la información recibida se procesa y formatea utilizando una herramienta de transformación, JSONata. La transformación aplicada se registra en los logs para verificación.
- to: uri: jsonata:classpath:extractTotal.jsonata parameters: inputType: JsonString - log: message: 'TRANSFORMACIÓN - ${body}'
-
Las instrucciones para crear un nuevo objeto JSON están en el archivo
extractTotal.jsonata
, disponible en la carpeta Resources. -
El archivo
extractTotal.jsonata
está referenciado en el script del flujo junto con elclasspath
(extracto arriba). -
A continuación, se muestra el contenido del archivo
extractTotal.jsonata
:{ "Cuenta": Cliente.Cuenta, "TipoPago": Cliente.TipoPago, "Valor": $sum(Cliente.Pedidos.Producto.(Precio * Cantidad)) }
-
-
Procesamiento del pago: los datos procesados se envían a un servicio externo para realizar el pago. Primero, el cuerpo del mensaje transformado se convierte al formato JSON, y se configuran los encabezados
Content-Type
(definido como application/json) yAuthorization
(con un token de ejemplo). Luego, se realiza una solicitudPOST
al endpoint de pagos. La respuesta recibida se registra en los logs.- marshal: json: library: Jackson - setHeader: expression: constant: expression: application/json name: Content-Type - setHeader: expression: constant: expression: 'Bearer tokenDeAutorizacionEjemplo' name: Authorization - toD: uri: https://{{URL}}/externo/pago parameters: bridgeEndpoint: true httpMethod: POST - log: message: 'PAGO - ${body}'
-
Actualización del estado: después del procesamiento del pago, el resultado se combina con el ClientID y se transforma nuevamente para actualizar el estado del pago en un servicio interno. El cuerpo del mensaje ajustado se convierte al formato JSON y se envía en una solicitud
POST
al endpoint de status.- setBody: expression: simple: expression: '{"ClientID": "${exchangeProperty.clientID}", "status":${body}}' - log: message: 'CONCATENAÇÃO - ${body}' - to: uri: jsonata:classpath:statusPayload.jsonata parameters: inputType: JsonString - log: message: 'STATUS PAYLOAD - ${body}' - marshal: json: library: Jackson - setHeader: expression: constant: expression: application/json name: Content-Type - toD: uri: https://{{URL}}/interno/status parameters: bridgeEndpoint: true httpMethod: POST
-
Las instrucciones para crear un nuevo objeto JSON están en el archivo
statusPayload.jsonata
, disponible en la carpeta Resources. -
El archivo
statusPayload.jsonata
está referenciado en el script del flujo junto con elclasspath
(extracto arriba). -
A continuación, se muestra el contenido del archivo
statusPayload.jsonata
:{ "ClientID": ClientID, "Status":status.status }
-
-
Respuesta final: el sistema envía una confirmación final para indicar que el pago fue exitoso. El código de respuesta HTTP se establece en
200
, y el cuerpo de la respuesta confirma el éxito de la operación. Además, se registra el contenido de la respuesta final en los logs.- setHeader: expression: constant: expression: "200" name: CamelHttpResponseCode - setBody: expression: simple: expression: '{"success": "true"}' - log: message: ${body}
Source Code
A continuación se muestra el script completo del flujo de integración:
- from:
uri: rest:post:/simple # Define un endpoint REST que recibe solicitudes POST en la ruta /simple
steps:
- setProperty:
expression:
simple:
expression: ${header[ClientID]} # Almacena el valor del encabezado 'ClientID' en una propiedad de intercambio llamada 'clientID'
name: "clientID"
- log:
message: ${exchangeProperty.clientID} # Registra el valor de la propiedad 'clientID' para depuración
- toD:
uri: https://{{URL}}/interno/compras # Realiza una solicitud GET al endpoint interno de compras
parameters:
bridgeEndpoint: true
httpMethod: GET
ClientID: '${exchangeProperty.clientID}' # Pasa el 'clientID' como parámetro en la solicitud
- log:
message: 'COMPRAS - ${body}' # Registra la respuesta de la solicitud de compras
- to:
uri: jsonata:classpath:extractTotal.jsonata # Procesa la respuesta usando una transformación JSONata para extraer el total
parameters:
inputType: JsonString
- log:
message: 'TRANSFORMACIÓN - ${body}' # Registra el resultado de la transformación JSONata
- marshal:
json:
library: Jackson # Convierte el cuerpo del mensaje a JSON usando Jackson
- setHeader:
expression:
constant:
expression: application/json # Establece el encabezado 'Content-Type' como 'application/json'
name: Content-Type
- setHeader:
expression:
constant:
expression: 'Bearer tokenDeAutorizacionEjemplo' # Establece el encabezado 'Authorization' con un token de ejemplo
name: Authorization
- toD:
uri: https://{{URL}}/externo/pago # Envía los datos al servicio externo de pago mediante POST
parameters:
bridgeEndpoint: true
httpMethod: POST
- log:
message: 'PAGO - ${body}' # Registra la respuesta del servicio de pago
- setBody:
expression:
simple:
expression: '{"ClientID": "${exchangeProperty.clientID}", "status":${body}}' # Construye un nuevo cuerpo JSON con 'clientID' y el estado del pago
- log:
message: 'CONCATENACIÓN - ${body}' # Registra el cuerpo del mensaje después de la concatenación
- to:
uri: jsonata:classpath:statusPayload.jsonata # Aplica una transformación JSONata para formatear el payload de estado
parameters:
inputType: JsonString
- log:
message: 'STATUS PAYLOAD - ${body}' # Registra el payload de estado generado
- marshal:
json:
library: Jackson # Convierte nuevamente a JSON
- setHeader:
expression:
constant:
expression: application/json # Establece nuevamente el encabezado 'Content-Type' como 'application/json'
name: Content-Type
- toD:
uri: https://{{URL}}/interno/status # Envía el estado procesado a un servicio interno
parameters:
bridgeEndpoint: true
httpMethod: POST
- setHeader:
expression:
constant:
expression: "200" # Establece el código de respuesta HTTP como 200 (OK)
name: CamelHttpResponseCode
- setBody:
expression:
simple:
expression: '{"success": "true"}' # Define la respuesta final de la API indicando éxito
- log:
message: ${body} # Registra la respuesta final
Los parámetros avanzados de EIPs y componentes aún no están disponibles en el formulario de configuración de los steps en la pestaña Diagram. Para agregarlos, use la pestaña Source Code. |
Share your suggestions with us!
Click here and then [+ Submit idea]