Licentiesleutels controleren vanuit je app in Node of Go: apparaatlimiet, verloop en intrekking
Als Skalp voor elke verkoop een licentiesleutel aanmaakt, controleert je app die met één API-aanroep. Het antwoord zegt of de sleutel werkt en zo niet, waarom: verlopen, ingetrokken na een terugbetaling, over de apparaatlimiet of gekoppeld aan een abonnement dat is afgelopen. Hieronder de instelling en de code voor Node, Go en gewoon HTTP.
Het product instellen
- Maak een product en zet de levering op licentiesleutel. Elke bestelling krijgt dan een nieuwe sleutel.
- Stel een apparaatlimiet in als een sleutel maar op een paar computers mag draaien, en een looptijd als de licentie na een aantal dagen moet verlopen. Laat de looptijd leeg voor een levenslange licentie, of verkoop het product als abonnement zodat de sleutel werkt zolang het plan betaald is.
- Maak een API-sleutel met alleen de scope
licenses:validate. Met alleen die scope kan de sleutel geen bestellingen lezen en niets wijzigen, dus hij mag in je app worden meegeleverd.
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)
}
Het pakket draait op Node 20+, Bun, Deno en edge-runtimes. In een browser weigert het te starten met een API-sleutel, tenzij je dangerouslyAllowBrowser: true meegeeft, dus een controle voor een webpagina hoort op je 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)
}
Elke andere taal
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..."}'
Voeg "productId" aan de body toe als een sleutel van een van je andere producten dit product niet mag ontgrendelen.
Wat de codes betekenen
| Code | Betekenis |
VALID | De sleutel werkt. Het antwoord bevat ook de vervaldatum en hoeveel apparaten hij gebruikt. |
NOT_FOUND | Zo'n sleutel bestaat niet in je winkel. |
PRODUCT_MISMATCH | De sleutel hoort bij een ander product dan de meegestuurde productId. |
LICENSING_DISABLED | De levering van het product staat niet op licentiesleutel. |
REVOKED | De bestelling is terugbetaald of heeft een chargeback verloren. |
SUSPENDED | De licentie is geschorst. |
EXPIRED | De licentie is voorbij haar einddatum. |
SUBSCRIPTION_INACTIVE | Het abonnement achter de sleutel is afgelopen. |
DEVICE_LIMIT_REACHED | De sleutel is al aan zoveel computers gekoppeld als het product toestaat. |
Apparaatlimiet
Stuur je een hardwareId mee en heeft het product een apparaatlimiet, dan koppelt de eerste controle vanaf een nieuwe computer die aan de sleutel. Controles vanaf gekoppelde computers komen erdoor, een nieuwe computer boven de limiet krijgt DEVICE_LIMIT_REACHED. Stuur een waarde die op één computer gelijk blijft en hash die eerst, zodat er geen ruwe hardwaregegevens de computer verlaten. Vervangt een koper zijn pc, dan kan je server de plekken vrijmaken met licenses.resetDevices. Die aanroep heeft de scope licenses:write nodig en hoort dus nooit in de app zelf.
Offline werken
Controleer de sleutel bij het starten van de app en sla het laatste goede antwoord op met een tijdstempel. Zonder netwerk accepteer je het opgeslagen antwoord voor een respijtperiode die je zelf kiest, bijvoorbeeld een paar dagen, en controleer je opnieuw zodra de app weer online is. Een sleutel die intussen is ingetrokken, komt dan niet door die controle.
Een eigen kopie bijhouden
Wil je sleutels liever in je eigen backend controleren, haal ze dan uit de webhook order.paid, die de licenties van de bestelling bevat. De webhooks voor terugbetalingen en geschillen vertellen je wanneer je een sleutel moet uitschakelen. Webhooks en de API.
Veelgestelde vragen
Is het veilig om een API-sleutel in een desktopapp te zetten?
Alleen een sleutel met als enige scope licenses:validate. Die kan sleutels controleren en verder niets.
Kan een koper zijn licentie naar een nieuwe computer verhuizen?
Ja, zodra je zijn apparaten vrijmaakt met licenses.resetDevices vanaf je server of je supporttool.
Wat gebeurt er met de sleutel als een abonnement afloopt?
Vanaf dat moment geeft de controle SUBSCRIPTION_INACTIVE terug.
Moet ik de SDK gebruiken?
Nee. De controle is één HTTPS-POST met een JSON-body, dus elke taal die een verzoek kan versturen, werkt.