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
POSTse 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
GETse 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.jsonataestá 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 solicitudPOSTal 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
POSTal 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.jsonataestá 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]
