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
- Khách mua sản phẩm → Sellkit tự động tạo mã bản quyền (workflow)
- Khách nhận mã qua email hoặc trang xác nhận đơn hàng
- Khách nhập mã vào phần mềm của bạn
- 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ị
- 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
verifymỗ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
activatelần đầu tiên, lưu kết quả. Các lần sau chỉ cầnverify. - 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 |
expired | Hết hạn |
suspended | Tạm khóa (do admin) |
revoked | Thu 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