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.jsonata
está 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çãoPOST
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}'
-
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 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]