Saltar al contenido principal

Ejemplo de Integración con FedEx

En este tutorial, te mostraremos cómo integrar FedEx.

1. Preparación

1.1. Crear una cuenta de FedEx

Crea una cuenta en el portal de desarrolladores.

1.2. Crear proyectos y obtener tokens

Crea 2 proyectos en la sección mis proyectos y guarda el id del cliente y el secreto del cliente.

El primer proyecto es para gestionar envíos.

El segundo proyecto es para rastrear envíos.

1.3. Crear estados para la entrega

En la pestaña de estado de almacenamiento de pedidos crear estados:

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

1.4. Crear un evento para rastrear estados

En el módulo Eventos, crea un evento para rastrear el cambio de estado del pedido order_delivery.

IMG2

1.5. Crear una colección para la entrega

En el módulo Colecciones de Integración, crea una colección para la entrega con los siguientes 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. Crear un pedido de prueba

Crea un pedido y un registro en la colección para este pedido.

IMG2

IMG2

2. Creando un Envío

2.1. Rastreando el evento de entrega

  • Arrastra el nodo eventos al espacio de trabajo.
  • Ingresa el nombre del nodo.
  • Cambia el valor en el campo "Establecer" a "orderEvent".
  • El evento se guardará en el objeto "msg.orderEvent" y se podrá usar en otros nodos.
  • Selecciona el evento creado "entrega del pedido" de la lista y haz clic en "enviar".

IMG2


2.2. Obtención de un token

  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".
  • Reemplaza YOUR_CLIENT_ID y YOUR_CLIENT_SECRET con los tuyos.

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;

Puedes encontrar más sobre los parámetros en la documentación de FedEx.


  • Arrastra el nodo solicitud http al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "POST" en el campo Método.
  • Selecciona "Enviar como cuerpo de la solicitud" en el campo Datos.
  • Pega el enlace https://apis-sandbox.fedex.com/oauth/token en el campo Enlace.
  • Selecciona "Objeto JSON" en el campo Retorno.

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. Creando un envío

  • Arrastra el nodo admin-api al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "Recibiendo todos los registros pertenecientes a la colección" y pega el código a continuación en el campo "Datos".
{
"entityType": "orders",
"entityId": "{{orderEvent.order.id}}",
"langCode": "en_US",
"offset": 0,
"limit": 1,
"marker": "delivery"
}

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

// obtener el token guardado previamente
const token = msg.access_token;

// establecer los encabezados
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};

