Tích hợp SPX vào EzyDelivery
Back to ezydeliveryBài viết này hướng dẫn cách kết nối EzyDelivery với SPX Express (SPX Việt Nam) để tạo đơn giao hàng trực tiếp từ trang quản trị, nhận mã vận đơn SPX, và tự động cập nhật trạng thái đơn khi SPX giao hàng.
Sau khi tích hợp xong, luồng làm việc sẽ như sau:
- Nhân viên tạo đơn giao hàng trong EzyDelivery với phương thức giao hàng Chuyển phát nhanh và chọn dịch vụ SPX.
- EzyDelivery hỏi SPX khung giờ lấy hàng sớm nhất còn trống, gửi đơn sang SPX, nhận về mã vận đơn SPX và in tem.
- Trong quá trình giao, SPX gọi lại (webhook) về hệ thống, EzyDelivery cập nhật trạng thái đơn theo thời gian thực.
Chuẩn bị
Trước khi cấu hình, cần có:
| Thứ cần có | Ghi chú |
|---|---|
| Thông tin tích hợp API do SPX cấp | Sau khi ký thoả thuận hợp tác, SPX gửi email "[TH SPX Partner] API integration information" gồm app-id (một dãy số) và app-secret. |
Tài khoản người gửi trên SPX (user_id, user_secret) | Dùng cho mọi thao tác tạo đơn. Có thể do SPX cấp sẵn, hoặc để EzyDelivery tự tạo bằng số điện thoại (xem phần Tài khoản người gửi). |
| Đã hoàn thành phần Cài đặt ban đầu cho EzyDelivery | Đặc biệt là quốc gia nhận (Việt Nam) có đủ tỉnh/thành phố, quận/huyện, phường/xã, và kho nhận hàng có địa chỉ, số điện thoại đầy đủ. |
Tiền tệ VND đã được kích hoạt | SPX chỉ nhận tiền VND. Nếu đơn dùng tiền tệ khác (ví dụ CNY), cần có tỉ giá quy đổi sang VND, nếu không đơn sẽ gửi thất bại. |
| Trang web (web plugin) truy cập được từ Internet | Để SPX gọi lại cập nhật trạng thái đơn. |
SPX có 2 môi trường, mỗi môi trường có bộ
app-id, app-secret riêng:| Môi trường | Địa chỉ API |
|---|---|
| Thử nghiệm (sandbox) | https://test-stable.spx.vn |
| Thật (production) | https://spx.vn |
Cấu hình dịch vụ SPX
Vào Thương mại điện tử → Các dịch vụ vận chuyển (
/ecommerce/delivery-services), tìm dòng SPX và bấm sửa (hoặc mở thẳng /ecommerce/delivery-services/SPX/edit).Điền các ô như sau:
| Ô | Giá trị | Ghi chú |
|---|---|---|
| Tên | SPX | Tên hiển thị trong ô chọn dịch vụ khi tạo đơn. Không được trùng tên với dịch vụ khác. |
| Phiên bản | Để trống | SPX không dùng ô này. |
| Đường dẫn dịch vụ | https://spx.vn | Dùng để tạo đường dẫn tra cứu hành trình đơn cho khách hàng. |
| Đường dẫn API dịch vụ | https://spx.vn | Địa chỉ API của SPX. Khi chạy thử thì dùng https://test-stable.spx.vn. Không thêm dấu / ở cuối. |
| Đường dẫn gọi lại | https://<tên-miền-web-của-bạn>/callback/SPX | Để ghi nhớ địa chỉ đã gửi cho SPX (xem phần Cấu hình webhook). |
| Khoá máy khách | app-id do SPX cấp | Chỉ gồm chữ số. Bắt buộc điền. |
| Khoá bí mật | app-secret do SPX cấp | Dùng để ký mọi yêu cầu gửi sang SPX và để xác thực webhook SPX gọi về. Bắt buộc điền. |
| Tên đăng nhập | user_id của tài khoản người gửi | Một dãy số. Xem phần Tài khoản người gửi. |
| Mật khẩu | user_secret của tài khoản người gửi | |
| Dịch vụ giao hàng mặc định | 1 hoặc để trống | Loại dịch vụ SPX: 1 là giao tiêu chuẩn (standard). Để trống thì hệ thống dùng 1. |
| Trạng thái | ACTIVATED | Chỉ dịch vụ đang ACTIVATED mới xuất hiện khi tạo đơn. |
Các ô còn lại (logo, ảnh bìa, tiền tệ phí vận chuyển, phí vận chuyển tối thiểu, giá trị hàng hoá mặc định, ...) không bắt buộc cho SPX.
Bấm Lưu. Khi lưu, hệ thống sẽ kiểm tra thử
user_id và user_secret với SPX (ký bằng app-id, app-secret vừa nhập):- Nếu đúng: lưu thành công.
- Nếu sai: hiện lỗi ở ô Tên đăng nhập và Mật khẩu. Kiểm tra lại
user_id,user_secret,app-id,app-secret, và Đường dẫn API dịch vụ có đúng môi trường hay không (thông tin của môi trường thử nghiệm không dùng được với môi trường thật và ngược lại).
Khi sửa các ô khác, cứ để nguyên ô Mật khẩu và Khoá bí mật đang hiển thị dạng ẩn, hệ thống sẽ giữ giá trị cũ.

