Chuyển đến nội dung chính
Mã giấy phép thuộc loại quyền được cấp phép License Key. Tạo một quyền cấp phép License Key một lần với giới hạn kích hoạt, thời hạn hết hạn và hướng dẫn bạn muốn, gắn nó vào bất kỳ sản phẩm nào, và Dodo Payments sẽ tạo và phân phối một mã mỗi lần mua hoặc mỗi chỗ trong đăng ký, tự động.

Mã Giấy Phép là gì?

License keys are unique tokens that authorize access to your product. They’re ideal for:
  • Software licensing: Desktop apps, plugins, and CLIs
  • Per-seat controls: Limit activations per user or device
  • Digital goods: Gate downloads, updates, or premium features
Trong Dodo Payments, mã giấy phép được quản lý thông qua hệ thống Entitlements, có nghĩa là vòng đời của mỗi mã (tạo, hết hạn, thu hồi, cấp lại) được điều khiển bởi cùng các sự kiện thanh toán và đăng ký như các sản phẩm khác của bạn.

Tạo một Quyền cấp phép License Key

1

Open Entitlements

Đi đến Entitlements trong bảng điều khiển Dodo Payments của bạn và nhấp + để tạo một quyền mới.
2

Choose License Key

Chọn License Key làm tích hợp. Cấu hình cách mà mỗi mã được cấp phát hành xử lý:
  • Giới hạn Kích hoạt: Số lượng kích hoạt đồng thời tối đa cho mỗi mã (ví dụ, 1 cho ứng dụng một người dùng, 5 cho giấy phép nhóm, để trống cho không giới hạn).
  • Thời Gian: Thời gian mã duy trì hiệu lực sau khi phát hành (ví dụ, 30 ngày, 1 năm). Đối với mã được cấp phát hành thông qua đăng ký, để trống; mã vẫn có hiệu lực miễn là đăng ký còn hoạt động.
  • Hướng Dẫn Kích Hoạt: Các hướng dẫn dành cho khách hàng được gửi kèm với mã qua email. Ví dụ: Paste the key in Settings → License hoặc Run: mycli activate <key>.
New License Key entitlement form with name, fulfillment mode, license length, activations limit, and activation message
3

Save the entitlement

Lưu. Quyền cấp phát hành giờ có sẵn để gắn vào bất kỳ sản phẩm nào.

Gắn vào Sản Phẩm

Mở một sản phẩm, mở rộng Cài Đặt Nâng Cao → Entitlements & Credits, và chọn quyền cấp phép License Key của bạn. Một sản phẩm đơn có thể cấp một mã giấy phép cùng với các quyền khác (truy cập Discord, tải tệp, truy cập kho GitHub, v.v.) trong cùng một lần mua.
Product entitlements panel with License Key selected

Cách Mã Được Phát Hành

Việc phát hành mã theo chuẩn vòng đời cấp phát:
Sự KiệnHành Vi
payment.succeeded (một lần)Tạo một mã cho mỗi quantity đã mua. Thời hạn mã tôn trọng thời gian của quyền cấp phát hành.
subscription.activeTạo một mã cho mỗi chỗ trong đăng ký quantity. Mã không có thời hạn; hiệu lực được gắn với tình trạng đăng ký.
subscription.renewedKhông hành động. Các mã đã có vẫn tồn tại.
subscription.on_holdVô hiệu hóa mã. Chúng sẽ được kích hoạt lại khi đăng ký thoát khỏi chế độ tạm dừng.
subscription.cancelled / expiredVô hiệu hóa permanent mã.
subscription.plan_changedVô hiệu hóa mã cũ; phát hành mã mới cho kế hoạch mới.
refund.succeeded (một lần)Vô hiệu hóa mã.
Thu hồi thủ công qua API/bảng điều khiểnVô hiệu hóa mã với revocation_reason: manual. Các mã này không tự cấp phát lại khi đăng ký được gia hạn.
Mã giấy phép bị vô hiệu hóa trực tiếpThu hồi quyền cấp phát với revocation_reason: license_key_disabled. Kích hoạt lại mã sẽ tự động kích hoạt việc cấp phát lại.

Hành vi với Số lượng

  • Sản phẩm đăng ký cấp một mã cho mỗi chỗ (subscriptions.quantity).
  • Sản phẩm một lần cấp một mã cho mỗi dòng sản phẩm trong giỏ hàng (product_cart.quantity).
  • Cấp phát thủ công qua API chỉ cấp đúng một mã.

Chế độ thực hiện

