Lewati ke konten
Dokumentasi pengembangMulai cepat

Tambahkan lisensi ke perangkat lunak Anda

Alokasikan sekitar 15 menit untuk melindungi ekspor: konfigurasi, contoh, integrasi, dan uji penolakan. Alat pengembangan bahasa harus sudah terinstal.

SDK menangani permintaan, identitas, tanda tangan, kredensial, cache, dan heartbeat. Berikan input aktivasi pelanggan dan fungsi operasi; tidak perlu HTTP manual atau menyimpan activation_id.

  1. Unduh paket integrasiBuat pengaturan produk di konsol
  2. Buat berkas eksporPeriksa izin dan hasil operasi
  3. Tambahkan ke aplikasiMulai, titik masuk operasi, tutup

1. Siapkan paket di konsol

Buka Mulai cepat, isi nama perangkat lunak, pilih lisensi terikat perangkat atau mengambang, lalu buat produk dan lanjutkan. Sistem menyiapkan produk, kebijakan, lisensi uji, kunci publik dan versi 1.0.0. Pilih bahasa, unduh paket terkonfigurasi lalu ekstrak.

Paket berisi dua konfigurasi:sdk-demo.json berisi kunci lisensi uji untuk pengujian Anda;product.json hanya berisi pengaturan produk dan kunci publik, dan boleh didistribusikan bersama perangkat lunak.

Untuk integrasi pertama, pilih lisensi terikat perangkat. Contoh bawaan mengaktifkan export tanpa penghitung. Produk yang ada perlu fitur itu dalam kebijakan dan lisensi.

2. Periksa lingkungan dan ekspor berkas

Buka terminal di akar hasil ekstraksi. Pertahankan product.json, sdk-demo.json, start.ps1, start.sh, dan sdk bersama. Pilih bahasa dan OS, lalu jalankan. Pemeriksaan lingkungan tidak mengirim aktivasi.

Jalankan di direktori hasil ekstraksi

Tanda keberhasilan:Kode keluar 0, keluaran berikut, dan licensed-report.txt baru. Jalankan tanpa opsi uji: SDK memulihkan kredensial perangkat tanpa memakai slot perangkat tambahan.

Keluaran berhasil
License OK: export is available
Export completed: licensed-report.txt

Instal alat pengembangan yang belum ada. C/C++ juga perlu berkas pengembangan libcurl; MinGW menerima -CurlRoot. Menerima peringatan browser tidak membuat SDK percaya sertifikat. Runtime harus mempercayai sertifikat server uji.

3. Tambahkan ke aplikasi pelanggan

Jalankan installer situs resmi di proyek. Sembilan bahasa memakai versi 0.10.0. SHA-256 diperiksa sebelum instalasi atau ekstraksi. Tambahkan hanya product.json ke sumber daya aplikasi.

Tambahkan ke proyek yang ada

Instal offline dari bundel integrasi yang diunduh

Ganti SDK_ROOT dengan jalur absolut direktori hasil ekstraksi.

Dependensi sumber lokal

Berkas yang dapat dijalankan untuk bahasa ini:. Salin titik masuk operasinya ke proyek Anda; Lihat kode lengkap →

Tahap aplikasiYang harus dilakukan
Mulai atau layar aktivasiBerikan product.json dan kunci pelanggan. Setelah aktivasi, gunakan kunci kosong saat mulai lagi. Aplikasi GUI melakukan aktivasi daring pertama di tugas latar.
Tombol, pintasan, menu, atau perintah eksporBerikan fungsi ekspor ke RunFeature. SDK memeriksa izin sebelum memanggilnya. Pertahankan client yang sama.
Penutupan aplikasiTutup client untuk menghentikan heartbeat. Kursi floating dikembalikan; registrasi perangkat tetap ada.

4. Pastikan penolakan izin memblokir ekspor

Pastikan kebijakan tidak memuat licentivo_denied_probe, lalu jalankan perintah. Hasilnya harus kode bukan nol dan tanpa denied-report.txt. Gunakan jalur keluaran yang belum ada.

Uji penolakan izin

5. Tambahkan operasi terukur bila diperlukan

Berikan callback dan ID tugas tetap ke RunMeteredFeature. SDK mereservasi penggunaan, mengonfirmasi keberhasilan, membatalkan kegagalan operasi, dan mencatat konfirmasi tertunda.Lihat integrasi terukur dan percobaan ulang →

Pisahkan konfigurasi uji dari lisensi pelanggan.

Distribusikan hanya SDK yang diperlukan dan product.json. Tiap pelanggan memiliki kunci sendiri. Jangan sertakan sdk-demo.json, cache lisensi, kredensial perangkat, atau API Key pengelola. cache_path kosong memilih direktori privat pengguna.

Kenali tiga pengenal ini

NamaDigunakan olehTujuan
Kunci lisensi lv_lic_…Pembeli perangkat lunakAktifkan di aplikasi. Kode pindah perangkat sementara lv_tmp_… juga diisi di kolom yang sama.
ID produkSDK / Pengembang perangkat lunakMengenali produk yang divalidasi; boleh didistribusikan bersama aplikasi.
Kunci API manajemenServer vendorMengotomatiskan penerbitan, perpanjangan dan pengelolaan lisensi. Aktivasi klien tidak membutuhkannya.

Atur interval heartbeat dan durasi offline secara terpisah di Kebijakan lisensi. Masa berlaku dimulai pada aktivasi pertama. Tambahkan kuota fitur, kursi mengambang dan aktivasi berkas offline setelah integrasi dasar berjalan.

Tanpa mendaftar, Anda dapat membuka Coba demountuk melihat permintaan dan respons. Untuk penerbitan otomatis, lanjutkan ke Kunci API manajemen.

SDK klien

Berikan callback ke SDK: RunFeature untuk izin, RunMeteredFeature untuk penghitung. SDK menangani permintaan, tanda tangan, cache, dan heartbeat.

Sebelum menjalankan

Di konsol, Mulai cepatunduh paket terkonfigurasi. Demo memakai berkas pribadi sdk-demo.json; dalam aplikasi nyata, gunakan product.json, dengan kunci pelanggan sebagai parameter startup. Unduh SDK di bawah menyediakan sumber umum tanpa pengaturan produk Anda.

