Aller au contenu principal

Exemple d'intégration avec FedEx

Dans ce tutoriel, nous allons montrer comment intégrer FedEx

1. Préparation

1.1. Créez un compte chez FedEx

Créez un compte sur le portail des développeurs

1.2. Créez des projets et obtenez des jetons

Créez 2 projets dans la section mes projets et conservez l'identifiant client et le secret client.

Le premier projet pour gérer les livraisons

Le deuxième projet pour suivre les livraisons

1.3. Créez des statuts pour la livraison

Dans l'onglet des statuts de l'entrepôt des commandes créez des statuts :

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

1.4. Créez un événement pour suivre les statuts

Dans le module Events, créez un événement pour suivre le changement de statut de la commande order_delivery.

IMG2

1.5. Créez une collection pour la livraison

Dans le module Integration Collections, créez une collection pour la livraison avec les attributs :

  • 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. Créez une commande de test

Créez une commande et un enregistrement dans la collection pour cette commande.

IMG2

IMG2

2. Création d'un envoi

2.1. Suivi de l'événement de livraison

  • Faites glisser le nœud events sur l'aire de travail.
  • Entrez le nom du nœud.
  • Modifiez la valeur dans le champ "Set" en "orderEvent".
  • L'événement sera enregistré dans l'objet "msg.orderEvent" et pourra être utilisé dans d'autres nœuds.
  • Sélectionnez dans la liste l'événement créé "order delivery" et cliquez sur "submit".

IMG2


2.2. Obtention du jeton

  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".
  • Remplacez YOUR_CLIENT_ID et YOUR_CLIENT_SECRET par les vôtres.

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;

Pour plus d'informations sur les paramètres, vous pouvez consulter la documentation FedEx


  • Faites glisser le nœud http request sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez dans le champ Method l'option "POST".
  • Sélectionnez dans le champ Data l'option "Send as request body".
  • Collez dans le champ Link le lien https://apis-sandbox.fedex.com/oauth/token.
  • Sélectionnez dans le champ Return l'option "Object JSON".

IMG2


  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. Création d'un envoi

  • Faites glisser le nœud api sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez la méthode "Find collection rows" et collez le code de la description ci-dessous dans le champ "Data".

IMG2

{
"collectionIdentifier": "delivery",
"entityId": "{{orderEvent.order.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

// obtenons le jeton précédemment enregistré
const token = msg.access_token;

// définissons les en-têtes
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};

