# 加密二维码使用说明

## 概述

本系统提供了基于token的二维码加密和解密功能，可以安全地生成包含敏感信息的二维码，并设置过期时间。

## 主要特性

1. **AES加密**：使用AES对称加密算法保护二维码数据
2. **Token机制**：每个二维码都有唯一的token作为密钥
3. **过期控制**：可设置二维码的有效期（1-1440分钟）
4. **Redis存储**：token和原始数据存储在Redis中，支持自动过期
5. **数据验证**：解密时会验证数据完整性

## API接口

### 1. 生成普通二维码

```http
GET /api/qr-code/create-qr-code?data=https://example.com&size=200x200
```

**参数：**
- `data`: 要编码的数据（必需）
- `size`: 二维码尺寸，格式：宽x高 或 单个数字（可选，默认200x200）

**响应：** 直接返回PNG图片流

### 2. 生成加密二维码（返回JSON）

```http
POST /api/qr-code/create-encrypted-qr-code
```

**参数：**
- `data`: 要加密的数据（必需）
- `width`: 二维码宽度（可选，默认200）
- `height`: 二维码高度（可选，默认200）
- `expireMinutes`: 过期时间分钟数（可选，默认30，最大1440）

**响应示例：**
```json
{
  "code": 200,
  "message": "生成加密二维码成功",
  "data": {
    "qrCodeBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
    "token": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
    "originalData": "https://example.com/user/123",
    "expireMinutes": "30"
  }
}
```

### 3. 生成加密二维码（返回图片流）

```http
GET /api/qr-code/create-encrypted-qr-image?data=https://example.com&size=300x300&expireMinutes=60
```

**参数：**
- `data`: 要加密的数据（必需）
- `size`: 二维码尺寸（可选，默认200x200）
- `expireMinutes`: 过期时间分钟数（可选，默认30）

**响应：** 直接返回PNG图片流，并在响应头中包含token信息
- `X-QR-Token`: 二维码的token
- `X-QR-Expire-Minutes`: 过期时间

### 4. 解密二维码数据

```http
POST /api/qr-code/decrypt-qr-data
```

**参数：**
- `token`: token密钥（必需）
- `encryptedData`: 加密的数据（必需）

**响应示例：**
```json
{
  "code": 200,
  "message": "解密成功",
  "data": "https://example.com/user/123"
}
```

### 5. 验证并解密二维码内容

```http
POST /api/qr-code/verify-and-decrypt-qr
```

**参数：**
- `qrContent`: 二维码扫描得到的完整JSON内容（必需）

**二维码内容格式：**
```json
{
  "token": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "data": "encrypted_data_here",
  "type": "encrypted"
}
```

**响应示例：**
```json
{
  "code": 200,
  "message": "验证和解密成功",
  "data": "https://example.com/user/123"
}
```

### 6. 检查token是否有效

```http
GET /api/qr-code/check-token?token=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
```

**响应示例：**
```json
{
  "code": 200,
  "message": "检查完成",
  "data": true
}
```

### 7. 使token失效

```http
POST /api/qr-code/invalidate-token
```

**参数：**
- `token`: 要使失效的token（必需）

**响应示例：**
```json
{
  "code": 200,
  "message": "token已失效"
}
```

## 使用场景

### 场景1：用户身份验证二维码

```javascript
// 生成包含用户ID的加密二维码
const response = await fetch('/api/qr-code/create-encrypted-qr-code', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: 'data=user_id:12345&expireMinutes=10'
});

const result = await response.json();
// 显示二维码图片：result.data.qrCodeBase64
// 保存token用于后续验证：result.data.token
```

### 场景2：临时访问链接

```javascript
// 生成临时访问链接的二维码
const accessUrl = 'https://example.com/temp-access?session=abc123';
const response = await fetch('/api/qr-code/create-encrypted-qr-image?' + 
  new URLSearchParams({
    data: accessUrl,
    size: '250x250',
    expireMinutes: '5'
  }));

// 直接使用返回的图片流
// token信息在响应头 X-QR-Token 中
```

### 场景3：扫码验证

```javascript
// 扫描二维码后验证
const qrContent = '{"token":"...","data":"...","type":"encrypted"}';
const response = await fetch('/api/qr-code/verify-and-decrypt-qr', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: 'qrContent=' + encodeURIComponent(qrContent)
});

const result = await response.json();
if (result.code === 200) {
  console.log('原始数据:', result.data);
} else {
  console.log('验证失败:', result.message);
}
```

## 安全注意事项

1. **token保护**：token是解密的关键，应妥善保管
2. **过期时间**：根据安全需求设置合适的过期时间
3. **HTTPS传输**：生产环境中应使用HTTPS传输
4. **访问控制**：可根据需要添加接口访问权限控制
5. **日志记录**：建议记录二维码生成和验证的操作日志

## 错误处理

常见错误及处理：

- `token已过期或无效`：二维码已过期，需要重新生成
- `数据验证失败`：加密数据被篡改或token不匹配
- `尺寸必须在50-1000像素之间`：二维码尺寸超出允许范围
- `过期时间必须在1-1440分钟之间`：过期时间设置不合理