// obtener colecciones del paso anterior
const collection = msg.payload.items[0];
// convertir el array a un objeto
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// establecer parámetros del destinatario desde el formulario
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
}
}
// establecer datos de la colección en msg para uso futuro
msg.collection = collection;
// establecer parámetros de solicitud para FedEx
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "NOMBRE DEL REMITENTE",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"DIRECCIÓN DEL REMITENTE 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
},
"recipients": [
recipient
],
"serviceType": "STANDARD_OVERNIGHT",
"packagingType": "TU_EMPAQUE",
"pickupType": "DROPOFF_AT_FEDEX_LOCATION",
"shippingChargesPayment": {
"paymentType": "SENDER",
"payor": {
"responsibleParty": {
"accountNumber": {
"value": "510087020",
"key": ""
}
},
"address": {
"streetLines": [
"DIRECCIÓN DEL REMITENTE 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;

Puedes encontrar más sobre los parámetros en la documentación de FedEx.


  • Arrastra el nodo solicitud http al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "POST" en el campo Método.
  • Selecciona "Enviar como cuerpo de la solicitud" en el campo Datos.
  • Pega el enlace https://apis-sandbox.fedex.com/ship/v1/shipments en el campo Enlace.
  • Selecciona "Objeto JSON" en el campo Retorno.

IMG2


  • Arrastra el nodo debug al espacio de trabajo y conéctalo al nodo del paso anterior.

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

// obtener datos del envío
const shipment = msg.payload.output.transactionShipments[0];
// obtener los datos de la colección guardados previamente
const collection = msg.collection;

// escribir datos del envío en los atributos del formulario
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'
}
]

// establecer parámetros para actualizar la colección
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
}

// guardar datos de la colección para uso futuro
msg.collection = collection;

return msg;

  • Arrastra el nodo admin-api al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "Cambiando un registro en la colección".

IMG2


2.4. Actualizando el estado del pedido

  • Arrastra el nodo admin-api al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "Actualizando el estado de un pedido perteneciente al objeto de almacenamiento de pedidos".
  • Pega el código a continuación en el campo "Parámetros de consulta".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
  • Pega el código a continuación en el campo "Cuerpo de la solicitud".
{
"statusIdentifier": "order_delivery_started"
}

IMG2


  • Arrastra el nodo debug al espacio de trabajo y conéctalo al nodo del paso anterior.

IMG2


3. Rastreando el Estado del Envío

3.1. Recuperando pedidos para rastreo

  • Arrastra el nodo intervalo al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Ingresa el intervalo en minutos.

IMG2


  • Arrastra el nodo admin-api al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "Recibiendo todos los pedidos pertenecientes al objeto de almacenamiento de pedidos".
  • Pega el código a continuación en el campo "Parámetros de consulta".
{
"statusIdentifier": "order_delivery_started",
"langCode": "en_US",
"offset": 0,
"limit": 100,
"id": 1
}

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

msg.payload = msg.payload.items;

return msg;

  • Arrastra el nodo dividir al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Ingresa la longitud.

IMG2


  • Arrastra el nodo admin-api al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "Recibiendo todos los registros pertenecientes a la colección".
  • Pega el código a continuación en el campo "Parámetros de consulta".
{
"marker": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

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

return msg;

  • Arrastra el nodo switch al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Agrega una regla para la verificación. Selecciona la condición "no vacío".

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

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

msg.collection = msg.payload;

return msg;

3.2. Obtención de un token

  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".
  • Reemplaza YOUR_CLIENT_ID y YOUR_CLIENT_SECRET con los tuyos.

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;

Puedes encontrar más sobre los parámetros en la documentación de FedEx.


  • Arrastra el nodo solicitud http al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "POST" en el campo Método.
  • Selecciona "Enviar como cuerpo de la solicitud" en el campo Datos.
  • Pega el enlace https://apis-sandbox.fedex.com/oauth/token en el campo Enlace.
  • Selecciona "Objeto JSON" en el campo Retorno.

IMG2


3.3. Recuperando el estado del envío

  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

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;

Puedes encontrar más sobre los parámetros en la documentación de FedEx.


  • Arrastra el nodo solicitud http al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "POST" en el campo Método.
  • Selecciona "Enviar como cuerpo de la solicitud" en el campo Datos.
  • Pega el enlace https://apis-sandbox.fedex.com/track/v1/trackingnumbers en el campo Enlace.
  • Selecciona "Objeto JSON" en el campo Retorno.

IMG2


  • Arrastra el nodo función al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Pega el código del ejemplo en el campo "Función".

IMG2

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

return msg;

3.4. Actualizando el estado del pedido

  • Arrastra el nodo switch al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Agrega una regla para la verificación. Selecciona la condición "==", y escribe "Listo para recoger" como el valor.

IMG2


  • Arrastra el nodo admin-api al espacio de trabajo y conéctalo al nodo del paso anterior.
  • Selecciona "Actualizando el estado de un pedido perteneciente al objeto de almacenamiento de pedidos".
  • Pega el código a continuación en el campo "Parámetros de consulta".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
  • Pega el código a continuación en el campo "Cuerpo de la solicitud".
{
"statusIdentifier": "ready_for_pickup"
}

IMG2


  • Arrastra el nodo debug al espacio de trabajo y conéctalo al nodo del paso anterior.

IMG2.