Aller au contenu
Documentation développeurDémarrage rapide

Ajoutez des licences à votre logiciel

Prévoyez environ 15 minutes pour protéger un export : configuration, exemple, intégration et test de refus. Les outils du langage doivent être déjà installés.

Le SDK gère requêtes, appareil, signatures, identifiants, cache et signaux. Fournissez la clé saisie et votre fonction métier ; ni HTTP manuel ni stockage d’activation_id requis.

  1. Télécharger le paquet d’intégrationGénérez les paramètres du produit dans la console
  2. Générer un fichier exportéVérifier l’autorisation et le résultat métier
  3. Intégrez à votre applicationDémarrage, entrée métier, arrêt

1. Préparez le paquet dans la console

Ouvrez Démarrage rapide, saisissez le nom du logiciel, choisissez une licence liée aux appareils ou flottante, puis créez le produit et continuez. Le système prépare le produit, la règle, la licence de test, la clé publique et la version 1.0.0. Choisissez un langage, téléchargez le paquet configuré et extrayez-le.

Le paquet contient deux configurations :sdk-demo.json contient une clé de licence de test pour vos essais ;product.json contient uniquement les paramètres du produit et la clé publique, et peut être distribué avec votre logiciel.

Pour commencer, choisissez une licence liée à l’appareil. L’exemple active export sans compteur. Pour un produit existant, autorisez la fonction dans la stratégie et la licence.

2. Vérifier l’environnement et exporter un fichier

Ouvrez un terminal à la racine extraite. Gardez product.json, sdk-demo.json, start.ps1, start.sh et sdk ensemble. Choisissez langage et système, puis exécutez. Le contrôle n’envoie pas d’activation.

Exécuter dans le dossier extrait

Résultat attendu :Code 0, sortie ci-dessous et nouveau licensed-report.txt. Relancez sans option de test : le SDK restaure l’identifiant de l’appareil sans occuper une autre place.

Sortie réussie
License OK: export is available
Export completed: licensed-report.txt

Installez les outils manquants. C/C++ nécessite aussi les fichiers de développement libcurl ; MinGW accepte -CurlRoot. Accepter un avertissement du navigateur ne suffit pas : l’environnement doit faire confiance au certificat du serveur de test.

3. Intégrez-le à l’application du client

Lancez l’installateur dans votre projet. Les neuf langages utilisent 0.10.0. SHA-256 est vérifié avant installation ou extraction. Ajoutez uniquement product.json aux ressources.

Ajouter à un projet existant

Installer hors ligne depuis le paquet d’intégration téléchargé

Remplacez SDK_ROOT par le chemin absolu du dossier extrait.

Dépendance source locale

Fichier exécutable pour ce langage :. Copiez son point d’entrée métier dans votre projet ; Voir le code complet →

Étape de l’applicationAction à effectuer
Démarrage ou écran d’activationFournissez product.json et la clé du client. Après activation, passez une clé vide aux démarrages suivants. Une application graphique active en arrière-plan.
Bouton, raccourci, menu ou commande d’exportationPassez votre fonction d’export à RunFeature. Le SDK vérifie l’autorisation avant de l’appeler. Gardez le même client actif.
Arrêt de l’applicationFermez client pour arrêter les signaux. Les sièges flottants sont rendus ; l’appareil lié reste enregistré.

4. Vérifier qu’un refus bloque l’exportation

Vérifiez que la stratégie exclut licentivo_denied_probe, puis lancez la commande. Attendez un code non nul et aucun denied-report.txt. Utilisez un fichier de sortie inexistant.

Test de refus d’accès

5. Ajouter des opérations comptées si nécessaire

Passez votre fonction et un ID stable à RunMeteredFeature. Le SDK réserve l’usage, confirme la réussite, annule l’échec métier et conserve les confirmations en attente.Voir l’intégration comptée et les reprises →

Séparez la configuration de test des licences des clients.

Distribuez seulement le SDK requis et product.json. Chaque client a sa clé. Excluez sdk-demo.json, caches, identifiants d’appareil et clés de gestion API. Un cache_path vide choisit un répertoire privé par utilisateur.

Distinguez ces trois identifiants

NomUtilisé parUsage
Clé de licence lv_lic_…L’acheteur du logicielActivez dans l’application. Le code temporaire de transfert lv_tmp_… se saisit aussi dans ce champ.
Identifiant produitSDK / Développeur du logicielIdentifie le produit à valider ; peut être distribué avec l’application.
Clé API de gestionLe serveur du fournisseurAutomatise l’émission, le renouvellement et la gestion des licences. L’activation du client n’en a pas besoin.

Réglez séparément l’intervalle de heartbeat et la durée hors ligne dans Politiques de licence. La validité commence à la première activation. Ajoutez ensuite quotas de fonctions, postes flottants et activation par fichier hors ligne.

Sans inscription, vous pouvez ouvrir Essayer la démopour consulter requêtes et réponses. Pour automatiser l’émission, poursuivez avec Clé API de gestion.

SDK client

Confiez votre fonction au SDK : RunFeature pour l’accès, RunMeteredFeature pour les compteurs. Le SDK gère requêtes, signatures, cache et signaux périodiques.

Avant l’exécution

Dans la console, Démarrage rapidetéléchargez le paquet configuré. La démo utilise le fichier privé sdk-demo.json ; dans l’application réelle, utilisez product.json, avec la clé du client fournie au démarrage. Télécharger le SDK fournit les sources génériques sans vos paramètres produit.