Apa arti setiap kolom konfigurasi?
product.json · Pengaturan produk bersama
{
  "base_url": "https://www.licentivo.com",
  "product_id": "PRODUCT_UUID",
  "license_key": "",
  "device_name": "Customer app",
  "app_version": "1.0.0",
  "trusted_keys": {
    "SIGNING_KEY_UUID": "BASE64URL_PUBLIC_KEY"
  },
  "timeout_seconds": 10,
  "allow_http": false
}
base_url
URL server lisensi: hanya domain dan port, tanpa /api/v1. Untuk pengujian lokal, gunakan https://127.0.0.1:8080.
product_id
ID produk aplikasi ini. Harus cocok dengan produk lisensi.
license_key
Kosongkan di product.json. Berikan kunci pelanggan ke OpenWithLicense: lv_lic_… atau kode pindah perangkat: lv_tmp_…; ini tidak mengubah konfigurasi bersama.
app_version
Versi saat ini berformat major.minor.patch, misalnya 1.0.0. Wajib jika rentang versi atau pemeliharaan aktif. Validasi online lagi setelah mengganti versi.
device_name
Nama perangkat yang tampil di konsol. Membantu mengenali perangkat, tetapi tidak menentukan identitasnya.
trusted_keys
ID kunci penandatanganan dan kunci publik produk. Distribusikan bersama aplikasi atau pembaruan terautentikasi. Jangan percaya kunci dari respons yang tidak dikenal.
cache_path
Hilangkan atau kosongkan untuk memakai direktori privat pengguna otomatis, atau tentukan lokasi privat aplikasi.
timeout_seconds
Batas waktu permintaan: default 10 detik, rentang 1–120. Gangguan jaringan sementara dicoba maksimal dua kali.
proxy_url
URL proxy opsional. Java memakai proxy HTTP; Node.js memerlukan undici jika proxy diatur. Verifikasi sertifikat tetap aktif.
allow_http
Pada produksi, tetap gunakan nilai false, menggunakan HTTPS. Untuk pengujian lokal, atur menjadi true, tetapi hanya untuk localhost atau alamat loopback.

Anda tidak perlu mengisi device_id: SDK membaca identitas lokal. Kunci publik di product.json dapat didistribusikan; simpan kunci pelanggan dan sdk-demo.json secara pribadi.

Pilih bahasa Anda

Kode ini sama dengan berkas paket dan membuat ekspor nyata. Variabel lingkungan menggantikan input aktivasi; gunakan UI sendiri dan pertahankan client selama aplikasi hidup.

Instalasi bersama dan rilis berversi

Pilih bahasa dan platform, lalu jalankan di proyek. SDK tersedia di situs Licentivo tanpa akun GitHub. Publikasi GitHub dan registry publik masih ditunda.

Perintah instalasi situs resmi

Versi: · Paket berversi · File checksum SHA-256 · Manifest rilis

Windows x64 dan Linux x64 telah diverifikasi. Validasi perangkat macOS dan ARM64 masih tertunda. Paket C/C++ dibedakan berdasarkan platform dan compiler.

Cara menggunakan SDK terinstal
BahasaIntegrasi proyek
Goimport licentivo "github.com/spf86/licentivo-sdk"
Javaimplementation(files('.licentivo-sdk/java/v0.10.0/licentivo-sdk-0.10.0.jar'))
C / C++find_package(Licentivo 0.10 REQUIRED) · target_link_libraries(MyApp PRIVATE Licentivo::C) / Licentivo::CPP
C#using Licentivo;
Pythonfrom licentivo import Client
Node.jsimport {Client} from '@licentivo/sdk'
Rustuse licentivo::Client;
Rubyrequire 'licentivo'

Simpan direktori .licentivo-sdk untuk Go, Rust serta C/C++ di proyek. Pilih versi baru saat memperbarui; product.json dan cache lisensi tetap dipertahankan.

Jalankan operasi terlindungi melalui SDK dan tutup client saat keluar.

Go · Lisensi klien
正在加载代码…

Jalankan berkas ini dengan skrip panduan awal →

Gunakan kunci pelanggan lain atau jalankan demo protokol lengkap

Atur variabel lingkungan lalu jalankan skrip tanpa opsi uji. Kunci lisensi bukan kunci API manajemen.

Variabel lingkungan terminal ini

Jika berhasil, keluarannya adalah License OK: export is available. Di aplikasi, ambil kunci dari formulir aktivasi. Pelanggan tidak perlu variabel lingkungan; SDK menyimpan kredensial mesin. Jangan tulis kunci ke log.

Jalankan demo lengkap dari paket

Ekstrak ZIP dengan struktur direktori tetap. Letakkan sdk-demo.json di direktori akar hasil ekstraksi. Pilih sistem, buka terminal di sana dan jalankan:

Perintah terminal

Demo melepas perangkat saat selesai.

Demo protokol lengkap ini untuk diagnosis lanjutan. Mulai dengan start.ps1 atau start.sh; contoh itu mempertahankan registrasi perangkat saat penutupan normal.

Jalankan contoh aplikasi

Contoh mencakup aktivasi, status, ekspor file, dan pelepasan perangkat. Java, Python, C# memakai jendela; lainnya menu terminal. Isi kunci sekali, lalu kosongkan untuk memulihkan.

Contoh aplikasi · bahasa dan sistem terpilih

Ekspor berhasil membuat licensed-report.txt. Atur kuota export pada kebijakan sebelum memakai ekspor terukur.

Demo jendela dan menu menunjukkan reservasi tingkat rendah. Gunakan RunMeteredFeature di bawah: kesembilan bahasa menyimpan konfirmasi tertunda. Setelah proses berhenti saat operasi, periksa hasil Anda.

Cara menampilkan status izin

Status dan FeatureStatus membaca lokal tanpa permintaan atau menunggu verifikasi latar belakang. Gunakan notifikasi untuk memperbarui UI.

StatusArti
activeVerifikasi daring terakhir berhasil; izin lokal valid.
offline_validTanda tangan lokal valid; konfirmasi daring belum berhasil sejak aplikasi dibuka.
verification_requiredTidak ada tanda tangan yang bisa dipakai. Aktifkan atau perbarui daring.
expired / revoked / releasedServer menolak izin secara tegas. Hentikan operasi yang dilindungi.
quota_exhaustedPermintaan terukur ini melampaui kuota; fitur lain yang diizinkan tetap tersedia.

allowed menunjukkan validitas izin lokal; fitur terukur tetap meminta kuota. lease_valid_until adalah tenggat cache bertanda tangan, bukan akhir lisensi. code, request_id, retryable menjelaskan kesalahan, acuan log, dan kemungkinan mencoba lagi.

Lihat sdk/README.md untuk metode, callback dan paket. Situs menyediakan paket berversi serta installer bersama; publikasi registry publik masih ditunda.

Di mana ini ditempatkan dalam aplikasi?

