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

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

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

1. التحضير

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

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

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

قم بإنشاء مشروعين في قسم مشاريعي واحفظ معرف العميل والسر الخاص بالعميل.

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

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

1.3. إنشاء حالات للتسليم

في علامة تبويب حالة تخزين الطلبات إنشاء حالات:

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

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

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

IMG2

1.5. إنشاء مجموعة للتسليم

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

  • الاسم (string)
  • العنوان (string)
  • رقم الهاتف (string)
  • المدينة (string)
  • رمز الولاية (string)
  • الرمز البريدي (string)
  • رمز الدولة (string)
  • رقم التتبع (string)
  • معرف المعاملة (string)
  • تاريخ الشحن (string)
  • تاريخ التسليم (string)

IMG2

1.6. إنشاء طلب اختبار

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

IMG2

IMG2

2. إنشاء شحنة

2.1. تتبع حدث التسليم

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

IMG2


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

  • اسحب عقدة الدالة إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • الصق الكود من المثال في حقل "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 إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "POST" في حقل Method.
  • اختر "إرسال كجسم الطلب" في حقل Data.
  • الصق الرابط https://apis-sandbox.fedex.com/oauth/token في حقل Link.
  • اختر "كائن JSON" في حقل Return.

IMG2


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

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. إنشاء شحنة

  • اسحب عقدة admin-api إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "استلام جميع السجلات التي تنتمي إلى المجموعة" والصق الكود أدناه في حقل "Data".
{
"entityType": "orders",
"entityId": "{{orderEvent.order.id}}",
"langCode": "en_US",
"offset": 0,
"limit": 1,
"marker": "delivery"
}

IMG2


  • اسحب عقدة الدالة إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • الصق الكود من المثال في حقل "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": "تغليفك",
"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 إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "POST" في حقل Method.
  • اختر "إرسال كجسم الطلب" في حقل Data.
  • الصق الرابط https://apis-sandbox.fedex.com/ship/v1/shipments في حقل Link.
  • اختر "كائن JSON" في حقل Return.

IMG2


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

IMG2


  • اسحب عقدة الدالة إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • الصق الكود من المثال في حقل "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.params = {
langCode: 'en_US',
id: collection.id,
marker: 'delivery'
}

msg.data = {
formIdentifier: 'delivery_form',
formData: {
en_US: newFormData
},
entityId: collection.entityId,
entityType: collection.entityType
}

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

return msg;

  • اسحب عقدة admin-api إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "تغيير سجل في المجموعة".

IMG2


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

  • اسحب عقدة admin-api إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "تحديث حالة طلب ينتمي إلى كائن تخزين الطلبات".
  • الصق الكود أدناه في حقل "Query parameters".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
  • الصق الكود أدناه في حقل "Request body".
{
"statusIdentifier": "order_delivery_started"
}

IMG2


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

IMG2


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

3.1. استرجاع الطلبات للتتبع

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

IMG2


  • اسحب عقدة admin-api إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "استلام جميع الطلبات التي تنتمي إلى كائن تخزين الطلبات".
  • الصق الكود أدناه في حقل "Query parameters".
{
"statusIdentifier": "order_delivery_started",
"langCode": "en_US",
"offset": 0,
"limit": 100,
"id": 1
}

IMG2


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

IMG2

msg.payload = msg.payload.items;

return msg;

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

IMG2


  • اسحب عقدة admin-api إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "استلام جميع السجلات التي تنتمي إلى المجموعة".
  • الصق الكود أدناه في حقل "Query parameters".
{
"marker": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

IMG2


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

IMG2

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

return msg;

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

IMG2


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

IMG2

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

msg.collection = msg.payload;

return msg;

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

  • اسحب عقدة الدالة إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • الصق الكود من المثال في حقل "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 إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "POST" في حقل Method.
  • اختر "إرسال كجسم الطلب" في حقل Data.
  • الصق الرابط https://apis-sandbox.fedex.com/oauth/token في حقل Link.
  • اختر "كائن JSON" في حقل Return.

IMG2


3.3. استرجاع حالة الشحنة

  • اسحب عقدة الدالة إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • الصق الكود من المثال في حقل "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 إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "POST" في حقل Method.
  • اختر "إرسال كجسم الطلب" في حقل Data.
  • الصق الرابط https://apis-sandbox.fedex.com/track/v1/trackingnumbers في حقل Link.
  • اختر "كائن JSON" في حقل Return.

IMG2


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

IMG2

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

return msg;

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

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

IMG2


  • اسحب عقدة admin-api إلى مساحة العمل وقم بتوصيلها بالعقدة من الخطوة السابقة.
  • اختر "تحديث حالة طلب ينتمي إلى كائن تخزين الطلبات".
  • الصق الكود أدناه في حقل "Query parameters".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
  • الصق الكود أدناه في حقل "Request body".
{
"statusIdentifier": "ready_for_pickup"
}

IMG2


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

IMG2.