CRMKhách hàng

Đăng ký tài khoản

Quy trình đăng ký tài khoản mới qua 2 bước (Xác thực OTP).

Quy trình đăng ký tài khoản mới được chia làm 2 giai đoạn: Khởi tạo (gửi OTP) và Hoàn tất (xác thực OTP + tạo tài khoản).


Headers

KeyValueBắt buộcMô tả
SiteTenantId{tenant_id}CóID của công ty/tenant.

Bước 1: Khởi tạo đăng ký

POST /site/customers/registerinit

Dùng để kiểm tra thông tin ban đầu và gửi mã OTP xác thực số điện thoại.

Logic xử lý

  1. Kiểm tra full_name không rỗng, phone chỉ gồm chữ số và chưa được đăng ký trong shop hiện tại.
  2. Kiểm tra định dạng email (nếu có).
  3. Kiểm tra mật khẩu có ít nhất 7 ký tự.
  4. Kiểm tra group hợp lệ. Với nhóm Nhà phân phối (group = 5) bắt buộc có representative_name, representative_id và representative_file_id_list (file đã tải lên shop này trong vòng 3 phút).
  5. Tạo mã OTP (6 số) và lưu tạm với thời hạn 5 phút.
  6. Gửi OTP qua tin nhắn (ZNS/SMS) theo nhà cung cấp shop đã cấu hình. Nếu shop bật chế độ thử nghiệm ZNS, OTP là mã cố định do shop cấu hình (mặc định 123456).
  7. Trả về passport_id để Frontend sử dụng ở bước sau.

Request Body

{
  "full_name": "Nguyễn Văn B",
  "phone": "0912345678",
  "password": "password123",
  "email": "[email protected]",
  "group": 0, // 0: Khách lẻ, 1: VIP, 3: Khách sỉ, 5: Nhà phân phối, 7: Cộng tác viên
  "social_links": ["https://facebook.com/nguyenvanb"] // Không bắt buộc
}
TrườngKiểuBắt buộcMô tả
full_namestringCóHọ tên khách hàng.
phonestringCóSố điện thoại (chỉ gồm chữ số), dùng làm tên đăng nhập.
passwordstringCóMật khẩu, tối thiểu 7 ký tự.
emailstringKhôngEmail.
groupintegerKhôngNhóm khách hàng (mặc định 0). Xem Customer Group.
representative_namestringVới group = 5Tên người đại diện.
representative_idstringVới group = 5Số CCCD/MST người đại diện.
representative_file_id_listarrayVới group = 5Danh sách ID file ảnh giấy tờ (tải lên qua API upload file của storefront).
social_linksarray hoặc stringKhôngDanh sách link mạng xã hội (mảng hoặc chuỗi cách nhau dấu phẩy). Hệ thống tự nhận diện Facebook, TikTok, Instagram, Zalo, Shopee, Telegram.

Response Schema (200)

{
  "id": "uuid-string",
  "company_id": 123,
  "passport_id": "passport-id-string",
  "full_name": "Nguyễn Văn B",
  "phone": "0912345678",
  "otp_length": 6,
  "date_created": 1734924700,
  "date_expired": 1734925000,
  "metadata": {
    "action": "register"
  }
}

Bước 2: Hoàn tất đăng ký

POST /site/customers/registerfinish

Xác thực mã OTP và chính thức tạo tài khoản.

Logic xử lý

  1. Kiểm tra lại toàn bộ thông tin như Bước 1 (để tránh race condition).
  2. Xác thực mã OTP thông qua phone và passport_id. OTP chỉ dùng được một lần.
  3. Nếu khách hàng đăng ký nhóm Distributor hoặc Collaborator, trạng thái nhóm (group_status) sẽ là 1 (Chờ duyệt). Các nhóm còn lại có trạng thái 0.
  4. Băm mật khẩu và lưu tài khoản (hoặc tạo tài khoản trên hệ thống tài khoản riêng của shop nếu shop dùng chế độ remote_api).
  5. Trả về thông tin khách hàng vừa tạo. API này không tự đăng nhập, Frontend cần gọi Đăng nhập để lấy token.

Request Body

{
  "full_name": "Nguyễn Văn B",
  "phone": "0912345678",
  "password": "password123",
  "email": "[email protected]",
  "passport_id": "passport-id-string",
  "otp": "123456",
  "group": 0,
  "representative_name": "", // Nếu là NPP/CTV
  "representative_id": "", // CCCD/MST
  "representative_file_id_list": [], // Ảnh CCCD/GPKD
  "social_links": []
}

Gửi lại đầy đủ các trường của Bước 1, kèm passport_id và otp.

Response Schema (200)

Trả về Customer Object.


Các lỗi thường gặp (422)

Mã lỗiMô tả
error_fullname_requiredChưa nhập họ tên.
error_phone_requiredChưa nhập số điện thoại.
error_phone_invalidSố điện thoại sai định dạng (chỉ được chứa chữ số).
error_phone_existedSố điện thoại đã được đăng ký.
error_email_invalidEmail sai định dạng.
error_password_emptyChưa nhập mật khẩu.
error_password_length_invalidMật khẩu ngắn hơn 7 ký tự.
error_group_invalidGiá trị group không hợp lệ.
error_representative_name_requiredThiếu tên người đại diện (nhóm Nhà phân phối).
error_representative_id_requiredThiếu CCCD/MST người đại diện (nhóm Nhà phân phối).
error_representative_file_id_list_requiredThiếu ảnh giấy tờ (nhóm Nhà phân phối).
error_representative_file_id_invalidID file không hợp lệ.
error_representative_file_not_foundFile không tồn tại hoặc không thuộc shop.
error_representative_file_id_expiredFile được tải lên quá 3 phút trước.
error_passport_id_required(Bước 2) Thiếu passport_id.
error_otp_required(Bước 2) Thiếu otp.
error_passport_otp_not_found(Bước 2) Phiên OTP không tồn tại hoặc đã hết hạn (quá 5 phút).
error_otp_invalid(Bước 2) Mã OTP không chính xác.

Các lỗi hệ thống (500)

Mã lỗiMô tả
error_save_passportKhông lưu được phiên OTP.
error_create_customer_memoKhông tạo được yêu cầu gửi tin nhắn OTP.
error_provider_not_supportedNhà cung cấp gửi tin nhắn shop cấu hình không được hỗ trợ.
error_provider_response_invalid_no_error_msg, error_provider_request_failed_unknown_reasonGửi tin nhắn OTP thất bại.

On this page