Tahap aplikasiYang harus dilakukan
Saat startup atau setelah kunci diisiPanggil OpenWithLicense (konstruktor dan Start pada C++). SDK mengaktifkan dan memulai heartbeat sesuai kebijakan.
Sebelum fitur berbayarBerikan callback ke RunFeature; gunakan RunMeteredFeature untuk penghitung
Selama aplikasi berjalanPertahankan client; SDK mengirim heartbeat sesuai interval kebijakan.
Saat aplikasi keluarClose / Dispose / Destroy menghentikan heartbeat, mengembalikan kursi mengambang dan mempertahankan pendaftaran terikat perangkat.
Saat pengguna melepas perangkatPanggil Deactivate, lalu tutup client.

Nama di tabel menunjukkan operasi; gunakan nama tepat pada contoh bahasa Anda. Untuk heartbeat, cache offline dan penyegaran online, lihat Heartbeat dan akses offline.

Kunci API manajemen

Gunakan API Key pengelolaan untuk menerbitkan lisensi otomatis dari sistem pesanan atau membaca data lisensi dari server. Key ini mewakili ruang kerja vendor Anda.

Kunci mana yang diperlukan klien?

KredensialPenerimaKegunaan
lv_api_…
Kunci API manajemen
Server Anda sendiriBuat produk, kebijakan dan lisensi; lihat perangkat, penggunaan dan audit
lv_lic_…
Kunci lisensi
Aplikasi pelangganAktivasi, validasi, heartbeat dan lepas perangkat
Kunci publik produkDistribusikan bersama klienVerifikasi tanda tangan lisensi server

Untuk validasi lisensi di aplikasi pelanggan, key lisensi cukup. API Key pengelolaan mengakses seluruh ruang kerja; jangan masukkan ke aplikasi pelanggan atau halaman publik.

Buat kunci

  1. Masuk sebagai Owner ruang kerja dan buka API Key lalu klik Buat API Key.
  2. Beri nama sesuai kegunaan, misalnya “Sistem pesanan”. Pilih Baca saja untuk mengambil data atau Baca/tulis untuk membuat atau mengubah lisensi. Masa berlaku 1–365 hari.
  3. Segera salin Key lengkap setelah menyimpan; hanya ditampilkan sekali. Simpan dalam konfigurasi privat server atau variabel lingkungan.

Kirim permintaan pengelolaan pertama

Contoh ini membaca daftar produk. Atur LICENTIVO_URL ke URL server lisensi dan atur LICENTIVO_API_KEY ke kunci lengkap yang baru dibuat, lalu jalankan:

curl
curl "$LICENTIVO_URL/api/v1/products?limit=25" \
  -H "Authorization: Bearer $LICENTIVO_API_KEY"

Sintaks ini untuk Bash/macOS/Linux. Di Windows PowerShell gunakan curl.exe; variabel lingkungannya adalah $env:LICENTIVO_URL dan $env:LICENTIVO_API_KEY. Contoh lengkap sembilan bahasa juga ada di Opsi API Key pengelolaan server di halaman SDK.

Berhasil mengembalikan HTTP 200 dengan data.items. Permintaan Bearer Key tidak perlu cookie login atau CSRF.

Izin dan pembatalan

Key baca saja melihat sumber daya; baca/tulis juga membuat dan mengubah produk, kebijakan, dan lisensi. Akun, tim, pengaturan sistem, dan pembayaran perlu login akun berwenang, bukan Key pengelolaan.

Cabut Key bocor atau tidak terpakai di konsol. Untuk menggantinya, klik Rotasi; Key lama langsung tidak berlaku. Lalu perbarui konfigurasi server.

Kuota API paket menghitung aktivasi, validasi, heartbeat, dan pelepasan. Permintaan pengelolaan ini tidak masuk kuota tersebut.

API produk dan lisensi

Terbitkan lisensi dari server Anda setelah pesanan: buat produk dan kebijakan, lalu lisensi untuk tiap pelanggan. Produk dan kebijakan biasanya cukup disiapkan sekali.

Buat dahulu di konsol dengan akses tulis Kunci API manajemen. Contoh berikut menggunakan Authorization: Bearer 你的管理Key; simpan kunci ini di server vendor.

Apa yang disimpan setelah pembuatan?

Gunakan data.id produk sebagai product_id dan data.id kebijakan sebagai policy_id. Setelah terbit, simpan data.id dan data.key lisensi. Key lengkap hanya dikembalikan sekali; key_prefix di daftar tidak bisa untuk aktivasi.

Untuk lisensi berjangka sebelum aktivasi,expires_at dan first_activated_at bernilai null. Durasi mulai pada aktivasi pertama; pindah tidak memberi durasi baru.

Pengelolaan lanjutan

Metode dan jalur (tanpa /api/v1)Tujuan dan isi permintaan
GET /productsAmbil daftar produk. Dalam respons, data.items berisi larik data dan data.total jumlah totalnya.
GET /licenses/{id}Lihat detail lisensi, aktivasi pertama dan kedaluwarsa.
POST /licenses/{id}/renewPerpanjang, mis. {"days":30}. Tetap memakai lisensi asli.
POST /licenses/{id}/revokeCabut; isi permintaan {}.
GET /products/{id}/public-keysBaca kunci publik produk tanpa autentikasi. Tetapkan kunci tepercaya saat distribusi SDK.
GET /activationsLihat ikatan perangkat dan sesi runtime.

Paginasi memakai limit=25&offset=0, limit maksimal 100. Parameter dan struktur lain di Berkas OpenAPI; lihat topik di kiri untuk tiap model lisensi.

Bagaimana memanggil dengan sesi browser?

Permintaan tulis dengan cookie browser perlu X-CSRF-Token. Lakukan GET /api/v1/auth/csrf, lalu isi header itu dengan data.csrf_token. Bearer Key tidak memerlukan CSRF.

Panggilan lisensi SDK

Pilih bahasa dan operasi, lalu panggil SDK. SDK menangani aktivasi, identitas perangkat, verifikasi tanda tangan, cache, heartbeat serta reservasi, konfirmasi dan pembatalan penggunaan.

Mulai atau layar aktivasiSebelum fitur berbayarSaat aplikasi keluar

Panggilan SDK

Dalam contoh, client berasal dari startup, path adalah jalur ekspor dan exportReport / export_report adalah fungsi bisnis Anda. jobID terukur adalah ID tetap yang disimpan aplikasi.

Lihat kode lengkap → · Mulai cepat · Lihat integrasi terukur dan percobaan ulang →

Letakkan kode bisnis di callback.

SDK menjalankan bisnis hanya jika diizinkan. RunFeature tidak mengurangi kuota; RunMeteredFeature mereservasi, mengonfirmasi keberhasilan dan membatalkan kegagalan. Ulangi tugas asli untuk konfirmasi tanpa mengulang bisnis yang selesai.

Buka permintaan dan respons HTTP (klien khusus atau pemecahan masalah)

Protokol di bawah sudah diterapkan oleh SDK. Aplikasi yang memakai sembilan SDK ini tidak perlu menerapkannya lagi.