Que signifie chaque champ de configuration ?
product.json · Paramètres produit partagés
{
  "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 du serveur de licences : domaine et port uniquement, sans /api/v1. Pour les tests locaux, utilisez https://127.0.0.1:8080.
product_id
Identifiant du produit de cette application. Il doit correspondre au produit de la licence.
license_key
Laissez ce champ vide dans product.json. Fournissez la clé du client à OpenWithLicense : lv_lic_… ou un code de transfert : lv_tmp_… ; cela ne modifie pas la configuration partagée.
app_version
Version actuelle au format majeur.mineur.correctif, par exemple 1.0.0. Obligatoire si la plage de versions ou la maintenance est activée. Revalidez en ligne après un changement de version.
device_name
Nom de l’appareil affiché dans la console. Il facilite l’identification visuelle, mais ne définit pas l’identité de l’appareil.
trusted_keys
Identifiant de clé de signature et clé publique du produit. Distribuez-les avec l’application ou une mise à jour authentifiée. Ne faites jamais confiance à une clé issue d’une réponse inconnue.
cache_path
Omettez-le ou laissez-le vide pour utiliser automatiquement un répertoire privé par utilisateur, ou indiquez un fichier privé de votre application.
timeout_seconds
Délai d’une requête en secondes : 10 par défaut, de 1 à 120. Une panne réseau temporaire permet deux tentatives au maximum.
proxy_url
URL de proxy facultative. Java utilise un proxy HTTP ; Node.js nécessite undici si un proxy est configuré. La vérification des certificats reste active.
allow_http
En production, gardez la valeur false, avec HTTPS. Pour les tests locaux, réglez sur true, uniquement pour localhost ou les adresses de bouclage.

Vous n’avez pas à saisir device_id : le SDK lit l’identité locale. Les clés publiques de product.json peuvent être distribuées ; gardez les clés client et sdk-demo.json privés.

Choisissez votre langage

Ce code correspond au fichier livré et crée un export réel. Les variables remplacent la saisie d’activation ; utilisez votre interface et gardez client actif pendant l’application.

Installation commune et versions publiées

Choisissez langage et plateforme, puis lancez dans votre projet. Le SDK est distribué sur le site Licentivo sans compte GitHub. La publication GitHub et registres reste en attente.

Commande d’installation du site

Version : · Paquet versionné · Fichier de sommes SHA-256 · Manifeste de version

Windows x64 et Linux x64 sont vérifiés. Les tests physiques macOS et ARM64 restent à faire. Les binaires C/C++ dépendent de la plateforme et du compilateur.

Référencer le SDK installé
LangueIntégration au projet
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'

Conservez le dossier .licentivo-sdk de Go, Rust et C/C++. Choisissez une nouvelle version pour mettre à jour ; product.json et les caches clients restent intacts.

Exécutez le travail protégé via le SDK et fermez client à l’arrêt.

Go · Licence côté client
正在加载代码…

Exécuter ce fichier avec le script de démarrage →

Utiliser une autre clé client ou lancer la démo complète

Définissez la variable et lancez le script sans option de test. Une clé de licence n’est pas une clé API de gestion.

Variable d’environnement de ce terminal

En cas de succès, la sortie est License OK: export is available. Dans votre application, recueillez la clé dans le formulaire d’activation. Aucune variable d’environnement n’est nécessaire pour le client ; le SDK conserve l’identifiant de la machine. Ne journalisez pas la clé.

Exécuter la démo complète du paquet

Extrayez le ZIP en conservant l’arborescence. Placez sdk-demo.json à la racine du paquet extrait. Choisissez le système, ouvrez un terminal ici et exécutez :

Commande du terminal

La démo libère l’appareil à la fin.

Cette démo complète sert au diagnostic avancé. Commencez par start.ps1 ou start.sh ; ces exemples gardent l’enregistrement de l’appareil à l’arrêt normal.

Exécuter un exemple d’application

Les exemples incluent saisie d’activation, état, export et libération d’appareil. Java, Python et C# ont une fenêtre ; les autres utilisent un menu terminal. Saisissez la clé une fois, puis laissez-la vide.

Exemple d’application · langue et système sélectionnés

Un export réussi crée licensed-report.txt. Configurez le quota export dans la stratégie avant d’utiliser l’export comptabilisé.

Les démos graphiques et menus montrent les réservations bas niveau. Utilisez RunMeteredFeature ci-dessous : les neuf langages conservent les confirmations en attente. Après un crash pendant le travail, vérifiez votre résultat.

Comment afficher l’état de l’autorisation ?

Status et FeatureStatus lisent l’état local, sans requête ni attente d’une vérification. Les notifications peuvent actualiser l’interface.

ÉtatSignification
activeLa dernière vérification en ligne a réussi ; l’autorisation locale est valide.
offline_validLa signature locale est valide ; aucune confirmation en ligne n’a réussi depuis le démarrage.
verification_requiredAucune signature utilisable. Activez ou actualisez en ligne.
expired / revoked / releasedLe serveur a explicitement refusé l’autorisation. Arrêtez les opérations protégées.
quota_exhaustedCette demande dépasse le quota ; les autres fonctions autorisées restent disponibles.

allowed indique la validité locale ; les fonctions comptabilisées demandent toujours des unités. lease_valid_until est l’échéance du cache signé, pas celle de la licence. code, request_id et retryable indiquent erreur, référence de journal et possibilité de reprise.

Consultez sdk/README.md pour les méthodes, rappels et paquets. Le site propose des paquets versionnés et installateurs communs ; les registres publics restent en attente.

Où placer ces appels dans votre application ?

Étape de l’applicationAction à effectuer
Au démarrage ou après saisie de la cléAppelez OpenWithLicense (constructeur et Start en C++). Le SDK active et lance les heartbeats selon la règle.
Avant une fonction payantePassez votre fonction à RunFeature ; utilisez RunMeteredFeature pour les compteurs
Pendant l’exécutionGardez client actif ; le SDK envoie les heartbeats à l’intervalle défini.
À la fermeture de l’applicationClose / Dispose / Destroy arrête les heartbeats, rend les postes flottants et conserve les appareils enregistrés.
Quand l’utilisateur délie l’appareilAppelez Deactivate, puis fermez client.

Les noms du tableau désignent les opérations ; utilisez ceux de l’exemple de votre langage. Pour les heartbeats, caches hors ligne et rafraîchissements, voir Heartbeats et accès hors ligne.

Clé API de gestion

Utilisez une clé API de gestion pour émettre des licences depuis votre système de commandes ou lire les données d’autorisation depuis un serveur. Elle représente votre espace fournisseur.

Quelle clé faut-il au client ?

Identifiant d’authentificationDestinataireUtilité
lv_api_…
Clé API de gestion
Votre serveurCréer produits, règles et licences ; voir appareils, usage et audit
lv_lic_…
Clé de licence
Logiciel du clientActiver, vérifier, envoyer des heartbeats et libérer
Clé publique du produitDistribuer avec le clientVérifier la signature de licence du serveur

Pour vérifier l’autorisation du logiciel client, la clé de licence suffit. Une clé API de gestion agit sur tout l’espace : ne l’intégrez pas au logiciel client ni à une page publique.

Créer une clé

  1. Connectez-vous comme Owner de l’espace et ouvrez API Key puis cliquez sur Créer une clé API.
  2. Nommez-la selon son usage, par exemple « Commandes ». Choisissez Lecture seule pour consulter, Lecture/écriture pour créer ou modifier des licences. Validité : 1 à 365 jours.
  3. Copiez la clé complète après l’enregistrement ; elle n’est affichée qu’une fois. Conservez-la dans une configuration privée du serveur ou une variable d’environnement.

Envoyer la première requête de gestion

Cet exemple lit la liste des produits. Définissez LICENTIVO_URL sur l’URL du serveur de licences, puis définissez LICENTIVO_API_KEY avec la clé complète créée, puis exécutez :

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

Syntaxe Bash/macOS/Linux. Avec Windows PowerShell, utilisez curl.exe ; la variable d’environnement est $env:LICENTIVO_URL et $env:LICENTIVO_API_KEY. Les requêtes complètes en neuf langages sont aussi dans Option Clé API de gestion serveur sur la page SDK.

Le succès renvoie HTTP 200 avec data.items. Requêtes Bearer Key sans cookie de connexion ni jeton CSRF.

Droits et invalidation

Une clé Lecture seule consulte les ressources ; Lecture/écriture crée et modifie aussi produits, stratégies et licences. Comptes, équipes, paramètres système et paiements nécessitent un compte connecté disposant des droits, pas une clé de gestion.

Révoquez dans la console toute clé divulguée ou inutilisée. Pour la remplacer, cliquez sur Rotation : l’ancienne est immédiatement invalidée. Mettez ensuite la configuration du serveur à jour.

Le quota API du forfait compte activation, vérification, heartbeat et libération. Ces requêtes de gestion n’y sont pas comptées.

API des produits et licences

Après une commande, émettez les licences depuis votre serveur : créez le produit et la stratégie, puis une licence par client. Les deux premiers éléments se configurent généralement une seule fois.

Créez d’abord dans la console un Clé API de gestion. Les exemples suivants utilisent Authorization: Bearer 你的管理Key ; gardez cette clé sur le serveur du fournisseur.

Que conserver après la création ?

Utilisez data.id du produit comme product_id et celui de la stratégie comme policy_id. Après émission, gardez data.id et data.key de la licence. La clé complète n’est renvoyée qu’une fois ; key_prefix ne permet pas l’activation.

Pour une licence limitée avant activation,expires_at et first_activated_at sont null. Durée à partir de la première activation ; le transfert ne la recommence pas.

Gestion ultérieure

Méthode et chemin (sans /api/v1)Utilité et corps de requête
GET /productsListe les produits. Dans la réponse, data.items est le tableau des enregistrements et data.total leur nombre total.
GET /licenses/{id}Consulter licence, première activation et échéance.
POST /licenses/{id}/renewRenouveler, p. ex. {"days":30}. Conserve la licence d’origine.
POST /licenses/{id}/revokeRévoquer ; corps {}.
GET /products/{id}/public-keysLire les clés publiques sans authentification. Fixez les clés de confiance à la distribution du SDK.
GET /activationsVoir les liens d’appareils et sessions.

La pagination utilise limit=25&offset=0, limit vaut au plus 100. Autres paramètres et structures : Fichier OpenAPI ; consultez le sujet à gauche correspondant au modèle.

Comment appeler avec une session de navigateur ?

Les écritures avec cookie exigent X-CSRF-Token. Faites GET /api/v1/auth/csrf, puis placez data.csrf_token dans cet en-tête. Les requêtes Bearer Key n’exigent pas de CSRF.

Appels de licence SDK

Choisissez la langue et l’opération, puis appelez le SDK. Il gère l’activation, l’identité de l’appareil, les signatures, le cache, les battements et les réservations, confirmations et annulations d’usage.

Démarrage ou écran d’activationAvant une fonction payanteÀ la fermeture de l’application

Appel SDK

Dans ces exemples, client vient du démarrage, path est le chemin d’exportation et exportReport / export_report est votre fonction métier. Le jobID compté est un identifiant stable conservé par l’application.

Voir le code complet → · Démarrage rapide · Voir l’intégration comptée et les reprises →

Placez le code métier dans le rappel.

Le SDK exécute seulement les opérations autorisées. RunFeature ne déduit aucun usage ; RunMeteredFeature réserve, confirme le succès et annule l’échec. Reprendre la tâche initiale confirme sans répéter l’opération terminée.

Afficher les requêtes et réponses HTTP (clients personnalisés ou dépannage)

Le protocole ci-dessous est implémenté par les SDK. Les applications utilisant ces neuf SDK n’ont pas à le réimplémenter.

Première activationHeartbeat à l’exécutionVérifier les droits avant l’opérationLibérer avant un changement d’appareil

Ces huit interfaces authentifient licence et appareil, sans cookies, CSRF ni clé de gestion. Les sessions flottantes sont libérées à l’arrêt ; les appareils liés restent enregistrés.

Comment vérifier l’accès après activation, vérification ou heartbeat ?

  1. Vérifiez HTTP 200 et lisez data.activation_id. Joignez cet ID aux vérifications, heartbeats, comptages et libérations suivants.
  2. Vérifiez avec la clé publique du produit préapprouvée data.lease puis vérifiez produit, appareil, validité et fonctionnalités. Décoder payload en JSON ne prouve pas la validité de l’autorisation.
  3. Le SDK automatise les deux premières étapes. RunFeature vérifie l’accès avant le travail ; RunMeteredFeature gère réservation, confirmation et annulation pour les compteurs.

Le SDK conserve le cache signé et envoie les heartbeats selon la stratégie. N’effacez pas un cache valide pour un simple délai réseau. En cas de révocation, libération ou expiration explicite, bloquez les fonctions protégées selon le résultat du SDK.

Que signifient les champs du payload décodé ?

L’exemple explique les données. Pour vérifier la signature vous-même, utilisez les octets originaux de payload reçu ; ne réordonnez ni ne sérialisez le JSON.

Exemple de payload

Tentatives, heartbeats et facturation

Requis pour activation, libération et comptage Idempotency-Key, jusqu’à 80 caractères sans espace. Nouvelle opération : nouvelle valeur ; nouvelle tentative : mêmes valeur et corps. Facultatif pour vérification et heartbeat ; le SDK gère ses propres identifiants.

Chaque activation, vérification, heartbeat ou déliage réussi consomme un appel API. Échecs et répétitions idempotentes ne sont pas recomptés ; CheckFeature reste local. Consume déduit les usages de la fonction, pas ce quota API ; quantity indique leur nombre.

Heartbeat, durée hors ligne et permanent suivent Politiques de licence.payload.expires_at indique l’expiration du cache signé actuel, pas celle de la licence. L’échéance finale figure dans les détails de la licence.

Heartbeats et accès hors ligne

Les deux réglages sont dans les stratégies d’autorisation, mais distinguent la fréquence de contact en ligne et la durée d’usage sans réponse du serveur.

Intervalle : fréquence de vérification

Réglez Intervalle de heartbeat (secondes) sur 600, le SDK envoie une pulsation environ toutes les 10 minutes pendant son exécution. Chaque réussite récupère les dernières règles et actualise le cache local de licence.

Saisissez 600–86400 secondes. Saisissez 0 désactive les battements programmés. L’application peut toujours vérifier ou actualiser manuellement. Un délai aléatoire de 0–10 % est ajouté ; l’intervalle ne descend jamais sous 600 secondes.

Avec une licence liée à l’appareil et un cache valide, le démarrage rétablit l’accès puis vérifie en arrière-plan, même sans minuterie. Les licences en ligne uniquement et flottantes attendent la confirmation du serveur.

Hors ligne : durée d’usage sans serveur

Trois choix de mode hors ligne, sans modifier l’intervalle de heartbeat.

Autoriser pendant une durée définie
Avec 24 heures, le cache signé reste valable au maximum 24 heures après la dernière vérification en ligne réussie. Une coupure réseau ou une panne temporaire n’empêche pas l’usage pendant ce délai. Ensuite, une vérification en ligne doit réussir.
Repli hors ligne interdit
Le démarrage exige une réponse du serveur ; le cache disque ne contourne pas un échec. La signature courte reçue pendant l’exécution dure au maximum max(10, 心跳间隔) secondes ; l’application doit poursuivre les vérifications et les contrôles de droits.
Autoriser un accès hors ligne permanent
La signature locale peut servir durablement, même en cas de panne réseau. Une licence de 30 jours expire toujours au bout de 30 jours : le mode hors ligne permanent ne rend pas la licence perpétuelle.

L’API utilise offline_mode représente ces trois choix, dans l’ordre limited, none, permanent. Avec une durée hors ligne définie,offline_seconds vaut 1–31536000 secondes ; 0 pour les deux autres modes.

Comment fonctionnent ces combinaisons ?

Réglages heartbeat / hors ligneComportement réel
10 minutes / 24 heuresVérifiez toutes les 10 minutes en ligne. Hors ligne, utilisez jusqu’à 24 heures après la dernière vérification réussie
10 minutes / hors ligne permanentHeartbeat toutes les 10 minutes ; règles actualisées si réussi, signature valide si injoignable.
0 / hors ligne permanentAvec un cache valide, démarrez sans requêtes programmées. Vérification ou actualisation explicite contacte toujours le serveur
0 / 24 heuresPas de heartbeat programmé, mais le cache expire. L’application planifie la vérification ; désactiver ne prolonge pas le hors ligne.

Prévoyez une durée hors ligne supérieure à l’intervalle. Avec un heartbeat par heure mais une minute hors ligne, la signature expire avant le suivant : l’application doit vérifier séparément.

Une règle modifiée actualise-t-elle les licences existantes ?

Oui. Les réglages modifiés s’appliquent aux anciennes et nouvelles licences liées lors de la prochaine activation, vérification ou heartbeat réussi. Le SDK remplace le cache signé. Un même Idempotency-Key renvoie toujours le résultat de la requête initiale.

Un appareil hors ligne utilise ses règles signées existantes. La reconnexion seule ne change pas le cache : une requête doit réussir. L’application peut lancer une actualisation au retour du réseau.

Cela actualise les règles à l’exécution.

Durée, limite d’appareils et fonctions sont propres à chaque licence. Modifier la stratégie ne les remplace pas automatiquement. Modifiez ces droits sur la page Licences.

Actualisation en ligne à la demande

Ces méthodes contactent toujours le serveur, même en mode hors ligne permanent sans heartbeat. Le succès renouvelle la signature. Un échec réseau signale l’erreur et conserve un cache encore valable ; une révocation ou libération explicite l’efface.

LangueMéthode d’appel
Goclient.RefreshOnline(ctx)
Javaclient.refreshOnline()
Cln_refresh_online(client)
C++client.RefreshOnline()
C#await client.RefreshOnline()
Pythonclient.refresh_online()
JavaScriptawait client.refreshOnline()

Une actualisation réussie compte comme une activation API. Si la stratégie active les heartbeats auparavant désactivés, appelez StartHeartbeat pour démarrer leur planification. Hors ligne, l’appareil ne reçoit pas les révocations ou libérations.

Liaison aux appareils

Avec une licence pour un seul appareil, copier le logiciel et son cache sur un autre ordinateur ordinaire ne transfère pas l’autorisation.

Comment le SDK identifie-t-il l’ordinateur ?

À chaque démarrage, le SDK lit l’identité système et calcule un hash avec l’identifiant produit. La signature du serveur contient ce hash, également vérifié en local.

Windows lit MachineGuid, Linux machine-id et macOS IOPlatformUUID. Seul le hash calculé est envoyé, pas l’identité brute. L’ancien champ de configuration device_id ne remplace pas l’identité locale réelle.

Que se passe-t-il si les fichiers de A sont copiés sur B ?

  1. A reçoit une signature liée à son hash d’appareil.
  2. B lit son identité, obtient un autre hash et refuse le cache de A.
  3. B doit s’activer en ligne. Avec une limite d’un appareil et A encore lié, le serveur refuse B.

Comment un client change-t-il d’ordinateur ?

Le client délie l’ancien ordinateur, puis active le nouveau. Si l’ancien est endommagé, libérez-le depuis Activations d’appareils dans la console. Le changement ne réinitialise pas l’échéance.

Une réinstallation peut changer l’identité du système et nécessiter une nouvelle activation. Clonage complet, identité falsifiée ou client modifié sont des attaques plus fortes : ce hash seul ne garantit pas leur blocage.

Avec une longue durée hors ligne, la signature de A ignore sa libération jusqu’à une requête serveur réussie. Plus la durée est longue, plus l’application des restrictions à distance est retardée.

Hash d’appareil entre langages
Les neuf SDK utilisent le même algorithme
SHA256(UTF8(
  "LicenovaDevice/v2\n"
  + lower(product_id) + "\n"
  + lower(trim(OS_machine_identity))
))

Quotas et facturation

Le quota d’appareils compte les appareils utilisés ; le quota API compte les requêtes réussies. Mesures distinctes : le nombre d’appareils ne détermine pas l’usage API.

Quelles opérations comptent dans le quota API ?

ActionComptabilisé ?
Activation, vérification, heartbeat ou libération réussisChaque succès compte ; tous les heartbeats d’une même journée sont comptés séparément.
Requêtes échouées : clé invalide ou quota insuffisantNon compté
Réessayer avec le même Idempotency-Key et renvoyer le résultat initialPas compté à nouveau
CheckFeature local ou contrôle de cache signéNon compté ; aucune requête serveur
Consulter ou émettre des licences avec une clé API de gestionNon inclus dans ce quota API d’exécution

Plusieurs requêtes comptent-elles plusieurs fois un appareil ?

Non. Sur une période, le même appareil d’un produit compte une fois, mais chaque heartbeat réussi compte comme usage API. Sa libération n’efface pas l’usage déjà enregistré.

Exemple : 100 appareils, 8 heures par jour, 22 jours par mois, heartbeat toutes les 10 minutes. Les heartbeats seuls représentent 105 600 appels. Ajoutez 100 activations et une vérification par appareil et par jour, soit 107 900 appels.

Ces vérifications sont des hypothèses ; l’usage dépend de l’application. Dans Estimation de l’usage en ligne modifiez appareils, durée et intervalle.

Comment facture-t-on le dépassement ?

Avec 100 000 appels inclus et 0,0001 USD par appel supplémentaire : 120 000 appels réussis font 20 000 en dépassement, soit des frais de 2 USD.

Les dépassements autorisés débitent le solde au tarif administrateur. Le montant cumulé est arrondi au centime ; seule la différence nouvelle est débitée, sans frais répétés d’arrondi par appel.

Le dépassement d’appareils est distinct : appareils supplémentaires × prix unitaire. Une limite stricte bloque le dépassement concerné ; un solde insuffisant bloque aussi la prochaine requête payante. Un refus n’ajoute pas d’usage.

Un quota API illimité n’a pas de frais de dépassement. Zéro signifie aucun appel gratuit : les règles s’appliquent dès le premier succès. Quotas, prix et limites figurent dans Forfait actuel, ces chiffres sont des exemples.

Quand commencent la durée et les quotas ?

Achetez 1, 3, 6 ou 12 mois. Réglez le total en une fois ; le forfait démarre après paiement.

Les quotas sont renouvelés chaque mois à partir de l’activation. Un début le 31 janvier donne le dernier jour de février puis le 31 mars. Aucun report.

Sans forfait acheté, les règles administrateur suivent le mois civil UTC. Appareils : facture mensuelle ; dépassement API : débit immédiat. Après achat, seuls les quotas de sa période s’appliquent, sans cumul des quotas par défaut.

Un refus pour quota ou solde insuffisant n’annule pas la signature hors ligne, soumise à ses règles d’origine. Le fournisseur peut libérer l’appareil dans la console sans consommer le quota API d’exécution.

Postes flottants

La licence flottante limite les programmes exécutés simultanément. Elle permet de partager le logiciel à tour de rôle, sans acheter une licence par ordinateur.

Exemple

Avec 100 ordinateurs et 10 places, les 10 premiers programmes démarrent, le 11e reçoit « Aucune place ». Une fermeture normale du programme et du SDK libère la place. Deux programmes sur un ordinateur occupent deux places.

Définissez dans la règle

Choisissez les sièges flottants et une limite de 10. Intervalle minimum : 600 s ; bail plus long, par exemple 1200 s. Les battements renouvellent le bail ; après panne ou déconnexion, l’expiration libère le siège.

La licence flottante permet une brève coupure pendant le bail. La durée hors ligne reste limitée par ce bail ; ni mode permanent ni première activation totalement hors ligne par fichier.

Que doit aussi gérer l’application ?

Utilisez Open/Start puis la fermeture normale. Le SDK crée un identifiant de session par client. Ne créez pas un client par export ; gardez-en un jusqu’à la fermeture du programme.

Un ancien cache flottant ne rétablit pas la place au prochain démarrage. Si le bail a expiré, réactivez et obtenez une place avant de reprendre.

Activation hors ligne

Pour un ordinateur sans réseau, utilisez un fichier de demande et une réponse signée pour la première activation. Transportez la demande par clé USB vers un ordinateur connecté.

Étapes

  1. Sur l’ordinateur cible, chargez la configuration, appelez OfflineRequest("activate") et gardez le fichier. Sa création ne contacte pas le serveur.
  2. Sur un ordinateur connecté, ouvrez Activation par fichier hors ligne, téléversez la demande et téléchargez la réponse. Le client final peut aussi utiliser son portail.
  3. Rapportez la réponse et appelez ImportOffline avec demande et réponse d’origine. Le SDK vérifie signature, identifiant de demande, version et identité locale avant de garder le cache.
  4. Vérifiez l’autorisation avec CheckFeature. Un ordinateur hors ligne n’a pas besoin de heartbeat en ligne ; la stratégie définit la durée hors ligne.

L’activation par fichier exige une licence liée autorisant le mode hors ligne. La demande dure 30 jours. Une licence à durée fixe commence à l’approbation serveur, qui ignore la date d’importation de la réponse.

Comment libérer hors ligne ?

Sur l’ancien ordinateur, générez OfflineRequest("deactivate"). Le SDK efface d’abord le cache ; transmettez ensuite la demande au fournisseur ou portail. Cela ne prouve pas l’absence de copies antérieures. Pour un blocage rapide, exigez des vérifications en ligne régulières.

Noms par langage

LangueGénérer la demandeImporter la réponse
GoOfflineRequest("activate") → []byteImportOffline(requestBytes, responseBytes)
JavaofflineRequest("activate") → texte JSONimportOffline(requestText, responseText)
JavaScriptofflineRequest("activate") → objectimportOffline(requestObject, responseObject)
Cln_offline_request(client, "activate")ln_import_offline(client, requestText, responseText)
C++ / C#OfflineRequest("activate") → texte JSONImportOffline (texte en C++, octets en C#)
Pythonoffline_request("activate") → dictimport_offline(requestDict, responseDict)

En C, libérez le texte retourné avec ln_free_string. Fournissez le contenu du fichier de réponse, pas l’enveloppe data de l’API web.

Limites d’utilisation des fonctions

L’autorisation d’exporter diffère de 500 exports par mois. RunFeature vérifie l’accès ; RunMeteredFeature confirme l’usage après réussite.

Autoriser 500 exports par mois

Ajoutez export aux fonctions, puis un quota : export, 500, Mensuel. Par défaut, l’usage est refusé après épuisement. Pour autoriser un dépassement, fixez son maximum ; le système le comptabilise pour votre système de commandes.

Quotas quotidiens et mensuels renouvelés à minuit UTC ; quotas cumulés sans remise à zéro. Changer la limite n’efface pas l’usage consommé.

Confirmer l’utilisation après un export réussi

Passez votre fonction métier au SDK. Nouveau travail : nouvel ID ; reprise : mêmes ID, fonction et quantité. Ne lancez pas le même ID dans plusieurs processus.

LangueAppel d’opération comptée
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)

