Tích hợp xác thực bản quyền

← Quay lại Cài đặt

Tích hợp xác thực bản quyền vào phần mềm

Hướng dẫn tích hợp API Sellkit vào ứng dụng của bạn để xác thực mã bản quyền, kích hoạt thiết bị, và quản lý giới hạn số máy sử dụng.

Không cần API key. Các endpoint xác thực bản quyền là công khai — phần mềm của bạn gọi trực tiếp mà không cần xác thực.

Quy trình hoạt động

  1. Khách mua sản phẩm → Sellkit tự động tạo mã bản quyền (workflow)
  2. Khách nhận mã qua email hoặc trang xác nhận đơn hàng
  3. Khách nhập mã vào phần mềm của bạn
  4. Phần mềm gọi API verify để kiểm tra → nếu hợp lệ, gọi activate để kích hoạt trên thiết bị
  5. Khi gỡ cài đặt hoặc đổi máy, gọi deactivate để giải phóng slot

Base URL

https://your-sellkit-api.com/api/v1

Trong môi trường phát triển: http://localhost:8080/api/v1

1. Xác thực mã bản quyền

Kiểm tra mã có hợp lệ không, còn hạn không, đã bị thu hồi chưa.

POST /api/v1/licenses/verify

{
  "key": "A3F29-BC81D-4E72F-09A3B-D61C8",
  "device_fingerprint": "abc123"  // tùy chọn
}

Kết quả thành công:

{
  "valid": true,
  "license": {
    "id": "uuid",
    "key": "A3F29-BC81D-4E72F-09A3B-D61C8",
    "status": "active",
    "tier": "pro",
    "seats": 5,
    "expires_at": "2027-03-25T10:31:00Z"
  }
}

Kết quả không hợp lệ:

{
  "valid": false,
  "reason": "license expired"
}

Các lý do không hợp lệ: not found, license expired, license suspended, license revoked, seat limit reached.

2. Kích hoạt trên thiết bị

Đăng ký thiết bị sử dụng mã bản quyền. Số thiết bị bị giới hạn bởi seats.

POST /api/v1/licenses/activate

{
  "key": "A3F29-BC81D-4E72F-09A3B-D61C8",
  "device_fingerprint": "unique-device-id",
  "device_name": "MacBook Pro của Minh"  // tùy chọn
}

Kết quả:

{
  "id": "activation-uuid",
  "license_id": "license-uuid",
  "device_fingerprint": "unique-device-id",
  "device_name": "MacBook Pro của Minh",
  "activated_at": "2026-04-01T10:00:00Z"
}

Nếu vượt quá số máy cho phép, API trả về lỗi 400: "seat limit reached".

Nếu thiết bị đã kích hoạt, trả về activation hiện tại (idempotent).

3. Hủy kích hoạt

Giải phóng slot khi người dùng gỡ cài đặt hoặc đổi máy.

POST /api/v1/licenses/deactivate

{
  "key": "A3F29-BC81D-4E72F-09A3B-D61C8",
  "device_fingerprint": "unique-device-id"
}

Trả về 204 No Content nếu thành công.

Tạo Device Fingerprint

Mỗi thiết bị cần một ID duy nhất. Cách tạo phổ biến:

  • Desktop (Windows/Mac/Linux): Hash từ MAC address + hostname + OS serial
  • Mobile: Device ID từ hệ điều hành
  • Web app: Lưu UUID vào localStorage

Fingerprint không cần phải là phần cứng — chỉ cần ổn định qua các lần mở app.

Ví dụ tích hợp

Python

import requests
import hashlib
import platform

API = "https://your-sellkit-api.com/api/v1"

def get_device_id():
    raw = f"{platform.node()}-{platform.machine()}-{platform.system()}"
    return hashlib.sha256(raw.encode()).hexdigest()[:32]

def verify_license(key):
    r = requests.post(f"{API}/licenses/verify", json={
        "key": key,
        "device_fingerprint": get_device_id()
    })
    data = r.json()
    return data.get("valid", False)

def activate_license(key):
    r = requests.post(f"{API}/licenses/activate", json={
        "key": key,
        "device_fingerprint": get_device_id(),
        "device_name": platform.node()
    })
    if r.status_code == 201:
        return True
    print(f"Activation failed: {r.text}")
    return False

# Sử dụng
key = input("Nhập mã bản quyền: ")
if verify_license(key):
    activate_license(key)
    print("Kích hoạt thành công!")
else:
    print("Mã không hợp lệ.")

JavaScript / Node.js

const API = "https://your-sellkit-api.com/api/v1";

async function verifyLicense(key, deviceId) {
  const res = await fetch(API + "/licenses/verify", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ key, device_fingerprint: deviceId }),
  });
  const data = await res.json();
  return data.valid;
}

async function activateLicense(key, deviceId, deviceName) {
  const res = await fetch(API + "/licenses/activate", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      key,
      device_fingerprint: deviceId,
      device_name: deviceName || "Web Browser",
    }),
  });
  if (!res.ok) throw new Error(await res.text());
  return res.json();
}

cURL

# Xác thực
curl -X POST http://localhost:8080/api/v1/licenses/verify \
  -H "Content-Type: application/json" \
  -d '{"key": "A3F29-BC81D-4E72F-09A3B-D61C8"}'

# Kích hoạt
curl -X POST http://localhost:8080/api/v1/licenses/activate \
  -H "Content-Type: application/json" \
  -d '{"key": "A3F29-BC81D-4E72F-09A3B-D61C8", "device_fingerprint": "my-device-001"}'

# Hủy kích hoạt
curl -X POST http://localhost:8080/api/v1/licenses/deactivate \
  -H "Content-Type: application/json" \
  -d '{"key": "A3F29-BC81D-4E72F-09A3B-D61C8", "device_fingerprint": "my-device-001"}'

Khuyến nghị tích hợp

  • Kiểm tra khi khởi động app — Gọi verify mỗi lần mở ứng dụng. Cache kết quả 24h để hoạt động offline.
  • Kích hoạt một lần — Gọi activate lần đầu tiên, lưu kết quả. Các lần sau chỉ cần verify.
  • Xử lý lỗi mạng — Nếu không kết nối được API, cho phép dùng tiếp dựa trên cache (grace period).
  • Không lưu key dạng plain text — Mã hóa mã bản quyền khi lưu trên thiết bị.
  • Deactivate khi gỡ cài đặt — Giúp người dùng chuyển máy mà không cần liên hệ hỗ trợ.

Mã trạng thái bản quyền

Trạng tháiÝ nghĩa
activeĐang hoạt động
expiredHết hạn
suspendedTạm khóa (do admin)
revokedThu hồi vĩnh viễn (hoàn tiền)
Chữ ký Ed25519: Mỗi mã bản quyền được ký bằng Ed25519. Bạn có thể xác thực offline bằng public key nếu cần bảo mật cao — liên hệ để được hướng dẫn.

Xem thêm: Kết nối Google | Quản lý sản phẩm