Aktivasi pertamaHeartbeat saat berjalanPeriksa akses sebelum operasi bisnisLepaskan sebelum pindah perangkat

Delapan endpoint memakai lisensi dan identitas perangkat, tanpa cookie login, CSRF, atau kunci vendor. Sesi floating dilepas saat keluar; perangkat terikat tetap terdaftar.

Bagaimana memeriksa akses setelah aktivasi, validasi atau heartbeat?

  1. Pastikan HTTP 200 lalu baca data.activation_id. Sertakan ID ini pada validasi, heartbeat, penghitungan dan pelepasan berikutnya.
  2. Verifikasi dengan kunci publik produk yang dipercaya sebelumnya data.lease lalu cocokkan produk, perangkat, masa berlaku, dan fitur. Membaca payload sebagai JSON saja tidak membuktikan lisensi sah.
  3. SDK otomatis menangani dua langkah pertama. RunFeature memeriksa izin sebelum operasi; RunMeteredFeature mengelola reservasi, konfirmasi, dan pembatalan penghitung.

SDK menyimpan cache bertanda tangan dan heartbeat sesuai kebijakan. Jangan hapus cache sah hanya karena timeout. Jika jelas dicabut, dilepas, atau kedaluwarsa, blokir fitur terlindungi sesuai hasil SDK.

Apa arti kolom payload setelah dekode?

Contoh berikut hanya untuk memahami data. Untuk verifikasi tanda tangan sendiri, gunakan byte payload asli yang diterima; jangan urutkan ulang atau serialisasikan JSON.

Contoh payload

Percobaan ulang, heartbeat dan tagihan

Wajib untuk aktivasi, pelepasan dan penghitungan Idempotency-Key, maksimal 80 karakter tanpa spasi. Operasi baru memakai nilai baru; percobaan ulang mempertahankan nilai dan isi yang sama. Opsional untuk validasi dan heartbeat; SDK mengelola ID permintaannya.

Tiap aktivasi, validasi, heartbeat, atau pelepasan berhasil memakai satu panggilan API platform. Gagal dan ulang idempoten tidak dihitung lagi; CheckFeature lokal tanpa server. Consume hanya mengurangi pemakaian fitur, bukan kuota API ini; quantity adalah jumlah pemakaian fitur.

Interval, durasi offline dan permanen mengikuti Kebijakan lisensi.payload.expires_at adalah waktu habis cache bertanda tangan saat ini, bukan akhir lisensi. Lihat detail lisensi untuk tanggal akhirnya.

Heartbeat dan akses offline

Keduanya di Kebijakan lisensi, tetapi berbeda: seberapa sering menghubungi server saat online, dan berapa lama aplikasi boleh berjalan tanpa terhubung.

Interval: seberapa sering validasi

Isi Interval heartbeat (detik) dengan 600, SDK mengirim heartbeat sekitar setiap 10 menit saat berjalan. Setiap keberhasilan mengambil aturan terbaru dan memperbarui cache lisensi lokal.

Isi 600–86400 detik. Isi 0 mematikan heartbeat terjadwal. Aplikasi masih bisa memverifikasi atau memperbarui manual. Jadwal menambah penundaan acak 0–10%; interval tidak kurang dari 600 detik.

Dengan lisensi terikat perangkat dan cache valid, akses dipulihkan lalu diperbarui daring di latar belakang, meski timer mati. Lisensi wajib daring dan kursi mengambang menunggu server.

Durasi offline: lama penggunaan tanpa server

Mode offline punya tiga pilihan. Tidak mengubah interval heartbeat.

Izinkan selama durasi tertentu
Jika 24 jam, cache berlaku maksimal 24 jam sejak validasi online terakhir berhasil. Aplikasi tetap berjalan saat koneksi putus atau server sementara gagal dalam durasi itu. Sesudahnya, validasi online harus berhasil.
Fallback offline dilarang
Saat mulai, koneksi ke server harus berhasil; cache disk tidak meloloskan permintaan gagal. Tanda tangan sementara saat berjalan berlaku maksimal max(10, 心跳间隔) detik; aplikasi harus terus memvalidasi dan memeriksa izin fitur.
Izinkan akses offline permanen
Tanda tangan lokal dapat dipakai jangka panjang termasuk saat jaringan gagal. Lisensi 30 hari tetap habis setelah 30 hari; offline permanen tidak menjadikannya lisensi abadi.

API memakai offline_mode mewakili tiga pilihan ini, berurutan limited, none, permanent. Dengan durasi offline tertentu,offline_seconds adalah 1–31536000 detik; mode lain memakai 0.

Bagaimana kombinasi ini bekerja?

Pengaturan heartbeat / offlinePerilaku nyata
10 menit / 24 jamValidasi tiap 10 menit saat online. Offline, maksimal 24 jam sejak validasi terakhir berhasil
10 menit / offline permanenTetap mencoba heartbeat tiap 10 menit, memperbarui aturan jika berhasil dan memakai tanda tangan valid jika tak terjangkau.
0 / offline permanenDengan cache sah, mulai tanpa permintaan terjadwal. Validasi atau refresh eksplisit tetap menghubungi server
0 / 24 jamTanpa heartbeat terjadwal, cache tetap kedaluwarsa. Aplikasi menjadwalkan validasi; mematikan heartbeat tidak memperpanjang offline.

Buat durasi offline lebih panjang daripada interval heartbeat. Jika heartbeat tiap jam tetapi offline hanya 1 menit, tanda tangan habis sebelum heartbeat berikutnya; aplikasi harus memvalidasi sendiri.

Apakah perubahan kebijakan memperbarui lisensi lama?

Ya. Aturan heartbeat atau offline baru berlaku pada lisensi lama dan baru yang terkait saat aktivasi, validasi, atau heartbeat berikutnya berhasil. SDK mengganti cache bertanda tangan. Retry dengan Idempotency-Key sama tetap mengembalikan hasil awal.

Perangkat offline tetap memakai aturan bertanda tangan yang lama. Tersambung kembali saja tidak mengubah cache; harus ada permintaan berhasil. Aplikasi dapat menyegarkan saat koneksi pulih.

Ini memperbarui aturan runtime.

Masa berlaku, batas perangkat, dan fitur tersimpan tiap lisensi. Mengubah kebijakan tidak otomatis menimpanya. Ubah hak tiap lisensi di halaman Lisensi.

Segarkan online langsung

Metode ini selalu mencoba server, meski offline permanen dan heartbeat mati. Berhasil memperbarui tanda tangan; gagal jaringan melaporkan error refresh tetapi menyimpan cache yang masih sah. Pencabutan atau pelepasan tegas menghapusnya.

