Ana içeriğe geç

FedEx ile Entegrasyon Örneği

Bu eğitimde FedEx entegrasyonunu nasıl gerçekleştireceğimizi göstereceğiz.

1. Ön Hazırlık

1.1. FedEx'te bir hesap oluşturun

Developer portalında bir hesap oluşturun.

1.2. Projeler oluşturun ve token alın

Projelerim bölümünde 2 proje oluşturun ve client id ve client secret'ı kaydedin.

İlk proje teslimatları yönetmek için.

İkinci proje teslimatları takip etmek için.

1.3. Teslimat durumları oluşturun

Sipariş deposu durumları sekmesinde durumları oluşturun:

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

1.4. Durumları takip etmek için bir olay oluşturun

Olaylar modülünde order_delivery sipariş durumunu takip etmek için bir olay oluşturun.

IMG2

1.5. Teslimat için bir koleksiyon oluşturun

Entegrasyon Koleksiyonları modülünde aşağıdaki niteliklerle teslimat için bir koleksiyon oluşturun:

  • 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. Test siparişi oluşturun

Bu sipariş için bir sipariş ve koleksiyon kaydı oluşturun.

IMG2

IMG2

2. Gönderi Oluşturma

2.1. Teslimat olayını takip etme

  • events düğümünü çalışma alanına sürükleyin.
  • Düğümün adını girin.
  • "Set" alanındaki değeri "orderEvent" olarak değiştirin.
  • Olay "msg.orderEvent" nesnesinde saklanacak ve diğer düğümlerde kullanılabilecektir.
  • Oluşturduğunuz "order delivery" olayını listeden seçin ve "submit" butonuna tıklayın.

IMG2


2.2. Token alma

  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.
  • YOUR_CLIENT_ID ve OUR_CLIENT_SECRET değerlerini kendi değerlerinizle değiştirin.

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;

Parametreler hakkında daha fazla bilgi için FedEx belgelerine göz atabilirsiniz.


  • http request düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Method" alanında "POST" seçeneğini seçin.
  • "Data" alanında "Send as request body" seçeneğini seçin.
  • "Link" alanına https://apis-sandbox.fedex.com/oauth/token bağlantısını yapıştırın.
  • "Return" alanında "Object JSON" seçeneğini seçin.

IMG2


  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. Gönderi oluşturma

  • api düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Find collection rows" yöntemini seçin ve aşağıdaki açıklamada verilen kodu "Data" alanına yapıştırın.

IMG2

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

  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

// daha önce kaydedilen token'ı alıyoruz
const token = msg.access_token;

// başlıkları ayarlıyoruz
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};

// önceki adımdan koleksiyonları alıyoruz
const collection = msg.payload.items[0];
// diziyi nesneye dönüştürüyoruz
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// formdan alıcı bilgilerini ayarlıyoruz
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
}
}
// gelecekte kullanmak için msg'de koleksiyon verilerini ayarlıyoruz
msg.collection = collection;
// fedex için istek parametrelerini ayarlıyoruz
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "GÖNDERİCİ ADI",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"GÖNDERİCİ ADRESİ 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": [
"GÖNDERİCİ ADRESİ 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;

Parametreler hakkında daha fazla bilgi için FedEx belgelerine göz atabilirsiniz.


  • http request düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Method" alanında "POST" seçeneğini seçin.
  • "Data" alanında "Send as request body" seçeneğini seçin.
  • "Link" alanına https://apis-sandbox.fedex.com/ship/v1/shipments bağlantısını yapıştırın.
  • "Return" alanında "Object JSON" seçeneğini seçin.

IMG2


  • debug düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.

IMG2


  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

// gönderi verilerini alıyoruz
const shipment = msg.payload.output.transactionShipments[0];
// daha önce kaydedilen koleksiyon verilerini alıyoruz
const collection = msg.collection;

// form verilerine gönderi verilerini yazıyoruz
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'
}
]

// koleksiyonu güncellemek için parametreleri ayarlıyoruz
msg.payload = {
id: collection.id,
collectionIdentifier: 'delivery',
formData: {
en_US: newFormData
},
formIdentifier: 'delivery_form',
entityId: collection.entityId,
entityType: collection.entityType,
langCode: 'en_US',
}

// gelecekte kullanmak için koleksiyon verilerini kaydediyoruz
msg.collection = msg.payload;

return msg;

  • api düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Update collection row" yöntemini seçin.

IMG2


2.4. Sipariş durumunu güncelleme

  • api düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Update order status" yöntemini seçin ve aşağıdaki açıklamada verilen kodu "Data" alanına yapıştırın.

IMG2

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

  • debug düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.

IMG2


3. Gönderi durumunu takip etme

3.1. Takip için siparişleri alma

  • interval düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • Dakika cinsinden bir aralık girin.

IMG2


  • api düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Find orders by status" yöntemini seçin ve aşağıdaki açıklamada verilen kodu "Data" alanına yapıştırın.

IMG2

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

  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

msg.payload = msg.payload.items;

return msg;

  • split düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • Uzunluğu girin.

IMG2


  • api düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Find collection row" yöntemini seçin ve aşağıdaki açıklamada verilen kodu "Data" alanına yapıştırın.

IMG2

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

  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

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

return msg;

  • switch düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • Kontrol için bir kural ekleyin. "not empty" koşulunu seçin.

IMG2


  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

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

msg.collection = msg.payload;

return msg;

3.2. Token alma

  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.
  • YOUR_CLIENT_ID ve OUR_CLIENT_SECRET değerlerini kendi değerlerinizle değiştirin.

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;

Parametreler hakkında daha fazla bilgi için FedEx belgelerine göz atabilirsiniz.


  • http request düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Method" alanında "POST" seçeneğini seçin.
  • "Data" alanında "Send as request body" seçeneğini seçin.
  • "Link" alanına https://apis-sandbox.fedex.com/oauth/token bağlantısını yapıştırın.
  • "Return" alanında "Object JSON" seçeneğini seçin.

IMG2


3.3. Gönderi durumunu alma

  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırı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;

Parametreler hakkında daha fazla bilgi için FedEx belgelerine göz atabilirsiniz.


  • http request düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Method" alanında "POST" seçeneğini seçin.
  • "Data" alanında "Send as request body" seçeneğini seçin.
  • "Link" alanına https://apis-sandbox.fedex.com/track/v1/trackingnumbers bağlantısını yapıştırın.
  • "Return" alanında "Object JSON" seçeneğini seçin.

IMG2


  • function düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Function" alanına örnek kodu yapıştırın.

IMG2

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

return msg;

3.4. Sipariş durumunu güncelleme

  • switch düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • Kontrol için bir kural ekleyin. "==" koşulunu seçin ve değeri "Ready for pickup" olarak girin.

IMG2


  • api düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.
  • "Update order status" yöntemini seçin ve aşağıdaki açıklamada verilen kodu "Data" alanına yapıştırın.

IMG2

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

  • debug düğümünü çalışma alanına sürükleyin ve önceki adımda oluşturduğunuz düğümle bağlayın.

IMG2