# LicenseManager 快速入门指南 (Quickstart)

这篇指南将带您在 5 分钟内完成 LicenseManager 的核心接入体验。
我们以签发一个许可证并使用官方 SDK 验证为例。

## 前提条件

- 已经启动 LicenseManager API 服务（本地或云端）。
- 您已经申请或创建了一个许可证 (License Key)，例如 `LM-QUICK-START-1234`。
- 本地安装了 Go (>= 1.21) 或 Rust (>= 1.70)。

---

## 场景 1：使用 Go 语言进行集成

如果您开发的是一个 Go 语言应用，可以通过以下方式快速验证许可证是否有效，并防止多设备滥用。

### 1. 安装 SDK
在您的 Go 模块下运行：
```bash
go get github.com/license-manager/sdk-go
```

### 2. 验证许可证
在应用的启动入口处添加以下代码：

```go
package main

import (
	"fmt"
	"log"

	licensemanager "github.com/license-manager/sdk-go"
)

func main() {
	// 1. 初始化客户端（API Key 格式为 keyId:secret，经 Authorization: ApiKey 头传递）
	lm, err := licensemanager.NewClient(licensemanager.ClientOptions{
		BaseURL: "https://api.licensemanager.cn",
		APIKey:  "keyId:secret",
	})
	if err != nil {
		log.Fatalf("初始化客户端失败: %v", err)
	}

	// 2. 构造验证请求（HardwareID 可选，留空由服务端采集）
	req := licensemanager.VerifyRequest{
		LicenseKey: "LM-QUICK-START-1234",
		HardwareID: "hw-001",
	}

	// 3. 执行验证
	result, err := lm.Validate(req)
	if err != nil {
		log.Fatalf("许可证验证请求失败: %v", err)
	}

	// 4. 根据结果放行或阻断
	if result.Success {
		fmt.Println("✅ 授权有效！")
		// 启动应用核心逻辑...
	} else {
		fmt.Printf("❌ 授权无效，原因：%s（%s）\n", result.FailureMessage, result.FailureCode)
	}
}
```

> SDK 为单 package `licensemanager`（无 `client`/`models` 子包）；除 `Validate` 外还提供 `Activate` / `Heartbeat` / `Checkout`（一键激活）/ `Deactivate` 等生命周期方法。

---

## 场景 2：使用 Rust 语言进行集成

如果您开发的是性能敏感或底层系统应用，我们的 Rust SDK 同样提供了安全的强加密验证能力。

### 1. 安装 SDK
在您的 `Cargo.toml` 中添加：
```toml
[dependencies]
license_manager = "1.0"
tokio = { version = "1", features = ["full"] }
```

### 2. 验证许可证
```rust
use license_manager::{Client, ClientConfig, VerifyRequest};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 初始化客户端（API Key 格式为 keyId:secret，经 Authorization: ApiKey 头传递）
    let client = Client::new(
        ClientConfig::new("https://api.licensemanager.cn")
            .with_api_key("keyId:secret"),
    )?;

    // 2. 构造验证请求（hardware_id 可选，置 None 由服务端采集）
    let req = VerifyRequest {
        license_key: "LM-QUICK-START-1234".to_string(),
        hardware_id: Some("hw-001".to_string()),
        validate_features: None,
        sdk_version: None,
        hostname: None,
        os_version: None,
        user_account: None,
    };

    // 3. 执行验证
    let result = client.verify(&req).await?;

    // 4. 处理结果
    if result.success {
        println!("✅ 授权有效！");
    } else {
        println!(
            "❌ 授权无效，请联系管理员。原因：{}",
            result.failure_message.unwrap_or_default()
        );
    }

    Ok(())
}
```

> crate 名为 `license_manager`（模型经 `pub use models::*` 在 crate 根导出）；`verify` 是 `validate` 的别名，另提供 `activate` / `heartbeat` / `checkout`（一键激活）/ `deactivate` 等方法。

## 下一步
您已经掌握了最核心的集成方式。接下来，您可以探索：
- **浮动授权 (Floating Licenses)**: 为内网并发席位池配置授权。
- **离线授权 (Offline Activations)**: 处理完全无法联网的物理隔离环境。
- **Webhooks**: 监听续费或吊销事件，并自动更新您的内部数据库。

阅读完整的 [API 规范文档](./LicenseManager-Platform-API-Spec-v1.0.md) 了解更多高级用法。