BahasaCara memanggil
Goclient.RefreshOnline(ctx)
Javaclient.refreshOnline()
Cln_refresh_online(client)
C++client.RefreshOnline()
C#await client.RefreshOnline()
Pythonclient.refresh_online()
JavaScriptawait client.refreshOnline()

Refresh berhasil dihitung satu permintaan aktivasi API. Jika kebijakan mengaktifkan heartbeat yang sebelumnya mati, panggil StartHeartbeat bahasa terkait untuk menjadwalkan. Perangkat offline tidak menerima pembaruan pencabutan atau pelepasan.

Pengikatan perangkat

Pada lisensi satu perangkat, menyalin aplikasi dan cache ke komputer biasa lain tidak memindahkan izin komputer asal.

Bagaimana SDK mengenali komputer?

Setiap mulai, SDK membaca identitas mesin OS dan menghitung hash bersama ID produk. Tanda tangan server memuat hash tersebut, yang juga diperiksa lokal.

Windows membaca MachineGuid, Linux machine-id, macOS IOPlatformUUID. Identitas asli tidak dikirim, hanya hash hasil perhitungan. Kolom konfigurasi lama device_id tidak mengganti identitas lokal sebenarnya.

Apa yang terjadi jika berkas mesin A disalin ke B?

  1. A aktif dan menerima tanda tangan terikat hash A.
  2. B membaca identitas sendiri, hash berbeda dan menolak cache A.
  3. B harus aktivasi online. Jika batas satu perangkat dan A masih terikat, server menolak B.

Bagaimana pelanggan mengganti komputer?

Pelanggan melepas komputer lama lalu mengaktifkan yang baru. Jika rusak, lepaskan di Aktivasi perangkat pada konsol. Pindah komputer tidak mengulang masa berlaku lisensi.

Instal ulang sistem bisa mengubah identitas dan memerlukan aktivasi perangkat baru. Kloning OS penuh, pemalsuan identitas, atau modifikasi klien merupakan serangan lebih kuat; hash ini saja tidak menjamin pencegahannya.

Dengan offline lama, tanda tangan lama A tidak segera tahu bahwa telah dilepas. Permintaan server yang berhasil memperbarui status. Durasi offline lebih panjang menunda pembatasan jarak jauh.

Hash perangkat lintas bahasa
Tujuh SDK memakai algoritma sama
SHA256(UTF8(
  "LicenovaDevice/v2\n"
  + lower(product_id) + "\n"
  + lower(trim(OS_machine_identity))
))

Kuota dan penagihan

Kuota perangkat menghitung perangkat terpakai; API menghitung permintaan server berhasil. Keduanya terpisah; jumlah perangkat tidak menentukan pemakaian API.

Operasi mana dihitung dalam kuota API?

TindakanDihitung?
Aktivasi, validasi, heartbeat atau pelepasan berhasilSetiap sukses dihitung sekali; heartbeat pada hari yang sama masing-masing dihitung.
Permintaan gagal, mis. kunci salah atau kuota kurangTidak dihitung
Ulangi dengan Idempotency-Key sama dan kembalikan hasil asliTidak dihitung ulang
CheckFeature lokal atau pemeriksaan cache bertanda tanganTidak dihitung; tanpa permintaan server
Cari atau terbitkan lisensi dengan API Key pengelolaanTidak masuk kuota API runtime ini

Apakah permintaan berulang menghitung perangkat lagi?

Tidak. Dalam satu periode, perangkat sama pada produk sama dihitung sekali, tetapi tiap heartbeat berhasil dihitung API. Melepas tidak menghapus pemakaian sebelumnya.

Contoh: 100 perangkat, 8 jam sehari, 22 hari sebulan, heartbeat tiap 10 menit. Heartbeat saja menghasilkan 105.600 panggilan. Tambah 100 aktivasi dan satu validasi tambahan per perangkat per hari, total 107.900 panggilan.

Validasi tambahan adalah asumsi contoh; jumlah aktual tergantung aplikasi. Di Estimasi penggunaan online ubah perangkat, durasi dan interval.

Bagaimana biaya kelebihan paket?

Paket 100.000 panggilan dan 0,0001 USD per ekstra: 120.000 panggilan berhasil berarti 20.000 ekstra, dengan biaya API 2 USD.

Kelebihan yang diizinkan memotong saldo sesuai harga admin. Total kumulatif dibulatkan ke sen dan hanya kenaikannya ditagih, agar harga kecil per panggilan tidak terkena pembulatan berulang.

Kelebihan perangkat terpisah: perangkat ekstra × harga per perangkat. Batas keras menolak permintaan lebih; saldo kurang juga menolak permintaan berbayar berikutnya. Penolakan tidak menambah pemakaian.

API tanpa batas tidak memiliki biaya ekstra. Nol berarti tidak ada panggilan gratis; aturan kelebihan berlaku dari permintaan pertama berhasil. Kuota, harga, dan batas ada di Paket saat ini, angka ini hanya contoh.

Kapan durasi dan kuota paket dimulai?

Beli 1, 3, 6, atau 12 bulan. Bayar total sekali; paket aktif setelah pembayaran berhasil.

Kuota direset bulanan sejak aktivasi. Mulai 31 Januari direset pada akhir Februari lalu 31 Maret. Sisa tidak diteruskan.

Tanpa pembelian, aturan admin berlaku per bulan kalender UTC. Perangkat lewat tagihan bulanan; kelebihan API langsung memotong saldo. Paket dibeli memakai kuota periodenya, tidak ditambah kuota bawaan.

Penolakan karena kuota atau saldo tidak membatalkan tanda tangan offline yang mengikuti aturan semula. Vendor bisa melepas perangkat di konsol tanpa memakan kuota API runtime pelanggan.

Kursi mengambang

Lisensi floating membatasi program yang berjalan bersamaan. Cocok untuk pemakaian bergantian, tanpa membeli lisensi tiap komputer.

Contoh

Untuk 100 komputer dan 10 kursi, 10 program pertama berjalan; yang ke-11 menerima “Kursi penuh”. Setelah program keluar dan menutup SDK dengan normal, kursi tersedia. Dua program di satu komputer memakai dua kursi.

Atur pada kebijakan

Pilih kursi mengambang dengan batas 10. Interval heartbeat minimal 600 detik; sewa kursi harus lebih lama, misalnya 1200 detik. Heartbeat memperpanjang sewa; setelah crash atau putus jaringan, kursi bebas saat sewa berakhir.

Lisensi floating dapat putus sebentar selama sewa. Waktu offline juga dibatasi sewa; tidak mendukung offline permanen atau aktivasi pertama sepenuhnya offline lewat berkas.

Apa lagi yang perlu ditangani kode aplikasi?

Gunakan Open/Start lalu penutupan normal. SDK membuat ID sesi tiap client. Jangan buat client tiap ekspor; pertahankan satu sampai aplikasi keluar.