Configurez d’abord le quota export. Ajoutez -Metered -OperationID export-job-001 sous Windows ou --metered --operation-id export-job-001 sous Linux/macOS.

Le SDK conserve les confirmations en attente.

Si le travail réussit mais pas la confirmation, une reprise ne fait que confirmer. Un crash pendant le travail bloque la répétition automatique. Vérifiez le résultat durable puis utilisez ResolveMeteredFeature. L’usage distant et le travail local ne forment pas une transaction unique.

Pour contrôler vous-même les réservations
  1. Créez et conservez un identifiant de tâche pour cet export.
  2. Réservez une unité et exportez seulement après pending. committed indique une tâche déjà terminée ; ne la répétez pas.
  3. Après un export réussi et l’enregistrement du résultat, appelez Commit pour confirmer l’utilisation.
  4. Si l’export échoue avant la fin, appelez Cancel pour libérer la réservation sans débiter d’unités.

Une réservation dure 15 minutes par défaut, raccourcies au changement de période UTC. L’API permet reservation_seconds de 30 à 3600 secondes.

LangueRéserverConfirmer / Annuler
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)

Comment lire les champs de réponse ?

ChampSignification
reservation_id / operation_idIdentifiant de réservation et de tâche d’origine ; conservez les mêmes valeurs lors des reprises.
status / expires_atÉtat et échéance : pending attend la fin, committed est débité, canceled est libéré, expired a expiré.
consumption.used / reservedUtilisations confirmées sur la période / unités réservées par toutes les tâches valides.
consumption.limit / remainingQuota de base / unités de base disponibles. remaining = max(0, limit - used - reserved), hors dépassement autorisé.
consumption.quantity / overageUnités de cette tâche / unités confirmées au-delà du quota de base ; aucun paiement client n’est encaissé.
consumption.period / reset_atPériode UTC / prochaine remise à zéro ; un quota à vie a reset_at = null.