// obtenons les collections de l'étape précédente
const collection = msg.payload.items[0];
// transformons le tableau en objet
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// définissons 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
}
}
// définissons les données de la collection dans msg, pour une utilisation future
msg.collection = collection;
// définissons les paramètres de la requête pour fedex
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "NOM DE L'EXPÉDITEUR",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"ADRESSE DE L'EXPÉDITEUR 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
},
"recipients": [
recipient
],
"serviceType": "STANDARD_OVERNIGHT",
"packagingType": "VOTRE_EMBALLAGE",
"pickupType": "DROPOFF_AT_FEDEX_LOCATION",
"shippingChargesPayment": {
"paymentType": "SENDER",
"payor": {
"responsibleParty": {
"accountNumber": {
"value": "510087020",
"key": ""
}
},
"address": {
"streetLines": [
"ADRESSE DE L'EXPÉDITEUR 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 plus d'informations sur les paramètres, vous pouvez consulter la documentation FedEx


  • Faites glisser le nœud http request sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez dans le champ Method l'option "POST".
  • Sélectionnez dans le champ Data l'option "Send as request body".
  • Collez dans le champ Link le lien https://apis-sandbox.fedex.com/ship/v1/shipments.
  • Sélectionnez dans le champ Return l'option "Object JSON".

IMG2


  • Faites glisser le nœud debug sur l'aire de travail et connectez-le au nœud de l'étape précédente.

IMG2


  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

// obtenons les données de l'envoi
const shipment = msg.payload.output.transactionShipments[0];
// obtenons les données de la collection, enregistrées précédemment
const collection = msg.collection;

// écrivons dans les attributs du formulaire les données de l'envoi
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éfinissons les paramètres pour mettre à jour la collection
msg.payload = {
id: collection.id,
collectionIdentifier: 'delivery',
formData: {
en_US: newFormData
},
formIdentifier: 'delivery_form',
entityId: collection.entityId,
entityType: collection.entityType,
langCode: 'en_US',
}

// enregistrons les données de la collection pour une utilisation ultérieure
msg.collection = msg.payload;

return msg;

  • Faites glisser le nœud api sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez la méthode "Update collection row".

IMG2


2.4. Mise à jour du statut de la commande

  • Faites glisser le nœud api sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez la méthode "Update order status" et collez le code de la description ci-dessous dans le champ "Data".

IMG2

{
"orderId": "{{collection.entityId}}",
"storageId": "test_order_storage",
"statusIdentifier": "order_delivery_started"
}

  • Faites glisser le nœud debug sur l'aire de travail et connectez-le au nœud de l'étape précédente.

IMG2


3. Suivi du statut de l'envoi

3.1. Obtention des commandes à suivre

  • Faites glisser le nœud interval sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Entrez l'intervalle en minutes.

IMG2


  • Faites glisser le nœud api sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez la méthode "Find orders by status" et collez le code de la description ci-dessous dans le champ "Data".

IMG2

{
"storageId": "test_order_storage",
"statusIdentifier": "order_delivery_started"
}

  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

msg.payload = msg.payload.items;

return msg;

  • Faites glisser le nœud split sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Entrez la longueur.

IMG2


  • Faites glisser le nœud api sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez la méthode "Find collection row" et collez le code de la description ci-dessous dans le champ "Data".

IMG2

{
"collectionIdentifier": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

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

return msg;

  • Faites glisser le nœud switch sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Ajoutez une règle pour la vérification. Sélectionnez la condition "not empty".

IMG2


  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

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

msg.collection = msg.payload;

return msg;

3.2. Obtention du jeton

  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".
  • Remplacez YOUR_CLIENT_ID et YOUR_CLIENT_SECRET par les vôtres.

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;

Pour plus d'informations sur les paramètres, vous pouvez consulter la documentation FedEx


  • Faites glisser le nœud http request sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez dans le champ Method l'option "POST".
  • Sélectionnez dans le champ Data l'option "Send as request body".
  • Collez dans le champ Link le lien https://apis-sandbox.fedex.com/oauth/token.
  • Sélectionnez dans le champ Return l'option "Object JSON".

IMG2


3.3. Obtention du statut de l'envoi

  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

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;

Pour plus d'informations sur les paramètres, vous pouvez consulter la documentation FedEx


  • Faites glisser le nœud http request sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez dans le champ Method l'option "POST".
  • Sélectionnez dans le champ Data l'option "Send as request body".
  • Collez dans le champ Link le lien https://apis-sandbox.fedex.com/track/v1/trackingnumbers.
  • Sélectionnez dans le champ Return l'option "Object JSON".

IMG2


  • Faites glisser le nœud function sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Collez le code de l'exemple dans le champ "Function".

IMG2

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 sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Ajoutez une règle pour la vérification. Sélectionnez la condition "==", dans la valeur entrez "Ready for pickup".

IMG2


  • Faites glisser le nœud api sur l'aire de travail et connectez-le au nœud de l'étape précédente.
  • Sélectionnez la méthode "Update order status" et collez le code de la description ci-dessous dans le champ "Data".

IMG2

{
"orderId": "{{collection.entityId}}",
"storageId": "test_order_storage",
"statusIdentifier": "ready_for_pickup"
}

  • Faites glisser le nœud debug sur l'aire de travail et connectez-le au nœud de l'étape précédente.

IMG2