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:

  1. Recepción del pedido

  2. Búsqueda de información de la compra

  3. Transformación de los datos

  4. Procesamiento del pago

  5. Actualización del estado

  6. Respuesta final

Diagram

https diagrama

Descripción de los steps

A continuación, se detalla la descripción de los steps ejecutados:

  1. 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}
  2. 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}'
  3. 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 el classpath (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))
      }
    • Consulte cómo crear un archivo en la carpeta Resources.

  4. 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) y Authorization (con un token de ejemplo). Luego, se realiza una solicitud POST 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}'
  5. 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 el classpath (extracto arriba).

    • A continuación, se muestra el contenido del archivo statusPayload.jsonata:

      {
          "ClientID": ClientID,
          "Status":status.status
      }
    • Consulte cómo crear un archivo en la carpeta Resources.

  6. 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.
Thanks for your feedback!
EDIT

Share your suggestions with us!
Click here and then [+ Submit idea]