Pour les requêtes, réponses et types de champs, consultez Reserve, Commit et Cancel dans la référence de l’API d’exécution.

Après un délai de confirmation dépassé, réessayez uniquement la confirmation.

Après réussite, n’annulez pas et ne répétez pas l’export. Conservez identifiants et résultat puis réessayez Commit. Si la réservation a expiré, gardez la tâche pour rapprochement. Le débit distant et l’action locale ne partagent pas une transaction atomique.

Consume débite toujours immédiatement. Utilisez la réservation pour ne pas facturer une action échouée. Tous les compteurs fonctionnels exigent une connexion et sont exclus des quatre appels API facturables de la plateforme.

Versions et maintenance

Un achat perpétuel autorise l’usage durable, pas forcément les mises à niveau gratuites à vie. La maintenance détermine les versions éligibles selon leur date de publication.

Acheter la version actuelle, un an de mises à jour inclus

Choisissez Perpétuelle et 365 jours de maintenance, comptés dès la première activation. Publiez 1.0.0, 1.1.0, etc. dans Versions du logiciel avec leurs dates réelles.

Les versions publiées pendant la maintenance restent utilisables. Les suivantes sont refusées, les anciennes fonctionnent encore. Après renouvellement, prolongez la maintenance dans Droits et client de la licence.

