Verificar chaves de licença pelo seu app em Node ou Go: limite de dispositivos, validade e revogação
Quando a Skalp gera uma chave de licença para cada venda, o seu app verifica a chave com uma chamada à API. A resposta diz se a chave funciona e, se não, por quê: expirou, foi revogada depois de um reembolso, passou do limite de dispositivos ou pertence a uma assinatura que acabou. Abaixo estão a configuração e o código para Node, Go e HTTP puro.
- Crie um produto e defina a entrega como chave de licença. Cada pedido passa a receber uma chave nova.
- Defina um limite de dispositivos se uma chave só deve rodar em poucas máquinas, e uma duração se a licença deve expirar depois de um número de dias. Deixe a duração vazia para uma licença vitalícia, ou venda o produto como assinatura para que a chave funcione enquanto o plano estiver pago.
- Crie uma chave de API só com o escopo
licenses:validate. Com esse escopo, a chave não lê pedidos nem altera nada, então pode ir dentro do seu app.
Node
import { Skalp } from '@skalpgg/sdk'
const skalp = new Skalp({ apiKey: LICENSE_CHECK_KEY })
const result = await skalp.licenses.validate({
key: enteredKey,
hardwareId: machineId,
})
if (!result.valid) {
showError(result.message)
} else {
unlock(result.license?.expiresAt)
}
O pacote roda em Node 20+, Bun, Deno e runtimes edge. No navegador ele se recusa a iniciar com uma chave de API, a menos que você passe dangerouslyAllowBrowser: true, então a verificação de uma página web fica no seu servidor.
Go
client := skalp.New(skalp.Options{APIKey: licenseCheckKey})
res, err := client.ValidateLicense(ctx, skalp.ValidateLicenseParams{
Key: enteredKey,
HardwareID: machineID,
})
if err != nil {
return err
}
if !res.Valid {
return fmt.Errorf("license: %s", res.Message)
}
Qualquer outra linguagem
curl https://api.skalp.gg/v1/licenses/validate \
-H "x-api-key: $SKALP_LICENSE_CHECK_KEY" \
-H "content-type: application/json" \
-d '{"key":"THE-BUYERS-KEY","hardwareId":"9f2c41..."}'
Inclua "productId" no corpo se uma chave de outro produto seu não puder liberar este.
O que os códigos significam
| Código | Significado |
VALID | A chave funciona. A resposta também traz a data de expiração e quantos dispositivos ela usa. |
NOT_FOUND | Não existe essa chave na sua loja. |
PRODUCT_MISMATCH | A chave pertence a um produto diferente do productId enviado. |
LICENSING_DISABLED | A entrega do produto não está definida como chave de licença. |
REVOKED | O pedido foi reembolsado ou perdeu um chargeback. |
SUSPENDED | A licença foi suspensa. |
EXPIRED | A licença passou da data final. |
SUBSCRIPTION_INACTIVE | A assinatura ligada à chave terminou. |
DEVICE_LIMIT_REACHED | A chave já está ligada a tantas máquinas quanto o produto permite. |
Limite de dispositivos
Se você envia um hardwareId e o produto tem limite de dispositivos, a primeira verificação de uma máquina nova liga essa máquina à chave. Verificações de máquinas ligadas passam, e uma máquina nova acima do limite recebe DEVICE_LIMIT_REACHED. Envie um valor que não muda na mesma máquina e gere um hash dele antes, para que nenhum dado bruto de hardware saia do computador. Quando um comprador troca de PC, o seu servidor pode liberar as vagas com licenses.resetDevices. Essa chamada exige o escopo licenses:write, então nunca vai dentro do app.
Funcionar offline
Verifique a chave quando o app abrir e guarde a última resposta válida com data e hora. Sem rede, aceite a resposta guardada por um período de tolerância que você escolhe, alguns dias por exemplo, e verifique de novo quando o app voltar a ficar online. Uma chave revogada nesse meio-tempo falha nessa verificação.
Manter uma cópia própria
Se preferir verificar as chaves no seu backend, pegue-as no webhook order.paid, que traz as licenças do pedido. Os webhooks de reembolso e de disputa avisam quando desligar uma chave. Webhooks e a API.
Perguntas frequentes
É seguro colocar uma chave de API num app desktop?
Só uma chave cujo único escopo seja licenses:validate. Ela verifica chaves e mais nada.
Um comprador pode passar a licença para um computador novo?
Sim, depois que você liberar os dispositivos dele com licenses.resetDevices pelo seu servidor ou pela sua ferramenta de suporte.
O que acontece com a chave quando a assinatura termina?
A partir daí a verificação devolve SUBSCRIPTION_INACTIVE.
Preciso usar o SDK?
Não. A verificação é um único POST em HTTPS com corpo JSON, então qualquer linguagem que envie uma requisição funciona.