Mỗi quyền cấp License Key có một fulfillment_mode để kiểm soát ai cung cấp mã:
  • auto (mặc định): Dodo Payments tự động tạo và gửi qua email mã khi thanh toán hoặc đăng ký. Đây là hành vi đã mô tả trước đó và áp dụng khi fulfillment_mode bị bỏ qua.
  • manual: Việc mua tạo ra một quyền cấp pending không có mã, và bạn tự cung cấp từng giá trị mã. Xem Thực hiện thủ công dưới đây.

Thực hiện thủ công

Theo mặc định, Dodo Payments tạo và gửi qua email một mã license ngay khi khách hàng thanh toán. Với thực hiện thủ công bạn tự cung cấp mã: việc mua tạo ra một quyền cấp pending không có mã, thông báo cho bạn, và chờ bạn gửi giá trị mã. Sử dụng điều này khi mã đến từ hệ thống của bạn, nhà cung cấp bên thứ ba, hoặc một nhóm mã đã in sẵn.
Tìm kiếm hướng dẫn từng bước để xây dựng? Xem Hướng dẫn tích hợp thực hiện thủ công mã License để có hướng dẫn chi tiết từ việc tạo sản phẩm đến cung cấp mã.

Khi nào sử dụng

Thực hiện tự động là lựa chọn mặc định đúng cho hầu hết các giấy phép phần mềm. Chọn thực hiện thủ công khi Dodo Payments không thể phát hành mã:
  • Mang theo mã của bạn: Mã được tạo bởi ứng dụng của bạn, một sản phẩm desktop, hoặc máy chủ cấp phép của bạn.
  • Nhà cung cấp bên thứ ba: Bạn bán lại các mã được cấp bởi nhà cung cấp thượng nguồn (một mã game, thông tin xác thực API, nền tảng đối tác).
  • Tồn kho hữu hạn: Bạn cung cấp mã từ một nhóm đã phân bổ trước và muốn chỉ định chúng từng cái một.
  • Đánh giá con người: Bạn muốn xem xét một giao dịch mua trước khi phát hành quyền truy cập.

Kích hoạt thực hiện thủ công

Đặt fulfillment_mode: "manual" trên cấu hình tích hợp quyền cấp License Key:
const entitlement = await client.entitlements.create({
  name: 'Pro License (Manual)',
  integration_type: 'license_key',
  integration_config: {
    fulfillment_mode: 'manual',
    activations_limit: 5,
    duration_count: 1,
    duration_interval: 'Year',
  },
});
fulfillment_mode tương thích ngược. Các quyền cấp được tạo ra trước khi thiết lập này tồn tại không có fulfillment_mode và tiếp tục hoạt động như auto. Chuyển sang manual chỉ ảnh hưởng đến các quyền cấp được tạo sau thay đổi này; các mã đã được phát hành sẽ không bị ảnh hưởng.

Tìm quyền cấp chờ thực hiện

Khi một khách hàng mua sản phẩm ở chế độ thủ công, quyền cấp được tạo ở trạng thái pending không có mã và một webhook entitlement_grant.created được kích hoạt với integration_type: "license_key"status: "pending". Bạn có thể phản ứng với webhook đó, hoặc kiểm tra endpoint List Grants với các bộ lọc integration_typestatus:
const pending = await client.entitlements.grants.list('ent_license_key_id', {
  integration_type: 'license_key',
  status: 'pending',
});

Cung cấp mã

Gửi mã với endpoint Fulfill License Key Grant. Quyền cấp di chuyển sang delivered và khách hàng sẽ tự động nhận được mã — cùng email mà họ sẽ nhận được trong chế độ thực hiện tự động.
cURL
curl -X POST https://test.dodopayments.com/grants/grant_8VbC6JDZ/license-key \
  -H "Authorization: Bearer $DODO_PAYMENTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "PRO-AAAA-BBBB-CCCC-DDDD",
    "activations_limit": 5,
    "expires_at": "2027-05-01T00:00:00Z"
  }'
activations_limitexpires_at là tùy chọn và mặc định theo cấu hình quyền cấp khi bị bỏ qua. Mỗi quyền cấp chỉ được thực hiện một lần; thử lại một quyền cấp đã được thực hiện sẽ trả về 409 thay vì cấp phát mã thứ hai.
Bạn không cần phải gửi email mã tự mình — việc cung cấp xảy ra tự động khi quyền cấp được thực hiện. Điều này khác với nhập các mã qua POST /license_keys, mà cố ý không thông báo cho khách hàng.

Kích hoạt, Xác nhận, Hủy kích hoạt

