Cabin API Document

📖Môi trường

📄Staging

  • Server Host: https://sandbox.api.cabineat.vn

📄Production

  • Server Host: https://api.cabineat.vn

📖App Market trên CabinEat (AMCE)

📄Các loại ứng dụng trên AMCE

Có 3 loại ứng dụng chính trên AMCE:

  • Ứng dụng Sale Channel: Các ứng dụng này đóng vai trò như Hub Order, kiếm đơn hàng về cho Nhãn.
  • Ứng dụng POS: Các ứng dụng này phụ trách việc xử lý, vận hành đơn cho các Nhãn.
  • Ứng dụng Affiliate: Các ứng dụng loại này bổ trợ thêm cho các Nhãn nhằm kiếm thêm khách qua các Sale Channel của Nhãn để đặt đơn.

📄Đăng ký ứng dụng với AMCE

  • Liên hệ với CabinEat (CE) để đăng ký ứng dụng.
Khi đăng ký ứng dụng với AMCE ứng dụng cần cung cấp các thông tin sau
  • Có yêu cầu nhãn đăng ký với ứng dụng lúc Nhãn cài đặt ứng dụng hay không? [1] (Thường các ứng dụng Sale Channel và Affiliate sẽ yêu cầu việc này).
  • Đường dẫn trang Portal của ứng dụng để hiển thị trong Portal CabinEat (Nếu có)
  • API đăng ký Nhãn với app (Cung cấp nếu điều kiện [1] có yêu cầu)
  • API đăng ký account POS cho điểm bán (Dành cho POS app)
  • WebHook nhận thông báo đơn hàng (Dành cho POS app)
  • API lấy trạng thái của account POS ứng với điểm bán (Dành cho POS app, lấy trạng thái để kiểm tra xem account POS đó có còn hoạt động để tiếp tục nhận đơn hay không)
Ứng dụng đăng ký thành công với AMCE sẽ có nhưng thông tin sau
  • App Id: Id của ứng dụng
  • App Client Id: Id cấp riêng cho ứng dụng để giao tiếp với CabinEat
  • App Secret Key: Private key dùng để xác thực request và phân giải JWT token

📁Cơ chế giao tiếp giữa CabinEat và app

📄API từ ứng dụng gọi tới CabinEat (API Request) [2]

Headers
  • client-id (*): App Client Id
  • timestamp (*): Thời điểm gọi API (Number value)
  • signature (*): Chữ ký được hash theo SHA256 với payload có format như sau:
  • CABIN@<App Client Id>@<App Secret Key>@<timestamp>@EAT

  • ref-id: Id của đối tượng bên App tương ứng với đối tượng bên CE (Nhãn, Điểm bán, ...)
  • ref-brand-id: Id của Nhãn bên CE
  • Body (Following API)
  • Query (Following API)
  • Param (Following API)

Tips
Use Library of CabinEat
  • Sử dụng class CEAppCommunication trong module @cabineat/utilities
  • Khởi tạo:
const client = new CEAppCommunication({
  appClientId: "app client id",
  appId: "app id",
  appSecretKey: "secret key",
  env: "STG" | "PROD",
  ceRsaPubKey: "RSA Public Key provided by CabinEat",
});
  • Dùng method client.sendRequestToCe() để thực hiện lệnh gọi API tới CabinEat

📄API từ CabinEat gọi tới ứng dụng [3]

Headers
  • timestamp (*): Thời điểm gọi API (Number value)
  • signature (*): Chữ ký được hash theo SHA256 với payload có format như sau:
  • CABIN@<App Client Id>@<App Secret Key>@<timestamp>@EAT

  • ref-brand-id: Id của Nhãn bên CE
  • ref-id: Id của đối tượng bên Bahana tương ứng với đối tượng bên CabinEat (Nhãn, Điểm bán, ...)

📁API chung

📄API Lấy thông tin Nhãn

📄API Lấy danh sách điểm bán của Nhãn

📄API Lấy thông tin điểm bán của Nhãn

📄 API Lấy thời gian hoạt động và trạng thái của điểm bán

Request
  • Method: GET
  • Headers
Response

📄API Lấy danh sách mã khuyến mãi khả dụng của Nhãn

📄API kiểm tra tính hợp lệ của mã khuyến mãi cho đơn hàng mới (Cho Sale Channel, POS)

📁API cho Sale Channel App

📁API cho POS App

📄API Lấy danh sách đơn hàng của điểm bán liên kết với account POS

Request
  • Endpoint: /fa/order/v1/for-pos/list
  • Method: POST
Headers
  • Following [2]
  • ref-brand-id: number
  • ref-id: string
Params
Query
Body

Response
Data

📄API Lấy thông tin chi tiết đơn hàng của điểm bán

📄API Lấy số lượng đơn hàng theo trạng thái của điểm bán liên kết với account POS

📄API Xử lý đơn hàng cho điểm bán

📄API Đặt ship với shipping partner đã liên kết với CabinEat

📄API Hủy đặt ship với shipping partner đã liên kết với CabinEat

📁API cho Affiliate App

📄Các module bổ trợ

@cabineat/ui-react

@cabineat/ui-react

@cabineat/utilities

Các định nghĩa
enum CE_API_CLIENT_REQUEST_METHOD {
  GET = "GET",
  POST = "POST",
  PUT = "PUT",
  DELETE = "DELETE",
  PATCH = "PATCH",
}

enum CE_API_RESPONSE_CODE {
  SUCCESS = 0,
  FAILED = 1,
  ERROR = 2,
  EXCEPTION = 3,
}

type CEApiClientOptions = {
  host: string;
  builtInHeaders?: { [property: string]: any };
  log?: boolean;
};

type CEApiClientHeaders = {
  contentType?: string;
  [property: string]: any;
};

type CEApiClientRequestOptions = {
  headers: CEApiClientHeaders;
  [property: string]: any;
};

type CEApiClientRequestQuery = {
  [property: string]: string | number;
};

type CEApiClientRequestData = {
  [property: string]: any;
};

type CEApiClientResponseWrapper<T> = {
  success: boolean;
  data?: T;
  error?: {
    statusCode?: 
			| 400 
			| 401 
			| 403 
			| 500 
			| 503 
			| 502 
			| 522 
			| number;
    data?: any;
  };
};
Khởi tạo
import {
	CEAppCommunication
} from '@cabineat/utilities/app-communication';

const client = new CEAppCommunication({
  appClientId: "app client id",
  appId: "app id",
  appSecretKey: "secret key",
  env: "DEV" | "STG" | "PROD",
  ceRsaPubKey: "RSA Public Key provided by CabinEat",
});
Mã hoá data (được dùng khi API của CabinEat yêu cầu)
const { 
	apiKey, 
	encryptedData 
} = client.encryptDataForApi(data);
Gọi API CabinEat
client.sendRequestToCe(
  endpoint,
  method,
	options
);

Example:

📖 Các định nghĩa

📄 Trạng thái điểm bán

STOPPED_WORKING = 0,
WORKING = 1,
SUSPEND_WORKING = 2,

📄 Trạng thái đơn hàng

ORDER_PLACED = 0,
ORDER_READ = 1,
ORDER_ACCEPTED = 2,
ORDER_PROCESSING = 3,
ORDER_READY_FOR_PICKUP = 4,
ORDER_SHIPPING = 5,
ORDER_COMPLETED = 6,
ORDER_CANCELED = 7,
ORDER_FAILED = 8,

📄 Trạng thái ship

FINDING_COURIER = 0,
COURIER_ARRIVING = 1,
COURIER_DELIVERING = 2,
COURIER_COMPLETED = 3,
COURIER_FAILED = 4,