BEOMAM / API tài liệu
Tài liệu tích hợp v1
DÀNH CHO CTV · ĐẠI LÝ · VIP

Kết nối shop của bạn với BEOMAM API

Đồng bộ giá bán theo cấp đại lý, đặt đơn trực tiếp bằng API Key, theo dõi kết quả và giao dịch ví trên một nền tảng.

REST APIJSON / HTTPSThanh toán bằng ví VND
BASE URLhttps://beomempo.duckdns.org/api/reseller/v1

Chỉ gửi API Key qua HTTPS và giữ khóa ở máy chủ đại lý. Webhook chỉ gửi sự kiện khi BEOMAM bật worker sau kiểm thử. Các API Key bên dưới chỉ là ví dụ.

01 — QUICKSTART

Bắt đầu trong 3 bước

01

Được cấp quyền đại lý

Chủ shop gán cấp CTV / Đại lý / VIP cho tài khoản BEOMAM của bạn.

02

Nhận API Key

Chủ shop cấp Key riêng. Mỗi Key dùng ví và bảng giá của chính đại lý được cấp.

03

Lấy giá rồi đặt đơn

Gọi /services để nhận giá, sau đó tạo client_ref duy nhất khi mua.

Không có bảng giá cố định trong tài liệu. Giá trả về từ GET /services theo đúng tài khoản API Key, bao gồm cấp giá và điều chỉnh riêng nếu đã cấu hình.
02 — AUTHENTICATION

Xác thực API

Mọi endpoint giao dịch đều yêu cầu Bearer token qua header Authorization. Mã khóa bắt đầu bằng bm_live_ và được cấp tại Web Admin, chỉ hiển thị một lần.

HTTP Header
Authorization: Bearer bm_live_YOUR_API_KEY
Content-Type: application/json

Không gắn API Key lên JavaScript trình duyệt, ứng dụng public, URL hoặc log. Nên gọi API từ backend của chính đại lý.

03 — PRICING

Bảng giá đại lý tự đồng bộ

BEOMAM hiện có các cấp CTV, Đại lý, VIP và hỗ trợ quy tắc giá theo sản phẩm hoặc tài khoản. API tự lấy giá hiệu lực cho người sở hữu Key — không sử dụng giá vốn nhà cung cấp.

CTVGiá theo cấp CTV
Đại lýGiá theo cấp đại lý
VIPGiá theo cấp VIP

Giá có thể thay đổi. Trước mỗi lần mua cần lấy lại unit_price_vnd và gửi tổng tiền dự kiến qua expected_total_vnd. Khi giá thay đổi, API từ chối đơn với RESELLER_PRICE_CHANGED_REFRESH_QUOTE thay vì âm thầm tính giá khác.

API REFERENCE

GET /services

Trả danh mục sản phẩm đại lý được phép mua, cùng mức giá hiệu lực theo API Key.

cURL
curl -sS 'https://beomempo.duckdns.org/api/reseller/v1/services?limit=100&offset=0' \
  -H 'Authorization: Bearer bm_live_YOUR_API_KEY'
Ví dụ phản hồi (minh họa)
{
  "success": true,
  "data": [{
    "id": 123,
    "sku": "BM-000123",
    "name": "Sản phẩm mẫu",
    "type": "api",
    "unit_price_vnd": 10000,
    "min_quantity": 1,
    "max_quantity": 50,
    "input_required": false,
    "input_label": null,
    "flat_price": false
  }],
  "limit": 100,
  "offset": 0
}

Các giá trị ID và giá trong ví dụ chỉ minh họa, không phải sản phẩm đang mở bán. Tham số limit từ 1 đến 100, offset từ 0 đến 100000.

GET /wallet

Kiểm tra số dư ví BEOMAM gắn với tài khoản API Key.

cURL
curl -sS 'https://beomempo.duckdns.org/api/reseller/v1/wallet' \
  -H 'Authorization: Bearer bm_live_YOUR_API_KEY'
{ "success": true, "data": { "balance_vnd": 100000, "currency": "VND" } }

GET /wallet/transactions

Lấy các bút toán ví gần nhất của đại lý (tối đa 100 bản ghi một lần).

cURL
curl -sS 'https://beomempo.duckdns.org/api/reseller/v1/wallet/transactions?limit=30' \
  -H 'Authorization: Bearer bm_live_YOUR_API_KEY'
{
  "success": true,
  "data": [{
    "type": "api_item_refund",
    "amount_vnd": 10000,
    "balance_after_vnd": 90000,
    "reference_type": "api_order_item",
    "reference_id": "456",
    "created_at": "2026-10-16T01:00:00+00:00"
  }]
}