Cache floating lama tidak otomatis memulihkan kursi saat proses mulai lagi. Jika sewa habis, aktivasi ulang dan ambil kursi sebelum melanjutkan.

Aktivasi offline

Untuk komputer sepenuhnya offline, aktivasi pertama memakai berkas permintaan dan respons bertanda tangan. Bawa permintaan dengan USB ke komputer online.

Langkah

  1. Di komputer tujuan, muat konfigurasi SDK, panggil OfflineRequest("activate"), lalu simpan berkas. Pembuatannya tidak mengakses server.
  2. Di komputer online, buka Aktivasi berkas offline di konsol, unggah permintaan, unduh respons. Pelanggan akhir juga dapat memakai portal pelanggan.
  3. Bawa respons kembali dan panggil ImportOffline dengan permintaan asli dan respons. SDK memeriksa tanda tangan, ID, versi, serta identitas mesin sebelum menyimpan cache.
  4. Periksa izin dengan CheckFeature. Komputer offline tidak perlu heartbeat online; durasinya ditentukan kebijakan lisensi.

Aktivasi berkas hanya untuk lisensi terikat yang mengizinkan offline. Permintaan berlaku 30 hari. Lisensi berjangka mulai saat server menyetujui, karena waktu impor respons tidak diketahui server.

Bagaimana melepas offline?

Di komputer asal, buat OfflineRequest("deactivate"). SDK menghapus cache dahulu, lalu ajukan ke vendor atau portal. Penghapusan tidak membuktikan tiadanya salinan lama. Untuk penghentian cepat, pilih validasi online berkala.

Nama tiap bahasa

BahasaBuat permintaanImpor respons
GoOfflineRequest("activate") → []byteImportOffline(requestBytes, responseBytes)
JavaofflineRequest("activate") → teks JSONimportOffline(requestText, responseText)
JavaScriptofflineRequest("activate") → objectimportOffline(requestObject, responseObject)
Cln_offline_request(client, "activate")ln_import_offline(client, requestText, responseText)
C++ / C#OfflineRequest("activate") → teks JSONImportOffline (teks C++, byte C#)
Pythonoffline_request("activate") → dictimport_offline(requestDict, responseDict)

Di C, bebaskan teks hasil dengan ln_free_string. Masukkan isi berkas respons, bukan pembungkus data dari API web.

Batas penggunaan fitur

Izin ekspor berbeda dari 500 ekspor per bulan. RunFeature memeriksa izin; RunMeteredFeature mengonfirmasi penggunaan setelah berhasil.

Izinkan 500 ekspor per bulan

Tambahkan export ke fitur kebijakan dan kuota: export, 500, Bulanan. Secara bawaan ditolak saat habis. Untuk kelebihan, atur jumlah maksimalnya; sistem mencatat kelebihan untuk sistem pesanan Anda.

Kuota harian dan bulanan reset tengah malam UTC; kuota total tidak reset. Perubahan batas tidak menghapus pemakaian.

Konfirmasi pemakaian setelah ekspor berhasil

Berikan callback operasi ke SDK. Tugas baru memakai ID baru; percobaan ulang mempertahankan ID, fitur, dan jumlah. Jangan jalankan ID sama bersamaan di proses berbeda.

BahasaPanggilan operasi terukur
Goclient.RunMeteredFeature(ctx, "export", 1, jobID, exportReport)
Javaclient.runMeteredFeature("export", 1, jobID, this::exportReport)
Node.jsawait client.runMeteredFeature("export", 1, jobID, exportReport)
Pythonclient.run_metered_feature("export", 1, job_id, export_report)
C#await client.RunMeteredFeature("export", 1, jobID, ExportReport)
C++client.RunMeteredFeature("export", 1, jobID, exportReport)
Rustclient.run_metered_feature("export", 1, &job_id, || export_report())?
Rubyclient.run_metered_feature("export", 1, job_id) { export_report }
Cln_run_metered_feature(client, "export", 1, job_id, export_report, context)

Atur kuota export dahulu. Tambahkan -Metered -OperationID export-job-001 di Windows atau --metered --operation-id export-job-001 di Linux/macOS.

SDK menyimpan konfirmasi tertunda.

Jika operasi berhasil tetapi konfirmasi gagal, percobaan ulang hanya mengonfirmasi. Crash saat operasi memblokir eksekusi ulang otomatis. Periksa hasil tersimpan, lalu gunakan ResolveMeteredFeature untuk konfirmasi atau batal. Penggunaan jarak jauh dan operasi lokal bukan satu transaksi.

Jika perlu mengendalikan reservasi sendiri
  1. Buat dan simpan ID tugas untuk ekspor ini.
  2. Reservasikan satu unit dan ekspor hanya setelah pending. committed berarti sudah selesai; jangan ulangi.
  3. Setelah ekspor berhasil dan hasil disimpan, panggil Commit untuk mengonfirmasi pemakaian.
  4. Jika ekspor gagal sebelum selesai, panggil Cancel untuk melepas reservasi tanpa mengurangi unit.

Reservasi default 15 menit, lebih pendek saat reset UTC. Pemanggil API dapat menetapkan reservation_seconds 30–3600 detik.

BahasaReservasiKonfirmasi / Batalkan
GoReserve(ctx, "export", 1, jobID)Commit / Cancel(ctx, hold.ID, jobID)
Java / Node.jsreserve("export", 1, jobID)commit / cancel(id, jobID)
Cln_reserve(client, "export", 1, jobID)ln_commit / ln_cancel(client, id, jobID)
C++ / C#Reserve("export", 1, jobID)Commit / Cancel(id, jobID)
Pythonreserve("export", 1, jobID)commit / cancel(id, jobID)

Cara membaca kolom respons

KolomArti
reservation_id / operation_idID reservasi dan ID tugas asli; gunakan nilai yang sama saat mencoba lagi.
status / expires_atStatus dan tenggat: pending menunggu selesai, committed terhitung, canceled dilepas, expired kedaluwarsa.
consumption.used / reservedPemakaian terkonfirmasi periode ini / unit yang ditahan semua reservasi aktif.
consumption.limit / remainingKuota dasar / unit dasar tersedia. remaining = max(0, limit - used - reserved), tanpa kelebihan yang diizinkan.
consumption.quantity / overageUnit tugas ini / unit terkonfirmasi di atas kuota dasar; tidak menarik pembayaran pelanggan.
consumption.period / reset_atPeriode UTC / reset berikutnya; kuota seumur hidup memiliki reset_at = null.

Lihat isi permintaan, respons, dan tipe kolom pada Reserve, Commit, dan Cancel di referensi API runtime.

