Exemple d'intégration avec FedEx
Ce tutoriel montre comment intégrer FedEx.
1. Préparation
1.1. Créer un compte FedEx
Créez un compte sur le portail développeur.
1.2. Créer des projets et obtenir des jetons
Créez deux projets dans la section mes projets et notez le client id et le client secret.
Le premier projet sert à gérer les expéditions.
Le second sert à suivre les expéditions.
1.3. Créer les statuts de livraison
Dans l'onglet des statuts du stockage des commandes, créez les statuts (s'ouvre dans un nouvel onglet) suivants :
- order_delivery
- order_delivery_started
- ready_for_pickup
1.4. Créer un événement pour suivre les statuts
Dans le module Events (s'ouvre dans un nouvel onglet), créez un événement qui suit le changement du statut de commande order_delivery.

1.5. Créer une collection pour la livraison
Dans le module Integration Collections (s'ouvre dans un nouvel onglet), créez une collection pour la livraison avec les attributs suivants :
- 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. Créer une commande de test
Créez une commande, puis un enregistrement de collection pour cette commande.


2. Création d'une expédition
2.1. Suivi de l'événement de livraison
- Faites glisser le nœud events (s'ouvre dans un nouvel onglet) sur l'espace de travail.
- Saisissez le nom du nœud.
- Dans le champ "Set", remplacez la valeur par "orderEvent".
- L'événement est enregistré dans l'objet "msg.orderEvent" et peut être utilisé dans d'autres nœuds.
- Dans la liste, sélectionnez l'événement "order delivery" que vous avez créé, puis cliquez sur "submit".

2.2. Obtention d'un jeton
- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".
- Remplacez
YOUR_CLIENT_IDetOUR_CLIENT_SECRETpar vos valeurs.

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;
Pour en savoir plus sur les paramètres, consultez la documentation FedEx.
- Faites glisser le nœud http request (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Dans le champ Method, sélectionnez "POST".
- Dans le champ Data, sélectionnez "Send as request body".
- Dans le champ Link, collez l'URL
https://apis-sandbox.fedex.com/oauth/token. - Dans le champ Return, sélectionnez "Object JSON".

- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".

msg.access_token = msg.payload.access_token;
return msg;
2.3. Création d'une expédition
- Faites glisser le nœud admin-api (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Sélectionnez la méthode "Receiving all records belonging to the collection" et collez le code ci-dessous dans le champ "Data".
{
"entityType": "orders",
"entityId": "{{orderEvent.order.id}}",
"langCode": "en_US",
"offset": 0,
"limit": 1,
"marker": "delivery"
}

- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".

// récupère le jeton enregistré précédemment
const token = msg.access_token;
// définit les en-têtes
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};
// récupère les collections de l'étape précédente
const collection = msg.payload.items[0];
// convertit le tableau en objet
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// définit les paramètres du destinataire à partir du formulaire
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
}
}
// enregistre les données de la collection dans msg pour la suite
msg.collection = collection;
// définit les paramètres de la requête FedEx
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "SENDER NAME",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"SENDER ADDRESS 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
},
"recipients": [
recipient
],
"serviceType": "STANDARD_OVERNIGHT",
"packagingType": "YOUR_PACKAGING",
"pickupType": "DROPOFF_AT_FEDEX_LOCATION",
"shippingChargesPayment": {
"paymentType": "SENDER",
"payor": {
"responsibleParty": {
"accountNumber": {
"value": "510087020",
"key": ""
}
},
"address": {
"streetLines": [
"SENDER ADDRESS 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;
Pour en savoir plus sur les paramètres, consultez la documentation FedEx.
- Faites glisser le nœud http request (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Dans le champ Method, sélectionnez "POST".
- Dans le champ Data, sélectionnez "Send as request body".
- Dans le champ Link, collez l'URL
https://apis-sandbox.fedex.com/ship/v1/shipments. - Dans le champ Return, sélectionnez "Object JSON".

- Faites glisser le nœud debug (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.

- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".

// récupère les données de l'expédition
const shipment = msg.payload.output.transactionShipments[0];
// récupère les données de la collection enregistrées précédemment
const collection = msg.collection;
// écrit les données de l'expédition dans les attributs du formulaire
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'
}
]
// définit les paramètres de mise à jour de la collection
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
}
// enregistre les données de la collection pour la suite
msg.collection = collection;
return msg;
- Faites glisser le nœud admin-api (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Sélectionnez la méthode "Changing a record in the collection".

2.4. Mise à jour du statut de la commande
- Faites glisser le nœud admin-api (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Sélectionnez la méthode "Updating the status of an order belonging to the order storage object".
- Collez le code ci-dessous dans le champ "Query parameters".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
- Collez le code ci-dessous dans le champ "Request body".
{
"statusIdentifier": "order_delivery_started"
}

- Faites glisser le nœud debug (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.

3. Suivi du statut de l'expédition
3.1. Récupération des commandes à suivre
- Faites glisser le nœud interval (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Saisissez l'intervalle en minutes.

- Faites glisser le nœud admin-api (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Sélectionnez la méthode "Receiving all orders belonging to the order storage object".
- Collez le code ci-dessous dans le champ "Query parameters".
{
"statusIdentifier": "order_delivery_started",
"langCode": "en_US",
"offset": 0,
"limit": 100,
"id": 1
}

- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".

msg.payload = msg.payload.items;
return msg;
- Faites glisser le nœud split (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Saisissez la longueur.

- Faites glisser le nœud admin-api (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Sélectionnez la méthode "Receiving all records belonging to the collection".
- Collez le code ci-dessous dans le champ "Query parameters".
{
"marker": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".

msg.payload = msg.payload.items[0]
return msg;
- Faites glisser le nœud switch (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Ajoutez une règle de vérification et sélectionnez la condition "not empty".

- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".
![]()
msg.trackingNumber = msg.payload
.formData
.find(item => item.marker === 'tracking_number')
.value;
msg.collection = msg.payload;
return msg;
3.2. Obtention d'un jeton
- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".
- Remplacez
YOUR_CLIENT_IDetOUR_CLIENT_SECRETpar vos valeurs.

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;
Pour en savoir plus sur les paramètres, consultez la documentation FedEx.
- Faites glisser le nœud http request (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Dans le champ Method, sélectionnez "POST".
- Dans le champ Data, sélectionnez "Send as request body".
- Dans le champ Link, collez l'URL
https://apis-sandbox.fedex.com/oauth/token. - Dans le champ Return, sélectionnez "Object JSON".

3.3. Récupération du statut de l'expédition
- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "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;
Pour en savoir plus sur les paramètres, consultez la documentation FedEx.
- Faites glisser le nœud http request (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Dans le champ Method, sélectionnez "POST".
- Dans le champ Data, sélectionnez "Send as request body".
- Dans le champ Link, collez l'URL
https://apis-sandbox.fedex.com/track/v1/trackingnumbers. - Dans le champ Return, sélectionnez "Object JSON".
![]()
- Faites glisser le nœud function (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Collez le code de l'exemple dans le champ "Function".
![]()
msg.payload = msg.payload.output.completeTrackResults[0].trackResults[0].latestStatusDetail.statusByLocale;
return msg;
3.4. Mise à jour du statut de la commande
- Faites glisser le nœud switch (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Ajoutez une règle de vérification : sélectionnez la condition "==" et saisissez "Ready for pickup" comme valeur.

- Faites glisser le nœud admin-api (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
- Sélectionnez la méthode "Updating the status of an order belonging to the order storage object".
- Collez le code ci-dessous dans le champ "Query parameters".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
- Collez le code ci-dessous dans le champ "Request body".
{
"statusIdentifier": "ready_for_pickup"
}

- Faites glisser le nœud debug (s'ouvre dans un nouvel onglet) sur l'espace de travail et reliez-le au nœud de l'étape précédente.