Comment l’application transmet-elle sa version ?

Renseignez app_version dans sdk-demo.json, par exemple 1.1.0. Avec maintenance, publiez d’abord cette version. Seules les versions numériques à trois parties, comme 1.2.3, sont acceptées. La date publiée est immuable pour préserver les droits vendus.

Pour limiter à 1.x, fixez 1.0.0–1.999.999 sans maintenance. Après mise à jour, connectez-vous pour recevoir la signature de la nouvelle version ; l’ancien cache ne l’autorise pas.

Proposer un téléchargement

Les versions peuvent contenir URL HTTPS et empreinte SHA-256. Le portail n’affiche que les versions autorisées. Ces enregistrements fournissent un lien, sans héberger l’installateur ni installer automatiquement les mises à jour.

Portail client

Les clients consultent leurs licences et appareils et les délient sans accéder à la console fournisseur.

Le fournisseur associe d’abord l’adresse du client

Renseignez l’e-mail à l’émission ou dans Droits et client. Envoyez le Portail client au client. En saisissant cette adresse, il reçoit un lien à usage unique valable 15 minutes. La session dure 24 heures.

Le client voit uniquement les licences de cette adresse, pas vos produits, factures ou données d’autres clients. Configurez d’abord le service email dans les réglages administrateur.