Jika konfirmasi melewati batas waktu, ulangi hanya konfirmasi.

Setelah berhasil, jangan batalkan atau ekspor ulang. Simpan ID dan hasil lalu ulangi Commit. Jika reservasi kedaluwarsa, simpan tugas untuk rekonsiliasi. Pemakaian jarak jauh dan operasi lokal bukan satu transaksi atomik.

Consume tetap langsung menghitung. Gunakan reservasi agar pekerjaan gagal tidak terhitung. Semua endpoint pemakaian fitur perlu koneksi dan tidak masuk empat operasi API berbayar platform.

Versi dan pemeliharaan

Pembelian permanen memungkinkan penggunaan terus, tetapi bukan selalu pembaruan gratis selamanya. Masa pemeliharaan menentukan versi berdasarkan tanggal rilis.

Beli versi saat ini, pembaruan gratis setahun

Atur kebijakan Permanen dan pemeliharaan 365 hari, mulai aktivasi pertama. Terbitkan 1.0.0, 1.1.0, dan lainnya di Versi aplikasi dengan tanggal rilis sebenarnya.

Versi yang dirilis saat pemeliharaan tetap dapat digunakan. Versi setelahnya ditolak, versi lama tetap berjalan. Setelah pelanggan memperpanjang, ubah masa di Hak dan pelanggan lisensi.

Bagaimana aplikasi mengirim versinya?

Isi app_version di sdk-demo.json, misalnya 1.1.0. Jika memakai pemeliharaan, terbitkan di konsol dahulu. Hanya tiga angka seperti 1.2.3 diterima. Tanggal rilis tidak dapat diubah agar hak terjual tetap.

Untuk hanya 1.x, atur 1.0.0–1.999.999 tanpa pemeliharaan. Setelah pembaruan, online untuk mendapat tanda tangan versi baru; cache versi lama tidak dapat dipakai langsung.

Sediakan unduhan

Catatan versi dapat memuat URL HTTPS dan SHA-256. Portal hanya menampilkan versi yang diizinkan. Catatan memberi tautan, bukan mengunggah installer atau memasang pembaruan otomatis.

Portal pelanggan

Pelanggan dapat melihat lisensi dan perangkat serta melepas ikatan tanpa masuk konsol vendor.

Vendor mengaitkan email pelanggan dahulu

Isi email saat penerbitan atau Hak dan pelanggan. Kirim Portal pelanggan kepada pelanggan. Email tersebut menerima tautan login sekali pakai, berlaku 15 menit. Sesi login bertahan 24 jam.

Pelanggan hanya melihat lisensi email itu, bukan pengelolaan produk, tagihan, atau data pelanggan lain. Siapkan layanan email di pengaturan administrator dahulu.

Bagaimana jika pelanggan kehilangan kunci saat ganti komputer?

  1. Pelanggan mengisi email yang terkait lisensi lalu membuka tautan login. Tautan hanya untuk masuk, bukan langsung melepas perangkat.
  2. Di Perangkat/sesi saya, pilih lama, Lepaskan dan pindah lalu konfirmasi.
  3. Halaman menampilkan kode sementara, berlaku maksimal 15 menit dan satu aktivasi berhasil. Pelanggan dapat menyalin atau memilih pengiriman ke email sendiri.
  4. Buka aplikasi di komputer baru dan masukkan kode sementara di layar aktivasi. SDK mengenali komputer, mengikat lisensi lama, dan menyimpan kredensial perangkat. Mulai ulang dan heartbeat memakai kredensial; kode habis tidak mengganggu aktivasi.

Hanya ikatan perangkat yang berubah. ID, kedaluwarsa asli, fitur, pelanggan, dan pemakaian tetap; tidak terbit lisensi baru. Perangkat baru harus memenuhi kebijakan asli dan ada slot kosong.

Apa yang perlu diubah vendor perangkat lunak?

Perbarui ke SDK terkini. Kolom key lisensi juga dapat menerima lv_tmp_ kode sementara; isi pada konfigurasi license_key sudah cukup; Start, validasi, dan heartbeat tetap berjalan seperti biasa. SDK menyimpan kredensial perangkat di direktori cache privat;cache_path boleh kosong. Simpan file di direktori data pengguna saat ini; jangan sertakan dalam installer.

Setelah penukaran berhasil, aplikasi dapat mengosongkan license_key kosong; pertahankan produk, kunci publik dan cache_path, SDK memulihkan kredensial perangkat saat mulai ulang. Pelanggan tidak perlu menyimpan atau mengetik ulang kode sementara. Sebelum penukaran berhasil, simpan input agar bisa dicoba ulang setelah terputus.

Jika kode habis atau halaman ditutup

Masuk lagi untuk melihat kode belum dipakai. Setelah kode itu habis, pilih Lihat/ambil kode pada perangkat dilepas untuk menerbitkan ulang tanpa hitungan pindah tambahan. Kode terpakai tidak dapat ditukar lagi atau diambil berulang dari data lama untuk melewati batas. Pindah lagi harus melepas perangkat aktif sekarang.

Jika komputer baru sepenuhnya offline

Masukkan kode sementara di komputer baru lalu ekspor permintaan SDK. Sebelum kode habis, bawa ke komputer online, buat respons di portal, dan impor di komputer baru. Kebijakan harus mengizinkan aktivasi offline terikat perangkat. Masa lisensi lama tetap; lindungi berkas berisi izin dan kredensial mesin.

Batas pelepasan dan komputer lama

Atur batas pelepasan mandiri per lisensi per bulan UTC. Nol mematikan pelepasan baru di portal. Klik ulang, melihat kode, dan penerbitan ulang kode belum dipakai yang habis tidak menambah hitungan. Batas untuk portal dan pelepasan offline pelanggan, bukan vendor manual atau aplikasi dengan key lisensi asli.

Pelepasan jarak jauh memblokir validasi online berikutnya. Cache offline lama bertahan sampai online atau habis. Cache permanen tidak bisa dihentikan segera dari jauh; gunakan online berkala untuk pencabutan cepat. Salinan konfigurasi, kredensial, dan cache biasa di komputer lain ditolak karena identitasnya berbeda.

Portal pelanggan mengelola penggunaan lisensi. Pesanan dan pembayaran penjualan aplikasi tetap di sistem vendor sendiri.

Notifikasi peristiwa

Saat aktivasi, perpanjangan, atau pencabutan, Licentivo dapat memberi tahu server untuk sinkronisasi pesanan, pelanggan, dan dukungan.

Tambah alamat notifikasi

Buka Notifikasi peristiwa lisensi, tambahkan URL HTTPS dan pilih peristiwa. Rahasia tanda tangan ditampilkan sekali saat menyimpan; simpan di server penerima. Produksi melarang alamat lokal atau jaringan privat.