Ví dụ chỉ minh họa cấu trúc. Giá trị thực phụ thuộc lịch sử bút toán trên tài khoản đại lý.

POST /orders

Đặt mua sản phẩm bằng mã đơn riêng client_ref. Thành công trả HTTP 201. API Key dùng số dư tài khoản đại lý hiện hữu.

client_refChuỗi duy nhất 6–64 ký tự, không tái sử dụng với nội dung khác
product_idID lấy từ /services
quantity1–50; còn phụ thuộc giới hạn từng sản phẩm
expected_total_vndTổng giá đại lý dự kiến, tính từ báo giá mới nhất
customer_inputsDanh sách thông tin đầu vào cho sản phẩm thủ công
api_optionsCho sản phẩm API (ví dụ accounts, selectedShift hoặc prefix tùy dịch vụ)
cURL — ví dụ mua dịch vụ tài khoản
curl -sS -X POST 'https://beomempo.duckdns.org/api/reseller/v1/orders' \
  -H 'Authorization: Bearer bm_live_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "client_ref": "reseller-order-100001",
    "product_id": 123,
    "quantity": 1,
    "expected_total_vnd": 10000,
    "customer_inputs": [],
    "api_options": {"accounts": ["example_user"]}
  }'
Quan trọng: Tài khoản thực tế có thể yêu cầu định dạng user|pass hoặc ca chạy selectedShift. Chỉ dùng các trường được phép cho từng loại dịch vụ. Ví dụ trên không phải đơn có thể đặt thật.
Phản hồi — cấu trúc rút gọn
{
  "success": true,
  "replayed": false,
  "data": {
    "order_id": "BM-EXAMPLE-ORDER",
    "status": "processing",
    "payment_status": "paid",
    "quantity": 1,
    "charged_vnd": 10000,
    "refunded_vnd": 0,
    "delivery": null,
    "phone": null,
    "code": null,
    "created_at": "2026-10-16T01:00:00+00:00"
  }
}

Trạng thái và dữ liệu thực tế có thể khác theo kết quả đơn. Với hàng API, đơn được dispatch sau khi tạo; việc nhà cung cấp tiếp nhận hoặc hoàn tiền được phản ánh khi kiểm tra lại.

GET /orders/{client_ref}

Tra cứu đơn theo đúng mã client_ref đã dùng lúc đặt. Không truyền mã đơn nguồn nhà cung cấp.

cURL
curl -sS 'https://beomempo.duckdns.org/api/reseller/v1/orders/reseller-order-100001' \
  -H 'Authorization: Bearer bm_live_YOUR_API_KEY'

Trả thông tin data gồm trạng thái đơn, payment_status, charged_vnd, refunded_vnd, delivery, phone, code, created_at và dispatch_state.

WEBHOOK · OUTBOUND

Nhận kết quả tự động qua Webhook

Bot hoặc website đại lý có thể đăng ký một địa chỉ HTTPS công khai. BEOMAM gửi order.updated mỗi khi trạng thái/kết quả/số tiền hoàn trong API thay đổi. Đại lý không cần liên tục hỏi kết quả. Trường hợp webhook chưa bật hoặc bị lỗi, vẫn có thể gọi GET /orders/{client_ref}.

Không có webhook nhận đơn mua. Webhook chỉ gửi kết quả về hệ thống đại lý, không phát sinh giao dịch tài chính mới.

Đăng ký · PUT /webhook
curl -sS -X PUT 'https://beomempo.duckdns.org/api/reseller/v1/webhook' \
  -H 'Authorization: Bearer bm_live_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://your-bot.example.com/beomam-events"}'

Webhook URL phải là domain HTTPS công khai, cổng 443. BEOMAM trả secret chỉ một lần khi đăng ký. Lưu vào máy chủ đại lý để xác minh HMAC. Cập nhật URL hoặc Secret qua PUT sẽ xoay Secret; nếu đã thiết lập webhook trước đó, phải lưu Secret mới.

{"success":true,"enabled":true,"url":"https://your-bot.example.com/beomam-events","secret":"GENERATED_ONCE"}
Dữ liệu BEOMAM gửi (minh họa)
{
  "event": "order.updated",
  "client_ref": "reseller-order-100001",
  "at": "2026-10-16T06:00:00+00:00",
  "data": {
    "order_id": "BM-EXAMPLE-ORDER",
    "status": "completed",
    "payment_status": "paid",
    "quantity": 1,
    "charged_vnd": 10000,
    "refunded_vnd": 0,
    "delivery": "Kết quả mẫu",
    "phone": null,
    "code": null,
    "created_at": "2026-10-16T05:00:00+00:00"
  }
}

