Pular para o conteúdo principal

Exemplo de Integração com a FedEx

Neste tutorial, vamos mostrar como integrar a FedEx.

1. Preparação

1.1. Crie uma conta na FedEx

Crie uma conta no portal do desenvolvedor.

1.2. Crie projetos e obtenha tokens

Crie 2 projetos na seção meus projetos e salve o ID do cliente e o segredo do cliente.

O primeiro projeto é para gerenciar envios.

O segundo projeto é para rastrear envios.

1.3. Crie status para entrega

Na aba de status de armazenamento de pedidos crie status:

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

1.4. Crie um evento para rastrear status

No módulo Eventos, crie um evento para rastrear a mudança de status do pedido order_delivery.

IMG2

1.5. Crie uma coleção para entrega

No módulo Coleções de Integração, crie uma coleção para entrega com os seguintes atributos:

  • name (string)
  • address (string)
  • phone_number (string)
  • city (string)
  • state_code (string)
  • postal_code (string)
  • country_code (string)
  • tracking_number (string)
  • transaction_id (string)
  • ship_datestamp (string)
  • delivery_datestamp (string)

IMG2

1.6. Crie um pedido de teste

Crie um pedido e um registro na coleção para este pedido.

IMG2

IMG2

2. Criando um Envio

2.1. Rastreando o evento de entrega

  • Arraste o nó eventos para o espaço de trabalho.
  • Insira o nome do nó.
  • Altere o valor no campo "Definir" para "orderEvent".
  • O evento será salvo no objeto "msg.orderEvent" e pode ser usado em outros nós.
  • Selecione o evento criado "entrega do pedido" na lista e clique em "enviar".

IMG2


2.2. Obtendo um token

  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".
  • Substitua YOUR_CLIENT_ID e YOUR_CLIENT_SECRET pelos seus próprios.

IMG2

msg.payload = {
'grant_type': 'client_credentials',
'client_id': 'YOUR_CLIENT_ID',
'client_secret': 'YOUR_CLIENT_SECRET'
}
msg.headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}

return msg;

Você pode encontrar mais sobre os parâmetros na documentação da FedEx.


  • Arraste o nó solicitação http para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "POST" no campo Método.
  • Selecione "Enviar como corpo da solicitação" no campo Dados.
  • Cole o link https://apis-sandbox.fedex.com/oauth/token no campo Link.
  • Selecione "Objeto JSON" no campo Retorno.

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. Criando um envio

  • Arraste o nó admin-api para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "Recebendo todos os registros pertencentes à coleção" e cole o código abaixo no campo "Dados".
{
"entityType": "orders",
"entityId": "{{orderEvent.order.id}}",
"langCode": "en_US",
"offset": 0,
"limit": 1,
"marker": "delivery"
}

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

// obter o token salvo anteriormente
const token = msg.access_token;

// definir os cabeçalhos
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};

// obter coleções da etapa anterior
const collection = msg.payload.items[0];
// converter o array em um objeto
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// definir parâmetros do destinatário a partir do formulário
const recipient = {
"address": {
"streetLines": [
formData.address
],
"city": formData.city,
"stateOrProvinceCode": formData.state_code,
"postalCode": formData.postal_code,
"countryCode": formData.country_code
},
"contact": {
"personName": formData.name,
"phoneNumber": formData.phone_number
}
}
// definir dados da coleção em msg para uso futuro
msg.collection = collection;
// definir parâmetros de solicitação para a FedEx
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "NOME DO REMETENTE",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"ENDEREÇO DO REMETENTE 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
},
"recipients": [
recipient
],
"serviceType": "STANDARD_OVERNIGHT",
"packagingType": "SUA EMBALAGEM",
"pickupType": "DROPOFF_AT_FEDEX_LOCATION",
"shippingChargesPayment": {
"paymentType": "SENDER",
"payor": {
"responsibleParty": {
"accountNumber": {
"value": "510087020",
"key": ""
}
},
"address": {
"streetLines": [
"ENDEREÇO DO REMETENTE 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
}
},
"labelSpecification": {},
"requestedPackageLineItems": [
{
"customerReferences": [
{
"customerReferenceType": "CUSTOMER_REFERENCE",
"value": `Collection${collection.id}`
}
],
"weight": {
"units": "LB",
"value": "20"
}
}
]
}
};

return msg;

Você pode encontrar mais sobre os parâmetros na documentação da FedEx.


  • Arraste o nó solicitação http para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "POST" no campo Método.
  • Selecione "Enviar como corpo da solicitação" no campo Dados.
  • Cole o link https://apis-sandbox.fedex.com/ship/v1/shipments no campo Link.
  • Selecione "Objeto JSON" no campo Retorno.

IMG2


  • Arraste o nó debug para o espaço de trabalho e conecte-o ao nó da etapa anterior.

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

// obter dados do envio
const shipment = msg.payload.output.transactionShipments[0];
// obter os dados da coleção salvos anteriormente
const collection = msg.collection;

