HTTPS e JSONata: Gerenciamento de Pagamentos

Caso de uso

No contexto de uma compra em um comércio eletrônico, considere uma integração que gerencia o processamento de pagamentos através das seguintes etapas:

  1. Recebimento do pedido

  2. Busca de informações da compra

  3. Transformação dos dados

  4. Processamento do pagamento

  5. Atualização do status

  6. Resposta final

Diagram

https diagrama

Descrição dos steps

Confira abaixo a descrição dos steps:

  1. Recebimento do pedido : o fluxo começa quando um pedido é recebido com um código de identificação (ClientID). A requisição POST é encaminhada para o endpoint /simple. A resposta recebida é registrada nos logs.

    - from:
        uri: rest:post:/simple
    - setProperty:
        expression:
          simple:
            expression: ${header[ClientID]}
        name: "clientID"
    - log:
        message: ${exchangeProperty.clientID}
  2. Busca de informações da compra: com o ClientID, o sistema faz uma consulta a um serviço interno para obter mais detalhes. A consulta GET é realizada em um endpoint de compras, passando o ClientID como parâmetro. A resposta da requisição é registrada nos logs.

    - toD:
        uri: https://{{URL}}/interno/compras
        parameters:
            bridgeEndpoint: true
            httpMethod: GET
            ClientID: '${exchangeProperty.clientID}'
    - log:
        message: 'COMPRAS - ${body}'
  3. Transformação dos dados: as informações recebidas são processadas e formatadas usando uma ferramenta de transformação, o JSONata. A transformação aplicada é registrada nos logs para verificação.

    - to:
        uri: jsonata:classpath:extractTotal.jsonata
        parameters:
           inputType: JsonString
    - log:
        message: 'TRANSFORMAÇÃO - ${body}'
    • As instruções para criar um novo objeto JSON estão no arquivo extractTotal.jsonata, disponível na pasta Resources.

    • O arquivo extractTotal.jsonata está referenciado no script do fluxo junto ao classpath(trecho acima).

    • Veja abaixo o conteúdo do arquivo extractTotal.jsonata:

      {
         "Conta": Cliente.Conta,
         "TipoPagamento": Cliente.TipoPagamento,
         "Valor": $sum(Cliente.Pedidos.Produto.(Preco * Quantidade))
      }
    • Consulte como criar um arquivo na pasta Resources.

  4. Processamento do pagamento: os dados processados são então enviados a um serviço externo para efetuar o pagamento. Primeiro, o corpo da mensagem transformada é convertido para o formato JSON, e os cabeçalhos Content-Type (definido como application/json) e Authorization (com um token de exemplo) são configurados. Em seguida, é feita uma requisição POST para o endpoint de pagamento. A resposta recebida é registrada nos logs.

    - marshal:
        json:
           library: Jackson
    - setHeader:
        expression:
          constant:
            expression: application/json
        name: Content-Type
    - setHeader:
        expression:
          constant:
            expression: 'Bearer tokenDeAutorizacaoExemplo'
        name: Authorization
    - toD:
        uri: https://{{URL}}/externo/pagamento
        parameters:
            bridgeEndpoint: true
            httpMethod: POST
    - log:
        message: 'PAGAMENTO - ${body}'
  5. Atualização do status: após o processamento do pagamento, o resultado é combinado com o ClientID e transformado novamente para atualizar o status do pagamento em um serviço interno. O corpo da mensagem ajustada é convertido para o formato JSON e enviado em uma requisição POST para um 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
    • As instruções para criar um novo objeto JSON estão no arquivo statusPayload.jsonata, disponível na pasta Resources.

    • O arquivo statusPayload.jsonata está referenciado no script do fluxo junto ao classpath(trecho acima).

    • Veja abaixo o conteúdo do arquivo statusPayload.jsonata:

      {
          "ClientID": ClientID,
          "Status":status.status
      }
    • Consulte como criar um arquivo na pasta Resources.

  6. Resposta final: o sistema envia uma confirmação final para indicar que o pagamento foi bem-sucedido. O código de resposta HTTP é definido como 200, e o corpo da resposta confirma o sucesso da operação. Além disso, o conteúdo da resposta final é registrado nos logs.

    - setHeader:
        expression:
          constant:
            expression: "200"
        name: CamelHttpResponseCode
    - setBody:
        expression:
          simple:
            expression: '{"success": "true"}'
    - log:
        message: ${body}