Que faire si le client a perdu sa clé en changeant d’ordinateur ?

  1. Le client saisit l’adresse associée à la licence et ouvre le lien reçu. Ce lien connecte au portail, sans délier d’appareil.
  2. Dans Mes appareils / sessions, choisissez l’ancien, Libérer et transférer, puis confirmez.
  3. La page affiche un code temporaire, valable au plus 15 minutes et pour une seule activation réussie. Le client peut le copier ou demander son envoi par email.
  4. Sur le nouvel ordinateur, ouvrez le logiciel et saisissez le code temporaire. Le SDK identifie l’appareil, lie la licence d’origine et garde ses identifiants. Redémarrages et heartbeats utilisent ces identifiants ; l’expiration du code n’affecte pas l’activation.

Seule la liaison change. Identifiant, échéance d’origine, fonctions, client et usages consommés restent ; aucune nouvelle licence n’est émise. Le nouvel appareil doit respecter la stratégie et disposer d’une place libre.

Que doit modifier le fournisseur du logiciel ?

Passez au SDK actuel. Le champ de clé de licence accepte aussi lv_tmp_ codes temporaires ; placez-en un dans license_key suffit ; Start, la validation et les battements restent inchangés. Le SDK conserve l’identifiant de l’appareil dans un cache privé ;cache_path peut être vide. Conservez ce fichier dans les données de l’utilisateur courant ; ne le distribuez jamais avec l’installeur.