// escrever dados do envio nos atributos do formulário
const newFormData = [
...collection.formData
.filter(item => !['transaction_id', 'ship_datestamp', 'delivery_datestamp', 'tracking_number'].includes(item.marker)),
{
marker: 'transaction_id',
value: msg.payload.transactionId,
type: 'string'
},
{
marker: 'ship_datestamp',
value: shipment.shipDatestamp,
type: 'string'
},
{
marker: 'delivery_datestamp',
value: shipment.pieceResponses[0].deliveryDatestamp,
type: 'string'
},
{
marker: 'tracking_number',
value: shipment.masterTrackingNumber,
type: 'string'
}
]

// definir parâmetros para atualizar a coleção
msg.params = {
langCode: 'en_US',
id: collection.id,
marker: 'delivery'
}

msg.data = {
formIdentifier: 'delivery_form',
formData: {
en_US: newFormData
},
entityId: collection.entityId,
entityType: collection.entityType
}

// salvar dados da coleção para uso futuro
msg.collection = collection;

return msg;

  • Arraste o nó admin-api para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "Alterando um registro na coleção".

IMG2


2.4. Atualizando o status do pedido

  • Arraste o nó admin-api para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "Atualizando o status de um pedido pertencente ao objeto de armazenamento de pedidos".
  • Cole o código abaixo no campo "Parâmetros de consulta".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
  • Cole o código abaixo no campo "Corpo da solicitação".
{
"statusIdentifier": "order_delivery_started"
}

IMG2


  • Arraste o nó debug para o espaço de trabalho e conecte-o ao nó da etapa anterior.

IMG2


3. Rastreando o Status do Envio

3.1. Recuperando pedidos para rastreamento

  • Arraste o nó intervalo para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Insira o intervalo em minutos.

IMG2


  • Arraste o nó admin-api para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "Recebendo todos os pedidos pertencentes ao objeto de armazenamento de pedidos".
  • Cole o código abaixo no campo "Parâmetros de consulta".
{
"statusIdentifier": "order_delivery_started",
"langCode": "en_US",
"offset": 0,
"limit": 100,
"id": 1
}

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

msg.payload = msg.payload.items;

return msg;

  • Arraste o nó dividir para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Insira o comprimento.

IMG2


  • Arraste o nó admin-api para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "Recebendo todos os registros pertencentes à coleção".
  • Cole o código abaixo no campo "Parâmetros de consulta".
{
"marker": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

msg.payload = msg.payload.items[0]

return msg;

  • Arraste o nó switch para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Adicione uma regra para verificação. Selecione a condição "não vazio".

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

msg.trackingNumber = msg.payload
.formData
.find(item => item.marker === 'tracking_number')
.value;

msg.collection = msg.payload;

return msg;

3.2. Obtendo um token

  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".
  • Substitua YOUR_CLIENT_ID e YOUR_CLIENT_SECRET pelos seus próprios.

IMG2

msg.payload = {
'grant_type': 'client_credentials',
'client_id': 'YOUR_CLIENT_ID',
'client_secret': 'YOUR_CLIENT_SECRET'
}
msg.headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}

return msg;

Você pode encontrar mais sobre os parâmetros na documentação da FedEx.


  • Arraste o nó solicitação http para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "POST" no campo Método.
  • Selecione "Enviar como corpo da solicitação" no campo Dados.
  • Cole o link https://apis-sandbox.fedex.com/oauth/token no campo Link.
  • Selecione "Objeto JSON" no campo Retorno.

IMG2


3.3. Recuperando o status do envio

  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

const token = msg.payload.access_token;

msg.headers = {
'content-type': 'application/json',
'authorization': `Bearer ${token}`
};

msg.payload = {
"trackingInfo": [
{
"trackingNumberInfo": {
"trackingNumber": msg.trackingNumber
}
}
],
"includeDetailedScans": true
}

return msg;

Você pode encontrar mais sobre os parâmetros na documentação da FedEx.


  • Arraste o nó solicitação http para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "POST" no campo Método.
  • Selecione "Enviar como corpo da solicitação" no campo Dados.
  • Cole o link https://apis-sandbox.fedex.com/track/v1/trackingnumbers no campo Link.
  • Selecione "Objeto JSON" no campo Retorno.

IMG2


  • Arraste o nó função para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Cole o código do exemplo no campo "Função".

IMG2

msg.payload = msg.payload.output.completeTrackResults[0].trackResults[0].latestStatusDetail.statusByLocale;

return msg;

3.4. Atualizando o status do pedido

  • Arraste o nó switch para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Adicione uma regra para verificação. Selecione a condição "==", e insira "Pronto para retirada" como o valor.

IMG2


  • Arraste o nó admin-api para o espaço de trabalho e conecte-o ao nó da etapa anterior.
  • Selecione "Atualizando o status de um pedido pertencente ao objeto de armazenamento de pedidos".
  • Cole o código abaixo no campo "Parâmetros de consulta".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
  • Cole o código abaixo no campo "Corpo da solicitação".
{
"statusIdentifier": "ready_for_pickup"
}

IMG2


  • Arraste o nó debug para o espaço de trabalho e conecte-o ao nó da etapa anterior.

IMG2.