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:
- 
Recebimento do pedido
 - 
Busca de informações da compra
 - 
Transformação dos dados
 - 
Processamento do pagamento
 - 
Atualização do status
 - 
Resposta final
 
Descrição dos steps
Confira abaixo a descrição dos steps:
- 
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} - 
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}' - 
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.jsonataestá referenciado no script do fluxo junto aoclasspath(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.
 
 - 
 - 
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) eAuthorization(com um token de exemplo) são configurados. Em seguida, é feita uma requisiçãoPOSTpara 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}' - 
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
POSTpara 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.jsonataestá referenciado no script do fluxo junto aoclasspath(trecho acima). - 
Veja abaixo o conteúdo do arquivo
statusPayload.jsonata:{ "ClientID": ClientID, "Status":status.status } - 
Consulte como criar um arquivo na pasta Resources.
 
 - 
 - 
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. | 
Share your suggestions with us!
          Click here and then [+ Submit idea] 
