Guides
Recette : clés de licence
Vendez une app de bureau, un CLI, un plugin ou un modèle avec des clés de licence. L’app distribuée vérifie sa clé sans aucun secret à l’intérieur.
Perly Pay émet une clé quand le paiement est honoré, compte les activations par appareil et répond à « cette clé est-elle valable pour ce produit, ici ? » via des endpoints publics. Le logiciel que vous distribuez utilise LicenseClient, qui n’a besoin d’aucune clé secrète.
sell-license-keys du plugin Perly Pay réalise cette recette dans votre projet. L’exemple exécutable est examples/license-keys (MIT) dans le dépôt du plugin.Comment ça marche
- 1
Un produit qui émet des clés
issues_license: trueetlicense_activation_limit(appareils par clé), avec un prix unique, à vie, à durée fixe ou d’abonnement. - 2
Vendez-le
Un lien de paiement sur votre site, ou une facture par acheteur.
- 3
Envoyez la clé
Sur le webhook
license.created(son objet est la clé), ou aveclicenseKeys.list({ customer })aprèsinvoice.fulfilled. Le reçu ne la contient pas. - 4
Activez dans l’app
activate({ key, product, instance_name })avec un nom qui ne change pas sur cet appareil ; gardez l’id d’activation. - 5
Vérifiez au démarrage
validate({ key, product, instance }). Unvalid: falsenet bloque ; sans réseau, la dernière bonne réponse vaut quelques jours.
Lancez l’exemple
- 1
Installez
npm installdansexamples/license-keys(Node 20.12+). - 2
Clé
Copiez
.env.examplevers.envet mettez une clé de test (sk_test_…) dansPERLY_PAY_SECRET_KEY. - 3
Préparez
npm run setupcrée le produit et le prix avec votre clé et affiche leurs ids pour.env. - 4
Lancez
npm start(ounpm run dev), comme l’indique son README. - 5
Payez sans portefeuille
npm run buy-test -- you@example.comachète une copie en mode test et affiche la clé ; puisnpm run app -- activate <key>etnpm run app -- pro hello.
Pièges
- Une clé
sk_…dans l’app. N’importe qui peut l’extraire ; le code distribué n’utilise queLicenseClient. - Omettre
product: l’appel est refusé (parameter_missing). Passez-le toujours ; une clé pour autre chose répondwrong_product. - Un
instance_namequi change à chaque lancement : chaque démarrage consomme une activation.