Ejemplo de integración con FedEx
En este tutorial, mostraremos cómo integrar FedEx
1. Preparativos
1.1. Crea una cuenta en FedEx
Crea una cuenta en el portal de desarrolladores
1.2. Crea proyectos y obtén tokens
Crea 2 proyectos en la sección mis proyectos y guarda el client id y el client secret
El primer proyecto es para gestionar envíos
El segundo proyecto es para rastrear envíos
1.3. Crea estados para el envío
En la pestaña de estados del almacén de pedidos crea estados:
- order_delivery
- order_delivery_started
- ready_for_pickup
1.4. Crea un evento para rastrear estados
En el módulo Events crea un evento para rastrear el cambio de estado del pedido order_delivery
.
1.5. Crea una colección para el envío
En el módulo Integration Collections crea una colección para el envío con los 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. Crea un pedido de prueba
Crea un pedido y un registro en la colección para este pedido.
2. Creación del envío
2.1. Rastrear el evento de envío
- Arrastra el nodo events al área de trabajo.
- Ingresa el nombre del nodo
- Cambia el valor en el campo "Set" a "orderEvent".
- El evento se guardará en el objeto "msg.orderEvent" y se podrá usar en otros nodos.
- Selecciona de la lista el evento creado "order delivery" y haz clic en "submit"
2.2. Obtener el token
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
- Reemplaza
YOUR_CLIENT_ID
yYOUR_CLIENT_SECRET
por 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;
Más detalles sobre los parámetros se pueden encontrar en la documentación de FedEx
- Arrastra el nodo http request al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona en el campo Method la opción "POST".
- Selecciona en el campo Data la opción "Send as request body".
- Inserta en el campo Link el enlace
https://apis-sandbox.fedex.com/oauth/token
. - Selecciona en el campo Return la opción "Object JSON".
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
msg.access_token = msg.payload.access_token;
return msg;
2.3. Creación del envío
- Arrastra el nodo api al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona el método "Find collection rows" e inserta el código de la descripción a continuación en el campo "Data".
{
"collectionIdentifier": "delivery",
"entityId": "{{orderEvent.order.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
// obtenemos el token guardado anteriormente
const token = msg.access_token;
// establecemos los encabezados
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};
// obtenemos las colecciones del paso anterior
const collection = msg.payload.items[0];
// convertimos el array en objeto
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// establecemos los 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
}
}
// establecemos los datos de la colección en msg, para usar en el futuro
msg.collection = collection;
// establecemos los parámetros de la 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;
Más detalles sobre los parámetros se pueden encontrar en la documentación de FedEx
- Arrastra el nodo http request al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona en el campo Method la opción "POST".
- Selecciona en el campo Data la opción "Send as request body".
- Inserta en el campo Link el enlace
https://apis-sandbox.fedex.com/ship/v1/shipments
. - Selecciona en el campo Return la opción "Object JSON".
- Arrastra el nodo debug al área de trabajo y conéctalo con el nodo del paso anterior.
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
// obtenemos los datos del envío
const shipment = msg.payload.output.transactionShipments[0];
// obtenemos los datos de la colección, guardados anteriormente
const collection = msg.collection;
// escribimos en los atributos del formulario los datos del envío
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'
}
]
// establecemos los parámetros para actualizar la colección
msg.payload = {
id: collection.id,
collectionIdentifier: 'delivery',
formData: {
en_US: newFormData
},
formIdentifier: 'delivery_form',
entityId: collection.entityId,
entityType: collection.entityType,
langCode: 'en_US',
}
// guardamos los datos de la colección para usarlos más adelante
msg.collection = msg.payload;
return msg;
- Arrastra el nodo api al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona el método "Update collection row".
2.4. Actualización del estado del pedido
- Arrastra el nodo api al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona el método "Update order status" e inserta el código de la descripción a continuación en el campo "Data".
{
"orderId": "{{collection.entityId}}",
"storageId": "test_order_storage",
"statusIdentifier": "order_delivery_started"
}
- Arrastra el nodo debug al área de trabajo y conéctalo con el nodo del paso anterior.
3. Rastrear el estado del envío
3.1. Obtener pedidos para rastrear
- Arrastra el nodo interval al área de trabajo y conéctalo con el nodo del paso anterior.
- Ingresa el intervalo en minutos.
- Arrastra el nodo api al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona el método "Find orders by status" e inserta el código de la descripción a continuación en el campo "Data".
{
"storageId": "test_order_storage",
"statusIdentifier": "order_delivery_started"
}
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
msg.payload = msg.payload.items;
return msg;
- Arrastra el nodo split al área de trabajo y conéctalo con el nodo del paso anterior.
- Ingresa la longitud.
- Arrastra el nodo api al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona el método "Find collection row" e inserta el código de la descripción a continuación en el campo "Data".
{
"collectionIdentifier": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
msg.payload = msg.payload.items[0]
return msg;
- Arrastra el nodo switch al área de trabajo y conéctalo con el nodo del paso anterior.
- Agrega una regla para la verificación. Selecciona la condición "not empty".
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
msg.trackingNumber = msg.payload
.formData
.find(item => item.marker === 'tracking_number')
.value;
msg.collection = msg.payload;
return msg;
3.2. Obtener el token
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
- Reemplaza
YOUR_CLIENT_ID
yYOUR_CLIENT_SECRET
por 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;
Más detalles sobre los parámetros se pueden encontrar en la documentación de FedEx
- Arrastra el nodo http request al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona en el campo Method la opción "POST".
- Selecciona en el campo Data la opción "Send as request body".
- Inserta en el campo Link el enlace
https://apis-sandbox.fedex.com/oauth/token
. - Selecciona en el campo Return la opción "Object JSON".
3.3. Obtener el estado del envío
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
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;
Más detalles sobre los parámetros se pueden encontrar en la documentación de FedEx
- Arrastra el nodo http request al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona en el campo Method la opción "POST".
- Selecciona en el campo Data la opción "Send as request body".
- Inserta en el campo Link el enlace
https://apis-sandbox.fedex.com/track/v1/trackingnumbers
. - Selecciona en el campo Return la opción "Object JSON".
- Arrastra el nodo function al área de trabajo y conéctalo con el nodo del paso anterior.
- Inserta el código del ejemplo en el campo "Function".
msg.payload = msg.payload.output.completeTrackResults[0].trackResults[0].latestStatusDetail.statusByLocale;
return msg;
3.4. Actualización del estado del pedido
- Arrastra el nodo switch al área de trabajo y conéctalo con el nodo del paso anterior.
- Agrega una regla para la verificación. Selecciona la condición "==", en el valor ingresa "Listo para recoger"
- Arrastra el nodo api al área de trabajo y conéctalo con el nodo del paso anterior.
- Selecciona el método "Update order status" e inserta el código de la descripción a continuación en el campo "Data".
{
"orderId": "{{collection.entityId}}",
"storageId": "test_order_storage",
"statusIdentifier": "ready_for_pickup"
}
- Arrastra el nodo debug al área de trabajo y conéctalo con el nodo del paso anterior.