انتقل إلى المحتوى الرئيسي

مثال على التكامل مع FedEx

في هذا الدرس التعليمي، سنوضح كيفية دمج FedEx

1. التحضير المسبق

1.1. إنشاء حساب في FedEx

قم بإنشاء حساب على بوابة المطورين

1.2. إنشاء المشاريع والحصول على الرموز

قم بإنشاء مشروعين في قسم مشاريعي واحفظ client id و client secret

المشروع الأول لإدارة الشحنات

المشروع الثاني لتتبع الشحنات

1.3. إنشاء حالات للشحن

في علامة التبويب حالات مستودع الطلبات قم بإنشاء حالات:

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

1.4. إنشاء حدث لتتبع الحالات

في وحدة الأحداث، قم بإنشاء حدث لتتبع تغيير حالة الطلب order_delivery.

IMG2

1.5. إنشاء مجموعة للشحن

في وحدة مجموعات التكامل، قم بإنشاء مجموعة للشحن مع الخصائص:

  • 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. إنشاء طلب تجريبي

قم بإنشاء طلب وسجل في المجموعة لهذا الطلب.

IMG2

IMG2

2. إنشاء الشحنة

2.1. تتبع حدث الشحن

  • اسحب العقدة الأحداث إلى منطقة العمل.
  • أدخل اسم العقدة
  • قم بتغيير القيمة في حقل "Set" إلى "orderEvent".
  • سيتم حفظ الحدث في الكائن "msg.orderEvent" ويمكن استخدامه في العقد الأخرى.
  • اختر من القائمة الحدث الذي تم إنشاؤه "order delivery" واضغط على "submit"

IMG2


2.2. الحصول على الرمز

  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".
  • استبدل YOUR_CLIENT_ID و YOUR_CLIENT_SECRET بمعلوماتك

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;

يمكنك معرفة المزيد عن المعلمات في وثائق FedEx


  • اسحب العقدة http request إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر في حقل Method الخيار "POST".
  • اختر في حقل Data الخيار "Send as request body".
  • ألصق في حقل Link الرابط https://apis-sandbox.fedex.com/oauth/token.
  • اختر في حقل Return الخيار "Object JSON".

IMG2


  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. إنشاء الشحنة

  • اسحب العقدة api إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر الطريقة "Find collection rows" وألصق الكود من الوصف أدناه في حقل "Data".

IMG2

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

  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

// نحصل على الرمز المحفوظ سابقًا
const token = msg.access_token;

// نحدد الرؤوس
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};

// نحصل على المجموعات من الخطوة السابقة
const collection = msg.payload.items[0];
// نحول المصفوفة إلى كائن
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// نحدد معلمات المستلم من النموذج
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
}
}
// نحدد بيانات المجموعة في msg لاستخدامها لاحقًا
msg.collection = collection;
// نحدد معلمات الطلب لـ fedex
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "اسم المرسل",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"عنوان المرسل 1"
],
"city": "ممفيس",
"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": [
"عنوان المرسل 1"
],
"city": "ممفيس",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
}
},
"labelSpecification": {},
"requestedPackageLineItems": [
{
"customerReferences": [
{
"customerReferenceType": "CUSTOMER_REFERENCE",
"value": `Collection${collection.id}`
}
],
"weight": {
"units": "LB",
"value": "20"
}
}
]
}
};

return msg;

يمكنك معرفة المزيد عن المعلمات في وثائق FedEx


  • اسحب العقدة http request إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر في حقل Method الخيار "POST".
  • اختر في حقل Data الخيار "Send as request body".
  • ألصق في حقل Link الرابط https://apis-sandbox.fedex.com/ship/v1/shipments.
  • اختر في حقل Return الخيار "Object JSON".

IMG2


  • اسحب العقدة debug إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.

IMG2


  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

// نحصل على بيانات الشحنة
const shipment = msg.payload.output.transactionShipments[0];
// نحصل على بيانات المجموعة، المحفوظة سابقًا
const collection = msg.collection;

// نسجل في خصائص النموذج بيانات الشحنة
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'
}
]

// نحدد المعلمات لتحديث المجموعة
msg.payload = {
id: collection.id,
collectionIdentifier: 'delivery',
formData: {
en_US: newFormData
},
formIdentifier: 'delivery_form',
entityId: collection.entityId,
entityType: collection.entityType,
langCode: 'en_US',
}

// نحفظ بيانات المجموعة لاستخدامها لاحقًا
msg.collection = msg.payload;

return msg;

  • اسحب العقدة api إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر الطريقة "Update collection row".

IMG2


2.4. تحديث حالة الطلب

  • اسحب العقدة api إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر الطريقة "Update order status" وألصق الكود من الوصف أدناه في حقل "Data".

IMG2

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

  • اسحب العقدة debug إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.

IMG2


3. تتبع حالة الشحنة

3.1. الحصول على الطلبات للتتبع

  • اسحب العقدة interval إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • أدخل الفاصل الزمني بالدقائق.

IMG2


  • اسحب العقدة api إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر الطريقة "Find orders by status" وألصق الكود من الوصف أدناه في حقل "Data".

IMG2

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

  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

msg.payload = msg.payload.items;

return msg;

  • اسحب العقدة split إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • أدخل الطول.

IMG2


  • اسحب العقدة api إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر الطريقة "Find collection row" وألصق الكود من الوصف أدناه في حقل "Data".

IMG2

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

  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

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

return msg;

  • اسحب العقدة switch إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • أضف قاعدة للتحقق. اختر الشرط "not empty".

IMG2


  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

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

msg.collection = msg.payload;

return msg;

3.2. الحصول على الرمز

  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".
  • استبدل YOUR_CLIENT_ID و YOUR_CLIENT_SECRET بمعلوماتك

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;

يمكنك معرفة المزيد عن المعلمات في وثائق FedEx


  • اسحب العقدة http request إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر في حقل Method الخيار "POST".
  • اختر في حقل Data الخيار "Send as request body".
  • ألصق في حقل Link الرابط https://apis-sandbox.fedex.com/oauth/token.
  • اختر في حقل Return الخيار "Object JSON".

IMG2


3.3. الحصول على حالة الشحنة

  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "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;

يمكنك معرفة المزيد عن المعلمات في وثائق FedEx


  • اسحب العقدة http request إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر في حقل Method الخيار "POST".
  • اختر في حقل Data الخيار "Send as request body".
  • ألصق في حقل Link الرابط https://apis-sandbox.fedex.com/track/v1/trackingnumbers.
  • اختر في حقل Return الخيار "Object JSON".

IMG2


  • اسحب العقدة function إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • ألصق الكود من المثال في حقل "Function".

IMG2

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

return msg;

3.4. تحديث حالة الطلب

  • اسحب العقدة switch إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • أضف قاعدة للتحقق. اختر الشرط "=="، في القيمة أدخل "جاهز للاستلام"

IMG2


  • اسحب العقدة api إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر الطريقة "Update order status" وألصق الكود من الوصف أدناه في حقل "Data".

IMG2

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

  • اسحب العقدة debug إلى منطقة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.

IMG2