# Tarif: lisans anahtarları

> Masaüstü uygulamasını, CLI'ı, eklentiyi ya da şablonu lisans anahtarlarıyla sat. Uygulama anahtarı, içinde hiçbir sır olmadan doğrular.

Perly Pay, ödeme teslim edildiğinde bir anahtar verir, cihazlardaki etkinleştirmeleri sayar ve "bu anahtar bu ürün için burada geçerli mi?" sorusunu herkese açık uç noktalar üzerinden yanıtlar. Dağıttığın program `LicenseClient` kullanır — gizli anahtara ihtiyacı yoktur.

> **Not:** Asistanla: bu tarifi projende Perly Pay eklentisinin `sell-license-keys` skill'i uygular. Çalıştırılabilir örnek, eklenti deposundaki `examples/license-keys` (MIT).

## Nasıl çalışır

1. **Anahtar veren ürün** — `issues_license: true` ve `license_activation_limit` (anahtar başına cihaz); tek seferlik, ömür boyu, süreli fiyat ya da abonelikle.
2. **Satış** — Sitede bir [ödeme bağlantısı](https://pay.perly.io/docs/payment-links.md) ya da her alıcı için bir fatura.
3. **Anahtarı gönder** — `license.created` webhook'uyla (nesnesi anahtardır) ya da `invoice.fulfilled` sonrasında `licenseKeys.list({ customer })` ile. Makbuzda anahtar yok.
4. **Uygulamada etkinleştirme** — Bu cihazda değişmeyen bir adla `activate({ key, product, instance_name })`; etkinleştirme kimliğini sakla.
5. **Açılışta kontrol** — `validate({ key, product, instance })`. Net bir `valid: false` kapatır; ağ yokken birkaç gün boyunca son iyi yanıt geçerlidir.

**Node**

```js
import { LicenseClient } from "perly-pay";

const licenses = new LicenseClient(); // no secret key, ever
const result = await licenses.activate({ key, product: "prod_…", instance_name: deviceName });
if (!result.valid) showWhy(result.reason); // limit_reached, revoked, expired, …
```

**PHP**

```php
use Perly\Pay\LicenseClient;

$result = (new LicenseClient())->activate(['key' => $key, 'product' => 'prod_…', 'instance_name' => home_url()]);
if (!$result['valid']) echo $result['reason'];
```

## Örneği çalıştır

1. **Kur** — `examples/license-keys` içinde `npm install` (Node 20.12+).
2. **Anahtar** — `.env.example` dosyasını `.env` olarak kopyala ve test anahtarını (`sk_test_…`) `PERLY_PAY_SECRET_KEY` içine yaz.
3. **Hazırla** — `npm run setup` senin anahtarınla bir ürün ve fiyat oluşturur ve `.env` için kimliklerini yazdırır.
4. **Çalıştır** — README'sinde dediği gibi `npm start` (ya da `npm run dev`).
5. **Cüzdansız öde** — `npm run buy-test -- you@example.com` test modunda bir kopya satın alır ve anahtarı yazdırır; sonra `npm run app -- activate <key>` ve `npm run app -- pro hello`.

## Tuzaklar

- Uygulamanın içinde `sk_…` anahtarı. Herkes onu çıkarabilir; dağıttığın program yalnızca `LicenseClient` kullanır.
- `product` olmadan çağrı reddedilir (`parameter_missing`). Her seferinde gönder; başka bir şeyin anahtarı `wrong_product` yanıtı alır.
- Her açılışta değişen `instance_name`: her açılış bir etkinleştirme harcar.