Các điểm cuối kích hoạt/xác nhận/hủy kích hoạt API là công khai và không yêu cầu mã API. Sử dụng chúng trực tiếp từ phần mềm desktop, CLIs hoặc khách hàng dựa trên trình duyệt để xác minh các mã trong thời gian chạy.
Điểm cuối công khai: Các điểm cuối kích hoạt, hủy kích hoạt và xác nhận license là công khai và không yêu cầu mã API. Gọi chúng trực tiếp từ ứng dụng của bạn mà không làm lộ thông tin xác thực API của bạn.

Kích hoạt một license

import DodoPayments from 'dodopayments';

// No API key needed for public license endpoints
const client = new DodoPayments();

const response = await client.licenses.activate({
  license_key: 'PRO-AAAA-BBBB-CCCC-DDDD',
  name: 'Device Name',
});

console.log(response.id);

Xác nhận một license

const response = await client.licenses.validate({
  license_key: 'PRO-AAAA-BBBB-CCCC-DDDD',
});

console.log(response.valid);

Hủy kích hoạt một phiên bản kích hoạt

await client.licenses.deactivate({
  license_key: 'PRO-AAAA-BBBB-CCCC-DDDD',
  license_key_instance_id: 'instance_abc123',
});

Quản lý Mã

Mở quyền cấp License Key từ bảng điều khiển của bạn để xem mọi quyền cấp (một hàng mỗi mã khách hàng) với ngày giao hàng, số lượng kích hoạt, và hành động thu hồi. Mỗi chi tiết quyền cấp sẽ xuất hiện mã license cơ bản, hạn sử dụng, số lần kích hoạt đã sử dụng, và giới hạn kích hoạt. Bạn cũng có thể liệt kê quyền cấp theo cách lập trình:
const grants = await client.entitlements.grants.list('ent_license_key_id', {
  status: 'delivered',
});

for (const grant of grants.items) {
  console.log(grant.license_key.key, grant.license_key.activations_used);
}

Nhập Mã License Hiện Tại qua API

Đã có mã license trong hệ thống khác? Sử dụng API Tạo Mã License để nhập chúng vào Dodo Payments. Điều này cho phép bạn di chuyển các mã hiện có mà không làm gián đoạn khách hàng của bạn — họ tiếp tục kích hoạt, xác nhận, và hủy kích hoạt các chuỗi mã như cũ mà không cần cấp lại.
Mã license được tạo hoặc cập nhật qua API không kích hoạt thông báo email đến khách hàng. Nếu bạn cần thông báo khách hàng về một mã đã nhập, hãy xử lý điều đó một cách riêng biệt trong ứng dụng của bạn.
const licenseKey = await client.licenseKeys.create({
  customer_id: 'cus_abc123',
  product_id: 'prod_456',
  key: 'YOUR-EXISTING-LICENSE-KEY',
  activations_limit: 5,
  expires_at: '2026-12-31T23:59:59Z',
});

Sự Khác Biệt của Mã theo Nguồn

TrườngMã tự động tạoMã thực hiện thủ côngMã nhập khẩu
source"auto""manual""import"
Nguồn gốcĐược tạo bởi Dodo Payments khi thanh toánCung cấp bởi bạn chống lại một quyền cấp đang chờĐược tạo/di chuyển qua POST /license_keys
payment_idĐặt vào thanh toán gốcGiải quyết từ quyền cấp hoặc đăng ký của nónull (không có giao dịch của Dodo Payments)
subscription_idĐặt nếu phát hành qua đăng kýĐặt nếu quyền cấp đến từ một đăng kýnull trừ khi được liên kết rõ ràng
Thông báo email khách hàngGửi khi phát hànhGửi khi thực hiệnKhông gửi — xử lý riêng
Sử dụng trường source trên các phản hồi GET /license_keys để phân biệt di chuyển tồn kho và mã thực hiện thủ công từ các mã cấp phát tự nhiên khi đối chiếu hoặc kiểm toán.
Di chuyển từ Polar.sh hoặc Lemon Squeezy? dodo-migrate CLI tự động hóa việc nhập hàng loạt sản phẩm, khách hàng, chiết khấu và mã license trong một lệnh duy nhất và ánh xạ ID ngoài sang ID Dodo tự động.

Mã License trong URL Trả về

Khi một khách hàng hoàn tất quá trình mua cho một sản phẩm với quyền cấp License Key, mã được tạo ra tự động sẽ được thêm vào return_url của bạn dưới dạng tham số truy vấn. Điều này cho phép bạn hiển thị mã ngay lập tức trên trang thành công của mình mà không cần thực hiện thêm yêu cầu API.
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001&email=customer%40example.com
Nếu giao dịch mua tạo ra nhiều mã (số lượng > 1), chúng sẽ được ngăn cách bằng dấu phẩy:
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001,LK-002&email=customer%40example.com
Đối với đăng ký, subscription_id được sử dụng thay vì payment_id:
https://yoursite.com/return?subscription_id=sub_xxx&status=active&license_key=LK-001&email=customer%40example.com
Phân tích tham số license_key trên trang trả về của bạn để hiển thị mã ngay lập tức, cải thiện trải nghiệm sau mua hàng.