Headers: X-Event, X-Delivery-Id, X-Signature: sha256=... (HMAC SHA256 của raw request body với Secret). Trả HTTP 2xx trong 5 giây; nếu lỗi BEOMAM thử lại tối đa 10 lượt. Đại lý phải chống trùng theo X-Delivery-Id, không giả định callback luôn theo thứ tự.

Python — xác minh chữ ký
import hashlib, hmac

def verify(secret, body: bytes, signature: str) -> bool:
    digest = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest("sha256=" + digest, signature or "")

Quản lý: GET /webhook xem cấu hình (không lộ Secret), DELETE /webhook tắt, POST /webhook/test xếp hàng sự kiện ping, GET /webhook/deliveries xem kết quả gửi gần nhất. Chỉ gửi cho đơn tạo sau khi đăng ký webhook. Webhook của shop cần được bật bởi Admin sau khi kiểm thử.

RESPONSE CODES

Mã lỗi thường gặp

HTTPTình huốngCách xử lý
400Dữ liệu không hợp lệ / sản phẩm chưa sẵn sàngKiểm tra tham số, số lượng và lựa chọn dịch vụ
401Thiếu hoặc sai API Key; key không còn hoạt độngKiểm tra Bearer token, liên hệ chủ shop
402INSUFFICIENT_BALANCENạp thêm ví theo cơ chế BEOMAM hiện có
403Tài khoản bị vô hiệu hóaLiên hệ hỗ trợ
404Không tìm thấy đơn/sản phẩmKiểm tra client_ref hoặc product_id
409Đơn trùng khác nội dung, giá đổi hoặc trạng thái xung độtKiểm tra dữ liệu và báo giá, không tự tạo trùng
422Không qua được xác thực dữ liệu đầu vàoĐối chiếu cấu trúc JSON
429Đặt đơn quá nhanh (tối thiểu 2 giây giữa lệnh tạo mới cùng Key)Giãn nhịp gửi

BEOMAM sử dụng mã lỗi FastAPI trong trường detail; đây là các mã lỗi do BEOMAM định nghĩa, không phải mã lỗi trực tiếp của Dealer V2 nhà cung cấp.

TRANSACTION SAFETY

Chống đặt trùng & hoàn tiền

Idempotency: gửi lại cùng client_ref và cùng nội dung đơn sẽ nhận lại kết quả cũ với replayed=true; không mua/thu tiền hai lần. Nếu đổi nội dung mà dùng lại mã cũ, API trả 409.

Không tạo mã đơn mới để thử lại khi request bị timeout sau khi gửi. Hãy dùng GET /orders/{client_ref} để kiểm tra hoặc gửi lại chính xác cùng mã và cùng nội dung theo hướng dẫn an toàn.

Đơn có thể bị hủy nhưng không được hoàn tiền. Trường refunded_vnd phản ánh khoản hoàn đã ghi nhận trong ví BEOMAM; không suy ra hoàn tiền chỉ từ trạng thái cancelled. Đại lý phải tự thực hiện chính sách hoàn đối với khách cuối của mình.

BEOMAM xử lý hoàn tiền dựa trên cấu hình và cơ chế đối soát đang chạy. Tài liệu này không cam kết nhà cung cấp hoàn trong mọi trường hợp đơn lỗi.

SUPPORT

Thông tin thêm

Đại lý có cần tạo ví mới không?

Không. Key sử dụng ví của tài khoản BEOMAM được cấp quyền.

Giá sản phẩm lấy từ đâu?

Giá hiệu lực theo cấp/điều chỉnh riêng của đại lý, qua API GET /services.

Có API tự phát hành Key không?

Chưa. Super Admin cấp và thu hồi tại Web Admin theo quyền hạn hiện tại.

Có webhook cho đại lý không?

Có trong bản mở rộng mới: đăng ký tại PUT /webhook, dùng chữ ký HMAC-SHA256 và xử lý thông báo trùng. Chỉ sử dụng sau khi BEOMAM triển khai bản backend mới và bật dịch vụ webhook.

Làm sao liên hệ hỗ trợ?

Liên hệ quản trị viên của BEOMAM SHOP bằng kênh hỗ trợ chính thức đã được cung cấp khi nhận API Key.