Source Code

Veja abaixo o script completo do fluxo de integração:

- from:
    uri: rest:post:/simple  # Define um endpoint REST que recebe requisições POST na rota /simple
    steps:
       - setProperty:
           expression:
             simple:
               expression: ${header[ClientID]}  # Armazena o valor do cabeçalho 'ClientID' em uma propriedade de troca chamada 'clientID'
           name: "clientID"
       - log:
          message: ${exchangeProperty.clientID}  # Registra o valor da propriedade 'clientID' para depuração
       - toD:
          uri: https://{{URL}}/interno/compras  # Faz uma requisição GET para o endpoint interno de compras
          parameters:
              bridgeEndpoint: true
              httpMethod: GET
              ClientID: '${exchangeProperty.clientID}'  # Passa o 'clientID' como parâmetro na requisição
       - log:
          message: 'COMPRAS - ${body}'  # Registra a resposta da requisição de compras
       - to:
            uri: jsonata:classpath:extractTotal.jsonata  # Processa a resposta usando uma transformação JSONata para extrair o total
            parameters:
               inputType: JsonString
       - log:
            message: 'TRANSFORMAÇÃO - ${body}'  # Registra o resultado da transformação JSONata
       - marshal:
            json:
               library: Jackson  # Converte o corpo da mensagem para JSON usando Jackson
       - setHeader:
            expression:
              constant:
                expression: application/json  # Define o cabeçalho 'Content-Type' como 'application/json'
            name: Content-Type
       - setHeader:
            expression:
              constant:
                expression: 'Bearer tokenDeAutorizacaoExemplo'  # Define o cabeçalho 'Authorization' com um token de exemplo
            name: Authorization
       - toD:
          uri: https://{{URL}}/externo/pagamento  # Envia os dados para o serviço externo de pagamento via POST
          parameters:
              bridgeEndpoint: true
              httpMethod: POST
       - log:
          message: 'PAGAMENTO - ${body}'  # Registra a resposta do serviço de pagamento
       - setBody:
          expression:
            simple:
              expression: '{"ClientID": "${exchangeProperty.clientID}", "status":${body}}'  # Constrói um novo corpo JSON com o 'clientID' e o status do pagamento
       - log:
          message: 'CONCATENAÇÃO - ${body}'  # Registra o corpo da mensagem após a concatenação
       - to:
            uri: jsonata:classpath:statusPayload.jsonata  # Aplica uma transformação JSONata para formatar o payload de status
            parameters:
               inputType: JsonString
       - log:
            message: 'STATUS PAYLOAD - ${body}'  # Registra o payload de status gerado
       - marshal:
            json:
               library: Jackson  # Converte novamente para JSON
       - setHeader:
            expression:
              constant:
                expression: application/json  # Define novamente o cabeçalho 'Content-Type' como 'application/json'
            name: Content-Type
       - toD:
          uri: https://{{URL}}/interno/status  # Envia o status processado para um serviço interno
          parameters:
              bridgeEndpoint: true
              httpMethod: POST
       - setHeader:
          expression:
            constant:
                expression: "200"  # Define o código de resposta HTTP como 200 (OK)
          name: CamelHttpResponseCode
       - setBody:
          expression:
            simple:
              expression: '{"success": "true"}'  # Define a resposta final da API indicando sucesso
       - log:
          message: ${body}  # Registra a resposta final
Os parâmetros avançados de EIPs e componentes ainda não estão disponíveis no formulário de configuração dos steps na aba Diagram. Para adicioná-los, use a aba Source Code.
Thanks for your feedback!
EDIT

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