Tài khoản người gửi (user_id, user_secret)
Có 2 cách để có tài khoản người gửi:
Cách 1: SPX đã cấp sẵn
user_id và user_secret. Điền user_id vào ô Tên đăng nhập, user_secret vào ô Mật khẩu, rồi lưu như bình thường.Cách 2: Để EzyDelivery tự tạo tài khoản bằng số điện thoại.
- Điền Khoá máy khách (
app-id) và Khoá bí mật (app-secret). - Ở ô Tên đăng nhập, nhập số điện thoại của cửa hàng. Để trống ô Mật khẩu.
- Bấm Lưu.
Khi lưu, EzyDelivery gọi SPX tạo tài khoản mới bằng số điện thoại này, rồi tự điền
user_id vào ô Tên đăng nhập và user_secret vào ô Mật khẩu. Mở lại trang sửa sẽ thấy ô Tên đăng nhập đã đổi thành một dãy số.
Lưu ý:
- Nếu số điện thoại đã có tài khoản trên SPX, hệ thống không tạo được tài khoản mới và cũng không tự điền gì. Khi đó cần liên hệ SPX để lấy
user_id,user_secretcủa tài khoản đó rồi làm theo cách 1. - Nếu SPX từ chối tạo tài khoản (ví dụ số điện thoại không hợp lệ, hoặc sai
app-id,app-secret), hệ thống báo lỗi ở ô Khoá bí mật.
Đặt làm dịch vụ mặc định (tuỳ chọn)
Ở trang danh sách Các dịch vụ vận chuyển, có thể đặt
SPX làm dịch vụ mặc định. Dịch vụ mặc định sẽ được chọn sẵn khi tạo đơn giao hàng.Ánh xạ tiền tố đơn vị hành chính
SPX nhận địa chỉ dưới dạng văn bản, và chỉ nhận những tên tỉnh, quận, phường có trong file địa chỉ chuẩn của SPX. Khi gửi đơn, EzyDelivery ghép tên đơn vị hành chính theo mẫu ánh xạ tiền tố của từng dịch vụ vận chuyển.
Mẫu cho SPX được tạo tự động khi plugin EzyDelivery (admin) khởi động, và hiển thị ở ô Ánh xạ giữa kiểu và tiền tố địa giới hành chính trên trang sửa dịch vụ. Khác với GHTK và Viettel Post, mẫu của SPX dùng tiền tố viết đầy đủ. Nội dung mặc định:
[
{ "type": "CITY", "prefix": "Thành Phố" },
{ "type": "DISTRICT_IN_CITY", "prefix": "Quận" },
{ "type": "DISTRICT_IN_PROVINCE", "prefix": "Huyện" },
{ "type": "TOWN_IN_PROVINCE", "prefix": "Thị Xã" },
{ "type": "WARD", "prefix": "Xã" },
{ "type": "WARD_IN_CITY", "prefix": "Phường" },
{ "type": "TOWN", "prefix": "Thị Trấn" }
]
Mỗi dòng gồm:
-
type: loại đơn vị hành chính, khớp với loại bạn chọn khi tạo tỉnh/thành phố, quận/huyện, phường/xã trên trang quốc gia. -
prefix: tiền tố được thêm trước tên đơn vị khi gửi sang SPX. Ví dụ phườngBến Nghécó loạiWARD_IN_CITYsẽ thànhPhường Bến Nghé.
Mẫu không có dòng cho loại
PROVINCE, nên tên tỉnh được gửi nguyên văn, không có tiền tố (ví dụ Bắc Ninh). Thành phố trực thuộc trung ương có loại CITY thì có tiền tố (ví dụ Thành Phố Hà Nội).
Thông thường không cần sửa mẫu này. Chỉ sửa khi SPX báo không hỗ trợ địa chỉ, hoặc khi bạn dùng thêm loại đơn vị hành chính khác. Nếu xoá mẫu, lần khởi động sau hệ thống sẽ tạo lại với nội dung mặc định.
Điều quan trọng hơn là dữ liệu đơn vị hành chính phải đúng: tỉnh, quận, phường của kho gửi hàng và người nhận cần được chọn đầy đủ, đúng loại, và sau khi ghép tiền tố thì tên phải khớp với tên trong file địa chỉ chuẩn của SPX. Khi gặp lỗi địa chỉ, hãy xin SPX file địa chỉ chuẩn mới nhất để đối chiếu.
Cấu hình webhook với SPX
Khác với GHTK và Viettel Post, đường dẫn webhook của SPX không tự khai báo trên trang quản lý: bạn gửi đường dẫn cho SPX, SPX gắn đường dẫn đó vào ứng dụng (
app-id) của bạn và bật gửi webhook.Đường dẫn cần gửi cho SPX:
https://<tên-miền-web-của-bạn>/callback/SPX
Ví dụ:
https://shop.example.com/callback/SPX
Nếu dùng cả môi trường thử nghiệm và môi trường thật, cần gửi đường dẫn cho SPX ở từng môi trường.
Một số điểm cần biết về webhook:
- Đường dẫn trên thuộc trang web (web plugin), không phải trang quản trị. Tên miền phải truy cập được từ Internet và nên dùng
https. - SPX ký mỗi lần gọi webhook bằng
app-secret, gửi kèm trong các headerapp-id,check-sign,timestamp,random-num. EzyDelivery tự tính lại chữ ký bằng ô Khoá bí mật để xác thực:- Thiếu header
check-signsẽ bị từ chối với lỗicheck-sign: required. - Thiếu một trong các header còn lại, hoặc chữ ký không khớp, sẽ bị từ chối với lỗi
check-sign: invalid. - Nếu chưa điền Khoá bí mật mà SPX vẫn gọi webhook, hệ thống sẽ báo lỗi
no spx secret key.
- Thiếu header
- Dữ liệu SPX gửi về phải có
tracking_no, nếu thiếu sẽ bị từ chối (tracking_no: required). - EzyDelivery chỉ chấp nhận cập nhật cho đơn mà nó đã tạo và có mã vận đơn khớp với
tracking_noSPX gửi về. Các đơn tạo trực tiếp trên trang SPX sẽ bị bỏ qua (trả vềdeliveryOrder: notFound). - SPX yêu cầu phản hồi trong vòng 3 giây. Nếu webhook liên tục bị từ chối hoặc quá thời gian, SPX có thể ngừng gửi webhook, khi đó trạng thái đơn sẽ không còn tự cập nhật. Vì vậy cần đảm bảo cấu hình đúng trước khi gửi đơn thật.
Tạo đơn giao hàng qua SPX
Khi khách hàng có yêu cầu giao hàng với phương thức Chuyển phát nhanh:
- Vào Các yêu cầu giao hàng (
/ezydelivery/shipping-requests) và mở yêu cầu cần giao. - Bấm Tạo vận đơn, kiểm tra Tổng số cân (kg).
- Ở ô Dịch vụ vận chuyển, chọn SPX (chỉ hiện khi phương thức giao hàng là chuyển phát nhanh).
- Bấm Tạo hoặc Tạo và hoàn thành.
Khi gửi đơn, EzyDelivery tự xử lý các việc sau:
| Việc | Cách làm |
|---|---|
| Hình thức nhận hàng | Luôn là SPX đến lấy hàng (pickup), không hỗ trợ mang hàng ra bưu cục. |
| Khung giờ lấy hàng | Hỏi SPX danh sách khung giờ lấy hàng, chọn khung giờ sớm nhất còn trống. Nếu không còn khung giờ nào, đơn không được gửi. |
| Địa chỉ lấy hàng | Nếu đơn có địa chỉ người gửi thì dùng địa chỉ đó. Nếu không, dùng địa chỉ của kho gửi hàng (tỉnh, quận, phường, địa chỉ chi tiết). |
| Người gửi | Dùng tên người gửi (hoặc tên cửa hàng) và số điện thoại người gửi (hoặc số điện thoại của kho gửi hàng). |
| Địa chỉ người nhận | Dùng tỉnh, quận, phường đã chọn của người nhận. Nếu người nhận chưa chọn tỉnh, hệ thống tách từ địa chỉ đầy đủ của người nhận. Ghi chú của người nhận được gửi làm hướng dẫn giao hàng. |
| Mã đơn gửi sang SPX | Ghép từ mã đơn trong EzyDelivery và thời điểm gửi, nên mỗi lần gửi lại là một mã mới, không bị SPX báo trùng. |
| Kiện hàng | Cả đơn được gửi thành một kiện: khối lượng là tổng khối lượng các sản phẩm (đổi sang kg), dài, rộng, cao là kích thước lớn nhất trong các sản phẩm (đổi sang cm), tên hàng là tên các sản phẩm nối với nhau bằng + , số lượng là tổng số lượng sản phẩm. |
| Giá trị khai báo | Bằng giá trị hàng hoá của đơn (đã quy đổi sang VND). Nếu giá trị từ 3.000.000 VND trở lên, đơn được đánh dấu là hàng giá trị cao theo quy định của SPX. |
| Quy đổi tiền | Giá trị hàng và tiền thu hộ được quy đổi sang VND theo tỉ giá hiện có. |
| Thu hộ (COD) và người trả phí | Xác định theo bảng bên dưới. |
Cách xác định tiền thu hộ và người trả phí vận chuyển:
| Đơn đã thanh toán? | Người trả phí vận chuyển | SPX thu của người nhận |
|---|---|---|
| Đã thanh toán | Người gửi | Không thu gì |
| Đã thanh toán | Người nhận | Chỉ thu phí vận chuyển |
| Chưa thanh toán | Người gửi | Chỉ thu tiền hàng (COD) |
| Chưa thanh toán | Người nhận | Thu cả tiền hàng và phí vận chuyển |
Giới hạn kiện hàng của SPX
SPX từ chối đơn vượt các giới hạn sau (áp dụng cho Việt Nam):
| Giới hạn | Giá trị |
|---|---|
| Khối lượng | Lớn hơn 0 và không quá 15 kg |
| Mỗi chiều dài, rộng, cao | Không quá 60 cm |
| Tiền thu hộ | Không quá 20.000.000 VND |
| Giá trị khai báo | Dưới 20.000.000 VND |
Vì vậy cần khai báo khối lượng cho mọi sản phẩm, và nên khai báo kích thước để SPX tính phí đúng.
Kết quả gửi đơn
- Thành công: đơn chuyển sang trạng thái Đã gửi yêu cầu, mã vận đơn SPX (
tracking_no) được lưu làm mã vận đơn của đơn, và tem được in ngay. Các thông tin SPX trả về (đường dẫn tra cứu, mã phân loại, phí vận chuyển dự kiến, phí cơ bản, phí thu hộ, phí hàng giá trị cao, VAT, ...) được lưu kèm đơn. - Thất bại: đơn chuyển sang trạng thái Gửi yêu cầu thất bại, nội dung lỗi SPX trả về (mã lỗi, thông báo, thông tin gỡ lỗi) được lưu vào đơn để xem lại. Sau khi sửa nguyên nhân có thể gửi lại.
Cập nhật trạng thái đơn
Mỗi lần SPX gọi webhook, EzyDelivery cập nhật trạng thái đơn theo
status_code, thời điểm cập nhật theo timestamp, lưu số điện thoại tài xế SPX (nếu có), và lưu mã trạng thái, tên trạng thái, ghi chú gốc của SPX kèm đơn để tiện đối chiếu.Bảng ánh xạ trạng thái SPX sang trạng thái trong EzyDelivery:
| Mã SPX | Ý nghĩa bên SPX | Trạng thái trong EzyDelivery |
|---|---|---|
1001 | Chờ lấy hàng | Đã nhận yêu cầu |
2001 | Đã lấy hàng, đang vận chuyển | Đang giao hàng |
2006 | Đang giao tới người nhận | Sẵn sàng giao hàng |
3001 | Kiện hàng bị giữ lại | Tạm thời bị treo |
4001 | Giao thành công | Đã giao hàng |
5001 | Lấy hàng thất bại | Không lấy được hàng |
5002 | Kiện hàng bị hư hỏng | Đã có sự cố |
5003 | Kiện hàng bị thất lạc | Đã có sự cố |
6001 | Đang trả hàng về người gửi | Đang trả hàng |
6002 | Trả hàng thất bại | Đã có sự cố |
6003 | Đã trả hàng về người gửi | Bị trả lại |
7001 | Đơn bị huỷ | Bị huỷ |
Mã trạng thái không có trong bảng sẽ được ghi nhận là không xác định.
Khách hàng có thể tra cứu hành trình đơn qua đường dẫn dạng:
https://spx.vn/track?<mã-vận-đơn>
Phần đầu của đường dẫn lấy từ ô Đường dẫn dịch vụ đã cấu hình.
Xử lý sự cố thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Lưu cấu hình báo sai tên đăng nhập / mật khẩu | Sai user_id, user_secret, sai app-id, app-secret, hoặc dùng thông tin môi trường thử nghiệm với API thật (và ngược lại) | Kiểm tra lại thông tin SPX cấp, kiểm tra Đường dẫn API dịch vụ đúng môi trường và không có / ở cuối. |
| Lưu cấu hình báo lỗi ở ô Khoá bí mật | SPX từ chối tạo tài khoản người gửi bằng số điện thoại trong ô Tên đăng nhập | Kiểm tra số điện thoại, app-id, app-secret. Hoặc xin SPX user_id, user_secret và điền trực tiếp. |
| Không thấy SPX khi tạo đơn | Dịch vụ chưa ACTIVATED, hoặc phương thức giao hàng không phải chuyển phát nhanh | Kích hoạt dịch vụ, kiểm tra lại phương thức giao hàng của yêu cầu. |
Gửi đơn thất bại với lỗi deliveryServiceNotSetup | Thiếu Đường dẫn API dịch vụ, Khoá máy khách, Khoá bí mật, Tên đăng nhập hoặc Mật khẩu, hoặc Khoá máy khách / Tên đăng nhập không phải dãy số | Điền đủ các ô và lưu lại cấu hình. |
Gửi đơn thất bại với lỗi getPickupTimeslotFailed | SPX từ chối yêu cầu lấy khung giờ lấy hàng, thường do sai thông tin xác thực | Kiểm tra lại app-id, app-secret, user_id, user_secret và Dịch vụ giao hàng mặc định. |
Gửi đơn thất bại với lỗi noAvailablePickupTimeslot | SPX không còn khung giờ lấy hàng nào | Thử gửi lại sau, hoặc liên hệ SPX. |
Gửi đơn thất bại với lỗi noCurrencyVND | Chưa có tiền tệ VND | Kích hoạt tiền tệ VND. |
| Gửi đơn thất bại do không quy đổi được tiền | Thiếu tỉ giá từ tiền tệ của đơn sang VND | Thêm tỉ giá trong Thương mại điện tử. |
Gửi đơn thất bại, SPX báo địa chỉ không được hỗ trợ (mã 10011 đến 10019) | Tên tỉnh, quận, phường của kho hoặc người nhận không khớp file địa chỉ chuẩn của SPX, hoặc khu vực đó SPX chưa phục vụ | Kiểm tra tỉnh, quận, phường của kho và người nhận, kiểm tra mẫu ánh xạ tiền tố, đối chiếu với file địa chỉ chuẩn của SPX. |
Gửi đơn thất bại, SPX báo lỗi khung giờ lấy hàng (mã 10080) | Khung giờ vừa chọn đã hết chỗ | Gửi lại đơn, hệ thống sẽ lấy khung giờ mới. |
Gửi đơn thất bại, SPX báo lỗi khối lượng hoặc kích thước (mã 10001, 10083 đến 10086, hoặc parcel weight can not be null) | Sản phẩm chưa khai báo khối lượng, hoặc kiện hàng vượt giới hạn | Khai báo khối lượng, kích thước cho sản phẩm, tách đơn nếu quá nặng hoặc quá lớn. |
Gửi đơn thất bại, SPX báo lỗi tiền thu hộ (mã 10003) | Tiền thu hộ vượt 20.000.000 VND | Tách đơn, hoặc thu trước một phần tiền hàng. |
Gửi đơn thất bại, SPX báo lỗi app-id (mã 1001, 1005) | Sai app-id, app-secret, hoặc ứng dụng chưa được SPX kích hoạt | Kiểm tra lại thông tin SPX cấp, liên hệ SPX nếu vẫn lỗi. |
| Trạng thái đơn không tự cập nhật | SPX chưa gắn đường dẫn webhook, sai Khoá bí mật nên chữ ký không khớp, tên miền web không truy cập được từ Internet, hoặc SPX đã ngừng gửi webhook do lỗi liên tục | Kiểm tra lại phần Cấu hình webhook, liên hệ SPX để bật lại webhook nếu cần. |