Periksa tanda tangan setelah diterima

Baca X-Licentivo-Timestamp, X-Licentivo-Event, dan isi mentah. Gabung timestamp + '.' + ID peristiwa + '.' + isi, hitung HMAC-SHA256 dengan rahasia, tambah sha256= dan bandingkan X-Licentivo-Signature dalam waktu konstan. Tolak selisih lebih dari 5 menit.

Hilangkan duplikat berdasarkan ID peristiwa. Verifikasi tanda tangan, masukkan ke transaksi atau antrean, lalu 2xx setelah tersimpan permanen. Duplikat cukup 2xx tanpa mengulang pesanan.

Apa yang terjadi jika gagal?

Maksimal 8 percobaan otomatis dengan jeda bertambah. Konsol menampilkan status HTTP, waktu, dan error serta kirim ulang manual. Peristiwa dan operasi lisensi dalam satu transaksi; pengiriman berlanjut setelah restart.

Peristiwa: pembuatan, perubahan, perpanjangan, pencabutan, aktivasi, pelepasan, konsumsi fitur, mendekati kedaluwarsa, kedaluwarsa, dan perubahan pemeliharaan. Notifikasi hanya memuat awalan lisensi, bukan key lengkap.

Operasi massal dan perubahan kebijakan

Terbitkan, perpanjang, atau cabut sekaligus untuk kelompok pelanggan. Pratinjau dampak sebelum mengubah hak lisensi lama.

Terbitkan massal atau impor

Di Lisensi, pilih Terbitkan/impor massal, produk, dan kebijakan. Isi nama serta email per baris atau CSV dengan header customer,customer_email. Maksimal 100 baris. Unduh hasil dan simpan kode lengkap.

Jika satu item gagal, seluruh batch tidak berlaku. Setelah timeout, ulangi tanpa mengubah isi; ID permintaan mengembalikan hasil awal, bukan menerbitkan ulang.

Perpanjang atau cabut massal

Pilih lisensi di kiri lalu Perpanjang atau Cabut massal. Kotak header memilih halaman ini; pilihan tetap saat pindah halaman, maksimal 100. Mengubah filter, meninggalkan Lisensi, atau refresh menghapus pilihan.

Isi hari tambahan. Belum aktif menambah durasi; aktif memperpanjang kedaluwarsa; habis memperpanjang dari sekarang. Sebelum mencabut, buka pilihan untuk cek pelanggan. Pencabutan tidak bisa dipulihkan; anggota baca saja tidak boleh melakukannya.

Terapkan kebijakan baru ke lisensi lama

  1. Simpan aturan baru pada Kebijakan lisensi.
  2. Pilih lisensi lama dari satu produk, pilih Terapkan kebijakan dan kebijakan baru.
  3. Tinjau durasi, perangkat/kursi, fitur, pemakaian, dan pemeliharaan. Kursi terpakai melebihi batas baru, atau perangkat aktif saat ganti mode, harus ditangani dahulu.
  4. Terapkan setelah konfirmasi. Validasi online berikutnya menerima izin bertanda tangan baru; cache sepenuhnya offline tidak diubah jarak jauh.

Pratinjau berlaku 10 menit. Jika lisensi atau kebijakan berubah, ulangi. Durasi baru menghitung kedaluwarsa dari aktivasi pertama asli; periksa tanggal dahulu.

Pertanyaan umum

Periksa kode kesalahan dahulu, lalu pengaturannya. Dalam respons, request_id membantu mencari operasi di log. Jangan taruh kunci lengkap dalam log/screenshot.

Apa yang diperiksa jika aktivasi gagal?

Periksa akses ke server, ID produk, kode lisensi lengkap, dan kecocokan produk. Jika server belum diterapkan, komputer pelanggan tidak bisa memakai alamat Anda 127.0.0.1 ; alamat itu menunjuk komputer pelanggan sendiri.

Kode kesalahanLangkah pertama
LICENSE_INVALIDCek ID produk, kunci lengkap dan produk lisensi
LICENSE_EXPIREDLihat kedaluwarsa; vendor memperpanjang bila perlu
LICENSE_REVOKED
DEVICE_RELEASED
Lisensi dicabut/perangkat dilepas; SDK hapus cache
DEVICE_LIMIT_REACHEDSlot lisensi penuh; lepas lama atau tambah batas
API_QUOTA_EXCEEDEDKuota keras API habis; lihat periode/paket
API_BALANCE_INSUFFICIENTSaldo kelebihan API kurang; cek mata uang/lingkungan
MONTHLY_QUOTA_EXCEEDEDBatas perangkat platform habis, terpisah dari batas lisensi
IDEMPOTENCY_CONFLICTKey sama untuk isi berbeda; operasi baru Key baru, ulang isi asli
IDEMPOTENCY_EXPIREDRespons/ikatan lama batal; cek status, Key baru untuk operasi baru

Mengapa masih berfungsi saat offline?

Offline tetap memeriksa tanda tangan server, produk, perangkat, fitur, dan kedaluwarsa lokal; hanya tanpa permintaan server. Cache habis atau penolakan tegas online karena pencabutan/pelepasan menghentikan pemakaian.

Mengapa verifikasi tanda tangan atau perangkat gagal?

Kunci publik tidak cocok, cache produk lain, atau cache yang disalin ke komputer berbeda bisa menyebabkan kegagalan. Periksa trusted_keys memakai ID key dan kunci publik produk saat ini, lalu periksa apakah sistem diganti atau dipasang ulang.

SDK melaporkan clock rollback : cek jam mundur. Perbaiki lalu segarkan online.

Respons kesalahan lengkap

HTTP 403 · lisensi dicabut
{
  "error": {
    "code": "LICENSE_REVOKED",
    "message": "License was revoked"
  },
  "request_id": "99999999-9999-4999-8999-999999999999"
}
KolomArti dan tindakan
error.code · stringID kesalahan stabil untuk logika, bukan teks message.
error.message · stringAlasan kegagalan untuk diagnosis atau pesan pelanggan.
request_id · UUIDID permintaan server untuk log, bukan lisensi/Idempotency-Key.

400/415: perbaiki kolom atau Content-Type; 401: periksa Key; 403: tangani kode lisensi terkait; 409: periksa kuota, sesi, atau konflik idempotensi; 429: tunggu sesuai Retry-After. Ulangi timeout atau 5xx dengan jeda. Permintaan tulis harus memakai ID dan isi semula agar tidak dihitung dua kali.

Bagaimana membaca respons JSON?

Respons berhasil data dan request_id; kegagalan mengembalikan error.code, error.message dan request_id. Simpan kode kesalahan dan request_id untuk diagnosis.

Untuk email, pembayaran atau deployment, lihat Dukungan dan pemecahan masalah.