Après échange réussi, l’application peut effacer license_key vide ; gardez mêmes produit, clés et cache_path, le SDK restaure les identifiants de l’appareil au redémarrage. Le client n’a pas à conserver ni ressaisir le code temporaire. Gardez la saisie tant que l’échange n’a pas réussi, pour réessayer après une coupure.

Si le code expire ou la page est fermée

Reconnectez-vous pour voir les codes inutilisés. Après expiration d’un code non utilisé, demandez-le à côté de l’appareil libéré, sans compter un autre transfert. Un code utilisé ne peut être échangé ni repris depuis l’ancien appareil pour contourner les limites. Pour un nouveau transfert, déliez l’appareil actuel.

Si le nouvel ordinateur est entièrement hors ligne

Sur le nouveau poste, saisissez le code et exportez la demande avec le SDK. Avant expiration du code, obtenez la réponse sur un poste connecté via le portail, puis importez-la. La stratégie doit permettre l’activation hors ligne liée à l’appareil. L’échéance d’origine reste ; protégez le fichier contenant autorisation et identifiants de ce poste.

Limites de libération et ancien ordinateur

Définissez la limite de libérations autonomes par licence et mois UTC. Zéro désactive les nouveaux déliages du portail. Clics répétés, consultation et réémission d’un code inutilisé expiré ne comptent pas davantage. La limite couvre portail et demandes hors ligne client, pas libérations manuelles fournisseur ni appels logiciels avec la clé d’origine.

Le déliage distant bloque la prochaine vérification en ligne. L’ancien cache reste valable jusqu’au contact ou à son expiration. Un cache hors ligne permanent ne peut pas être arrêté immédiatement ; exigez des contrôles réguliers pour une révocation rapide. Une copie normale sur un autre poste est refusée car son identité diffère.

Le portail gère l’usage des licences. Les commandes et encaissements du logiciel restent dans le système du fournisseur.

Notifications d’événements

Lors d’une activation, d’un renouvellement ou d’une révocation, Licentivo peut notifier votre serveur pour synchroniser commandes, clients et support.

Ajouter une adresse de notification

Dans Notifications d’événements, ajoutez l’URL HTTPS du serveur et choisissez les événements. Le secret est affiché une seule fois : gardez-le sur le serveur destinataire. En production, adresses locales et privées sont interdites.

Vérifiez la signature à réception

Lisez X-Licentivo-Timestamp, X-Licentivo-Event et le corps brut. Assemblez horodatage + '.' + ID d’événement + '.' + corps, calculez HMAC-SHA256 avec le secret, ajoutez sha256= et comparez à X-Licentivo-Signature en temps constant. Refusez un écart supérieur à 5 minutes.

