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
.
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
)
1.6. Crear un pedido de prueba
Crea un pedido y un registro en la colección para este pedido.
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".
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
yYOUR_CLIENT_SECRET
con los tuyos.
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.
- 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".
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"
}
- 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".
// 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.
- Arrastra el nodo debug al espacio de trabajo y conéctalo al nodo del paso anterior.
- 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".
// 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".
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"
}
- Arrastra el nodo debug al espacio de trabajo y conéctalo al nodo del paso anterior.
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.
- 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
}
- 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".
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.
- 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
}
- 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".
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".
- 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".
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
yYOUR_CLIENT_SECRET
con los tuyos.
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.
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".
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.
- 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".
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.
- 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"
}
- Arrastra el nodo debug al espacio de trabajo y conéctalo al nodo del paso anterior.
.