Controllare le chiavi di licenza dalla tua app in Node o Go: limite di dispositivi, scadenza e revoca
Quando Skalp genera una chiave di licenza per ogni vendita, la tua app la controlla con una sola chiamata API. La risposta dice se la chiave funziona e, se no, perché: scaduta, revocata dopo un rimborso, oltre il limite di dispositivi o legata a un abbonamento finito. Qui trovi la configurazione e il codice per Node, Go e HTTP semplice.
Configura il prodotto
- Crea un prodotto e imposta la consegna su chiave di licenza. Ogni ordine riceve così una chiave nuova.
- Imposta un limite di dispositivi se una chiave deve funzionare solo su poche macchine, e una durata se la licenza deve scadere dopo un certo numero di giorni. Lascia vuota la durata per una licenza a vita, oppure vendi il prodotto come abbonamento perché la chiave funzioni finché il piano è pagato.
- Crea una chiave API con il solo scope
licenses:validate. Con quello scope la chiave non può leggere ordini né modificare nulla, quindi può stare dentro la tua 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)
}
Il pacchetto gira su Node 20+, Bun, Deno e runtime edge. In un browser si rifiuta di partire con una chiave API a meno che tu non passi dangerouslyAllowBrowser: true, quindi il controllo per una pagina web va sul tuo server.
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)
}
Qualsiasi altro linguaggio
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..."}'
Aggiungi "productId" al body se una chiave di un altro tuo prodotto non deve sbloccare questo.
Cosa significano i codici
| Codice | Significato |
VALID | La chiave funziona. La risposta riporta anche la data di scadenza e quanti dispositivi usa. |
NOT_FOUND | Nel tuo negozio non esiste una chiave così. |
PRODUCT_MISMATCH | La chiave appartiene a un prodotto diverso dal productId inviato. |
LICENSING_DISABLED | La consegna del prodotto non è impostata su chiave di licenza. |
REVOKED | L'ordine è stato rimborsato o ha perso un chargeback. |
SUSPENDED | La licenza è stata sospesa. |
EXPIRED | La licenza ha superato la data di fine. |
SUBSCRIPTION_INACTIVE | L'abbonamento a cui appartiene la chiave è finito. |
DEVICE_LIMIT_REACHED | La chiave è già legata a tante macchine quante ne consente il prodotto. |
Limite di dispositivi
Se invii un hardwareId e il prodotto ha un limite di dispositivi, il primo controllo da una macchina nuova la lega alla chiave. I controlli dalle macchine legate passano, e una macchina nuova oltre il limite riceve DEVICE_LIMIT_REACHED. Invia un valore che resti uguale sulla stessa macchina e fanne prima un hash, così nessun dato hardware grezzo lascia il computer. Quando un acquirente cambia PC, il tuo server può liberare i posti con licenses.resetDevices. Questa chiamata richiede lo scope licenses:write, quindi non va mai dentro l'app.
Funzionare offline
Controlla la chiave all'avvio dell'app e salva l'ultima risposta valida con data e ora. Senza rete, accetta la risposta salvata per un periodo di tolleranza a tua scelta, qualche giorno per esempio, e ricontrolla quando l'app torna online. Una chiave revocata nel frattempo non passa quel controllo.
Tenere una copia tua
Se preferisci controllare le chiavi nel tuo backend, prendile dal webhook order.paid, che contiene le licenze dell'ordine. I webhook di rimborsi e contestazioni ti dicono quando disattivare una chiave. Webhook e API.
Domande frequenti
È sicuro mettere una chiave API in un'app desktop?
Solo una chiave il cui unico scope è licenses:validate. Può controllare chiavi e nient'altro.
Un acquirente può spostare la licenza su un computer nuovo?
Sì, dopo che liberi i suoi dispositivi con licenses.resetDevices dal tuo server o dal tuo strumento di supporto.
Cosa succede alla chiave quando un abbonamento finisce?
Da quel momento il controllo restituisce SUBSCRIPTION_INACTIVE.
Devo usare l'SDK?
No. Il controllo è una singola POST in HTTPS con un body JSON, quindi va bene qualsiasi linguaggio che sappia inviare una richiesta.