Quản lý API

Kích hoạt, hủy kích hoạt, và xác nhận là công khai; không yêu cầu mã API.

Activate License

Tạo hoặc ghi lại một phiên bản kích hoạt cho một mã license.

Deactivate License

Thu hồi một lần kích hoạt trước đó để giải phóng dung lượng.

Validate License

Kiểm tra tính xác thực, trạng thái, và giới hạn trước khi cấp quyền truy cập.
Tạo, liệt kê, truy xuất, và cập nhật các bản ghi mã license riêng lẻ. Sử dụng chúng để nhập các mã hiện tại hoặc lấy thông tin sử dụng.

Create License Key

Tạo một mã license mới hoặc nhập một mã hiện tại.

List License Keys

Duyệt tất cả mã với các chi tiết trạng thái và sử dụng.

Get License Key

Truy xuất một mã cụ thể và siêu dữ liệu của nó.

Update License Key

Điều chỉnh hạn sử dụng, giới hạn kích hoạt, hoặc bật/tắt mã.
Quản lý quyền cấp License Key: giới hạn kích hoạt của nó, thời gian và hướng dẫn.

Create Entitlement

Tạo một quyền cấp License Key.

Update Entitlement

Cập nhật cấu hình của quyền cấp.

List Grants

Liệt kê các mã đã phát hành cho một quyền cấp.

Revoke Grant

Thu hồi mã của khách hàng một cách thủ công.

Webhooks

Việc cấp mã và thu hồi mã kích hoạt bốn sự kiện webhook entitlement_grant.*. Payload quyền cấp bao gồm một đối tượng license_key với mã, hạn sử dụng, số lần kích hoạt đã sử dụng, và giới hạn. Các sự kiện license_key.* cũ (license_key.created) tiếp tục kích hoạt cho vòng đời ghi chép mã license cơ bản; xem trang payload webhook License Key.
Đối với tích hợp mới, lắng nghe entitlement_grant.delivered thay vì license_key.created. Sự kiện quyền cấp cho bạn biết rằng việc cấp đã hoàn tất trên tất cả tích hợp trên sản phẩm, không chỉ mã license.

Mã License Cũ

Các sản phẩm được tạo với cờ license_key_enabled cũ đã được tự động di chuyển sang quyền cấp License Key. Việc di chuyển là trong suốt: các mã khách hàng hiện tại tiếp tục hoạt động không thay đổi, các điểm cuối công khai /licenses/activate, /licenses/validate, /licenses/deactivate tiếp tục hoạt động, và các điểm cuối API /license_keys/* tiếp tục đọc và ghi vào cùng kho mã.Phần Mã License độc lập trong bảng điều khiển vẫn có sẵn dưới dạng danh sách phẳng của mọi mã đã phát hành, hữu ích cho kiểm toán và tìm kiếm. Cấu hình mới (thay đổi giới hạn kích hoạt, thời gian, hoặc hướng dẫn) nên được thực hiện bằng cách chỉnh sửa quyền cấp License Key đã di chuyển trong Quyền cấp.

Thực hành Tốt nhất

  • Giữ giới hạn kích hoạt rõ ràng: Chọn các giá trị mặc định hợp lý (1 cho ứng dụng đơn người dùng, 3–5 cho giấy phép nhóm) và tài liệu hóa chúng.
  • Cung cấp hướng dẫn kích hoạt chính xác: Khách hàng dán những hướng dẫn này từ email của họ, vì vậy các đường dẫn và lệnh chính xác sẽ tiết kiệm các yêu cầu hỗ trợ.
  • Xác nhận mã phía máy chủ: Đối với các sản phẩm kết nối mạng, xác nhận qua /licenses/validate thay vì lưu trữ dữ liệu kích hoạt cục bộ.
  • Sử dụng webhooks để thu hồi: Lắng nghe entitlement_grant.revoked để vô hiệu hóa các tính năng trong ứng dụng ngay lập tức khi khách hàng hủy hoặc hoàn tiền.
  • Kiểm tra với đăng ký và một lần: Hành vi mã license khác biệt nhẹ giữa hai hình thức, vì vậy hãy kiểm tra cả hai trước khi đưa vào thực tế.
Lần sửa đổi cuối 9 tháng 6, 2026