# Рецепт: ліцензійні ключі

> Продавайте десктопний застосунок, CLI, плагін чи шаблон з ліцензійними ключами. Застосунок перевіряє ключ без жодного секрету всередині.

Perly Pay видає ключ, коли оплату виконано, рахує активації на пристроях і відповідає «чи дійсний цей ключ для цього продукту тут?» через публічні ендпоінти. Програма, яку ви розповсюджуєте, використовує `LicenseClient` — йому секретний ключ не потрібен.

> **Примітка:** З асистентом: цей рецепт робить у вашому проєкті скіл `sell-license-keys` плагіна Perly Pay для Claude Code — плагін і його приклад `examples/license-keys` (MIT) уже на шляху. Доти будь-який асистент прочитає той самий скіл з `/.well-known/skills/perly-pay-sell-license-keys/SKILL.md`.

## Як це працює

1. **Продукт, що видає ключі** — `issues_license: true` і `license_activation_limit` (пристроїв на ключ), з разовою, довічною, строковою ціною або підпискою.
2. **Продаж** — [Платіжне посилання](https://pay.perly.io/docs/payment-links.md) на сайті або рахунок на кожного покупця.
3. **Надішліть ключ** — За вебхуком `license.created` (його об'єкт — ключ) або через `licenseKeys.list({ customer })` після `invoice.fulfilled`. У квитанції ключа немає.
4. **Активація в застосунку** — `activate({ key, product, instance_name })` з назвою, що не змінюється на цьому пристрої; збережіть ідентифікатор активації.
5. **Перевірка під час запуску** — `validate({ key, product, instance })`. Чітке `valid: false` закриває; без мережі кілька днів діє остання добра відповідь.

**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'];
```

## Запустіть приклад

1. **Встановіть** — `npm install` у `examples/license-keys` (Node 20.12+).
2. **Ключ** — Скопіюйте `.env.example` у `.env` і впишіть тестовий ключ (`sk_test_…`) у `PERLY_PAY_SECRET_KEY`.
3. **Підготуйте** — `npm run setup` створює продукт і ціну вашим ключем та друкує їхні ідентифікатори для `.env`.
4. **Запустіть** — `npm start` (або `npm run dev`), як каже його README.
5. **Сплатіть без гаманця** — `npm run buy-test -- you@example.com` купує копію в тестовому режимі й друкує ключ; далі `npm run app -- activate <key>` і `npm run app -- pro hello`.

## Пастки

- Ключ `sk_…` усередині застосунку. Його витягне будь-хто; програма, яку ви поширюєте, використовує лише `LicenseClient`.
- Без `product` ключ від будь-чого, що ви продаєте, відкриє і це.
- `instance_name`, що змінюється з кожним запуском: кожен запуск з'їдає активацію.
