Guias
Receita: chaves de licença
Venda um app desktop, um CLI, um plugin ou um template com chaves de licença. O app verifica a chave sem nenhum segredo dentro.
O Perly Pay emite uma chave quando o pagamento é entregue, conta as ativações por dispositivo e responde “esta chave vale para este produto aqui?” com endpoints públicos. O programa que você distribui usa LicenseClient, que não precisa de chave secreta.
sell-license-keys do plugin do Perly Pay faz esta receita no seu projeto. O exemplo executável é examples/license-keys (MIT) no repositório do plugin.Como funciona
- 1
Um produto que emite chaves
issues_license: trueelicense_activation_limit(dispositivos por chave), com um preço único, vitalício, por prazo ou uma assinatura. - 2
Venda
Um link de pagamento no seu site ou uma fatura por comprador.
- 3
Entregue a chave
Com o webhook
license.created(o objeto dele é a chave) ou comlicenseKeys.list({ customer })depois deinvoice.fulfilled. O recibo não traz a chave. - 4
Ative no app
activate({ key, product, instance_name })com um nome que não muda naquele dispositivo; guarde o id da ativação. - 5
Verifique ao iniciar
validate({ key, product, instance }). Umvalid: falseclaro bloqueia; sem rede, a última resposta boa vale por alguns dias.
Execute o exemplo
- 1
Instale
npm installemexamples/license-keys(Node 20.12+). - 2
Chave
Copie
.env.examplepara.enve coloque uma chave de teste (sk_test_…) emPERLY_PAY_SECRET_KEY. - 3
Prepare
npm run setupcria o produto e o preço com a sua chave e imprime os ids deles para o.env. - 4
Execute
npm start(ounpm run dev), como diz o README dele. - 5
Pague sem carteira
npm run buy-test -- you@example.comcompra uma cópia no modo de teste e imprime a chave; depoisnpm run app -- activate <key>enpm run app -- pro hello.
Erros comuns
- Uma chave
sk_…dentro do app. Qualquer um pode extraí-la; o programa que você distribui usa sóLicenseClient. - Sem
product, a chamada é recusada (parameter_missing). Passe-o sempre; a chave de qualquer outra coisa respondewrong_product. - Um
instance_nameque muda a cada inicialização: cada inicialização gasta uma ativação.