Dédupliquez par ID d’événement. Vérifiez la signature, placez l’événement dans une transaction ou file et répondez 2xx après stockage durable. Un doublon reçoit 2xx sans répéter l’action.

Que se passe-t-il en cas d’échec ?

Jusqu’à 8 tentatives automatiques, avec pauses croissantes. La console affiche statut HTTP, date et erreurs, et permet un nouvel envoi manuel. Événement et opération de licence partagent la transaction ; l’envoi reprend après redémarrage.

Événements : création, mise à jour, renouvellement, révocation, activation, libération, consommation, échéance proche, expiration et maintenance. La notification contient le préfixe, jamais la clé complète.

Opérations groupées et changements de règles

Émettez, renouvelez ou révoquez en lot pour traiter les clients ensemble. Prévisualisez l’impact avant de changer les droits existants.

Émettre en lot ou importer

Dans Licences, choisissez Émission/import en lot, puis produit et stratégie. Saisissez nom et email par ligne ou importez un CSV avec en-tête customer,customer_email. Maximum 100 lignes. Téléchargez le résultat et gardez les clés complètes.

Si une ligne échoue, tout le lot reste sans effet. Après un délai réseau, gardez le contenu et réessayez : l’identifiant de requête renvoie le résultat initial sans nouvelle émission.

Renouveler ou révoquer en lot

Cochez les licences puis Renouveler ou Révoquer en lot. La case d’en-tête sélectionne la page ; les choix restent entre pages, maximum 100. Changer les filtres, quitter ou actualiser efface la sélection.

Saisissez les jours ajoutés. Non activée : durée accrue ; active : échéance prolongée ; expirée : prolongation à partir de maintenant. Avant révocation, développez la sélection pour vérifier les clients. Elle est irréversible. Les membres en lecture seule ne peuvent pas agir.

Appliquer une nouvelle règle aux licences existantes

  1. Enregistrez les règles dans Règles de licence.
  2. Sélectionnez les licences d’un produit, puis Appliquer la règle et choisissez la nouvelle.
  3. Vérifiez durée, appareils/places, fonctions, usages et maintenance. Si les places occupées dépassent la nouvelle limite, ou si des appareils actifs subsistent lors du changement de mode, traitez-les d’abord.
  4. Appliquez après confirmation. La prochaine vérification en ligne reçoit une nouvelle signature ; les caches entièrement hors ligne ne changent pas à distance.

La prévisualisation dure 10 minutes. Si licence ou stratégie change, recommencez. Une nouvelle durée recalcule l’échéance depuis la première activation d’origine : vérifiez les dates proposées.

Questions fréquentes

Vérifiez le code d’erreur, puis les réglages associés. Dans la réponse, request_id aide à retrouver l’opération. Pas de clé complète dans journaux ou captures.

Que vérifier si l’activation échoue ?

Vérifiez l’accès au serveur, l’identifiant du produit, la clé complète et son appartenance au produit. Avant déploiement, les clients ne peuvent pas utiliser votre 127.0.0.1 : cette adresse désigne l’ordinateur du client.

Code d’erreurPremière étape
LICENSE_INVALIDVérifiez ID produit, clé complète et produit de la licence
LICENSE_EXPIREDVoir l’échéance ; renouvellement par le fournisseur
LICENSE_REVOKED
DEVICE_RELEASED
Licence révoquée ou appareil libéré ; cache effacé
DEVICE_LIMIT_REACHEDPlaces pleines ; libérez un appareil ou augmentez la limite
API_QUOTA_EXCEEDEDQuota API épuisé ; vérifiez période et forfait
API_BALANCE_INSUFFICIENTSolde de dépassement API insuffisant ; vérifiez devise et environnement
MONTHLY_QUOTA_EXCEEDEDQuota appareils de plateforme atteint, distinct de celui de la licence
IDEMPOTENCY_CONFLICTMême clé, corps différents ; nouvelle opération nouvelle clé, répétition même corps
IDEMPOTENCY_EXPIREDRéponse ou lien invalide ; vérifiez l’état, nouvelle clé pour nouvelle opération

Pourquoi fonctionne-t-il encore hors ligne ?

Hors ligne, le SDK vérifie localement signature, produit, appareil, fonctions et expiration ; seule la requête serveur manque. Un cache expiré ou une révocation/libération reçue en ligne bloque l’usage.

Pourquoi la signature ou l’appareil n’est-il pas vérifié ?

Une clé publique différente, le cache d’un autre produit ou une copie sur un autre ordinateur peuvent provoquer l’échec. Vérifiez trusted_keys contient l’identifiant de clé et la clé publique du produit actuel, puis vérifiez si le système a été changé ou réinstallé.

Le SDK signale clock rollback : vérifiez un recul de l’horloge. Corrigez et actualisez en ligne.

Réponse d’erreur complète

HTTP 403 · licence révoquée
{
  "error": {
    "code": "LICENSE_REVOKED",
    "message": "License was revoked"
  },
  "request_id": "99999999-9999-4999-8999-999999999999"
}
ChampSignification et action
error.code · stringIdentifiant stable pour la logique, pas le texte de message.
error.message · stringRaison lisible pour diagnostic ou message client.
request_id · UUIDID de requête serveur pour journaux ; ni licence ni Idempotency-Key.

400/415 : corrigez les champs ou Content-Type ; 401 : vérifiez la clé ; 403 : suivez le code d’autorisation ; 409 : quota, session ou conflit d’idempotence ; 429 : attendez selon Retry-After. Réessayez les délais dépassés ou 5xx avec une pause. Pour écrire, gardez identifiant et corps d’origine afin d’éviter un double comptage.

Comment lire la réponse JSON ?

Réponse réussie data et request_id ; l’échec renvoie error.code, error.message et request_id. Gardez code d’erreur et request_id pour le diagnostic.

Pour e-mail, paiement ou déploiement, consultez Assistance et dépannage.