Nhảy tới nội dung

Ví dụ tích hợp với FedEx

Trong bài hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách tích hợp FedEx

1. Chuẩn bị trước

1.1. Tạo tài khoản trên FedEx

Tạo tài khoản trên cổng thông tin dành cho nhà phát triển

1.2. Tạo dự án và nhận mã thông báo

Tạo 2 dự án trong phần dự án của tôi và lưu lại client id và client secret

Dự án đầu tiên để quản lý giao hàng

Dự án thứ hai để theo dõi giao hàng

1.3. Tạo trạng thái cho giao hàng

Trong tab trạng thái của kho đơn hàng tạo trạng thái:

  • order_delivery
  • order_delivery_started
  • ready_for_pickup

1.4. Tạo sự kiện để theo dõi trạng thái

Trong mô-đun Events tạo sự kiện để theo dõi sự thay đổi trạng thái đơn hàng order_delivery.

IMG2

1.5. Tạo bộ sưu tập cho giao hàng

Trong mô-đun Integration Collections tạo bộ sưu tập cho giao hàng với các thuộc tính:

  • 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. Tạo đơn hàng thử nghiệm

Tạo một đơn hàng và một bản ghi trong bộ sưu tập cho đơn hàng này.

IMG2

IMG2

2. Tạo đơn hàng

2.1. Theo dõi sự kiện giao hàng

  • Kéo nút events vào khu vực làm việc.
  • Nhập tên nút
  • Thay đổi giá trị trong trường "Set" thành "orderEvent".
  • Sự kiện sẽ được lưu trong đối tượng "msg.orderEvent" và có thể được sử dụng trong các nút khác.
  • Chọn sự kiện đã tạo "order delivery" từ danh sách và nhấn "submit"

IMG2


2.2. Nhận mã thông báo

  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".
  • Thay thế YOUR_CLIENT_IDYOUR_CLIENT_SECRET bằng của bạn

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;

Chi tiết về các tham số có thể được tìm thấy trong tài liệu của FedEx


  • Kéo nút http request vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "POST" trong trường Method.
  • Chọn "Send as request body" trong trường Data.
  • Dán liên kết https://apis-sandbox.fedex.com/oauth/token vào trường Link.
  • Chọn "Object JSON" trong trường Return.

IMG2


  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

msg.access_token = msg.payload.access_token;

return msg;

2.3. Tạo đơn hàng

  • Kéo nút api vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "Find collection rows" và dán mã từ mô tả dưới đây vào trường "Data".

IMG2

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

  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

// nhận mã thông báo đã lưu trước đó
const token = msg.access_token;

// thiết lập tiêu đề
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};

// nhận bộ sưu tập từ bước trước
const collection = msg.payload.items[0];
// chuyển đổi mảng thành đối tượng
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// thiết lập thông tin người nhận từ biểu mẫu
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
}
}
// thiết lập dữ liệu bộ sưu tập trong msg để sử dụng sau này
msg.collection = collection;
// thiết lập tham số yêu cầu cho fedex
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "TÊN NGƯỜI GỬI",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"ĐỊA CHỈ NGƯỜI GỬI 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": [
"ĐỊA CHỈ NGƯỜI GỬI 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;

Chi tiết về các tham số có thể được tìm thấy trong tài liệu của FedEx


  • Kéo nút http request vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "POST" trong trường Method.
  • Chọn "Send as request body" trong trường Data.
  • Dán liên kết https://apis-sandbox.fedex.com/ship/v1/shipments vào trường Link.
  • Chọn "Object JSON" trong trường Return.

IMG2


  • Kéo nút debug vào khu vực làm việc và kết nối với nút từ bước trước.

IMG2


  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

// nhận dữ liệu đơn hàng
const shipment = msg.payload.output.transactionShipments[0];
// nhận dữ liệu bộ sưu tập đã lưu trước đó
const collection = msg.collection;

// ghi vào thuộc tính biểu mẫu dữ liệu từ đơn hàng
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'
}
]

// thiết lập tham số để cập nhật bộ sưu tập
msg.payload = {
id: collection.id,
collectionIdentifier: 'delivery',
formData: {
en_US: newFormData
},
formIdentifier: 'delivery_form',
entityId: collection.entityId,
entityType: collection.entityType,
langCode: 'en_US',
}

// lưu dữ liệu bộ sưu tập để sử dụng sau
msg.collection = msg.payload;

return msg;

  • Kéo nút api vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "Update collection row".

IMG2


2.4. Cập nhật trạng thái đơn hàng

  • Kéo nút api vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "Update order status" và dán mã từ mô tả dưới đây vào trường "Data".

IMG2

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

  • Kéo nút debug vào khu vực làm việc và kết nối với nút từ bước trước.

IMG2


3. Theo dõi trạng thái đơn hàng

3.1. Nhận đơn hàng để theo dõi

  • Kéo nút interval vào khu vực làm việc và kết nối với nút từ bước trước.
  • Nhập khoảng thời gian tính bằng phút.

IMG2


  • Kéo nút api vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "Find orders by status" và dán mã từ mô tả dưới đây vào trường "Data".

IMG2

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

  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

msg.payload = msg.payload.items;

return msg;

  • Kéo nút split vào khu vực làm việc và kết nối với nút từ bước trước.
  • Nhập độ dài.

IMG2


  • Kéo nút api vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "Find collection row" và dán mã từ mô tả dưới đây vào trường "Data".

IMG2

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

  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

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

return msg;

  • Kéo nút switch vào khu vực làm việc và kết nối với nút từ bước trước.
  • Thêm quy tắc để kiểm tra. Chọn điều kiện "not empty".

IMG2


  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

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

msg.collection = msg.payload;

return msg;

3.2. Nhận mã thông báo

  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".
  • Thay thế YOUR_CLIENT_IDYOUR_CLIENT_SECRET bằng của bạn

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;

Chi tiết về các tham số có thể được tìm thấy trong tài liệu của FedEx


  • Kéo nút http request vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "POST" trong trường Method.
  • Chọn "Send as request body" trong trường Data.
  • Dán liên kết https://apis-sandbox.fedex.com/oauth/token vào trường Link.
  • Chọn "Object JSON" trong trường Return.

IMG2


3.3. Nhận trạng thái đơn hàng

  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "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;

Chi tiết về các tham số có thể được tìm thấy trong tài liệu của FedEx


  • Kéo nút http request vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "POST" trong trường Method.
  • Chọn "Send as request body" trong trường Data.
  • Dán liên kết https://apis-sandbox.fedex.com/track/v1/trackingnumbers vào trường Link.
  • Chọn "Object JSON" trong trường Return.

IMG2


  • Kéo nút function vào khu vực làm việc và kết nối với nút từ bước trước.
  • Dán mã từ ví dụ vào trường "Function".

IMG2

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

return msg;

3.4. Cập nhật trạng thái đơn hàng

  • Kéo nút switch vào khu vực làm việc và kết nối với nút từ bước trước.
  • Thêm quy tắc để kiểm tra. Chọn điều kiện "==", nhập giá trị "Ready for pickup"

IMG2


  • Kéo nút api vào khu vực làm việc và kết nối với nút từ bước trước.
  • Chọn phương thức "Update order status" và dán mã từ mô tả dưới đây vào trường "Data".

IMG2

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

  • Kéo nút debug vào khu vực làm việc và kết nối với nút từ bước trước.

IMG2