# 快手行业电子凭证接口测试指南

## 接口地址

| 接口 | 路径 | 要求 |
|------|------|------|
| 通知商家发码 | `POST /api/v1/open/kuaishou-industry/send-code` | 100 TPS, 平均 100ms |
| 查询商家卡券 | `POST /api/v1/open/kuaishou-industry/query-code` | 500 QPS, 平均 100ms |
| 通知商家销毁 | `POST /api/v1/open/kuaishou-industry/destroy-code` | 100 TPS, 平均 100ms |

## 测试脚本

```bash
cd apps/backend
```

### 功能测试（9 项检查）

```bash
# 本地
npm run test:industry:http

# 远程 - 自定义地址 + 命令行密钥
npm run test:industry:http -- \
  --baseUrl=https://xxx.xxx.com \
  --appKey=ks660621772091030245 \
  --signSecret=xxx

# 远程 - 使用 .env 中的密钥
npm run test:industry:http -- --baseUrl=https://ks.khhao.com
```

测试内容：发码 → 幂等性 → 查询全部 → 查询单个 → 不存在订单 → 销毁 → 销毁验证 → 整单销毁 → 签名错误拦截

### 压力测试（TPS/QPS 验证）

```bash
# 全部接口 100 TPS
npm run test:industry:http -- \
  --baseUrl=https://ks.khhao.com \
  --load --tps=100 --duration=10

# 单接口 500 QPS
npm run test:industry:http -- \
  --baseUrl=https://ks.khhao.com \
  --load --endpoint=query-code --tps=500 --duration=30

# 测试环境（自签证书）
npm run test:industry:http -- \
  --baseUrl=https://xxx.xxx.com \
  --insecure --load --tps=100 --duration=10
```

### 输出示例

```
╔══════════════════════════════════════════════════════╗
║  压测: query-code                                    ║
║  目标: 500  TPS, 持续 10 s                        ║
╚══════════════════════════════════════════════════════╝
  实际 TPS    : 2028.0
  总请求数    : 20290
  成功数      : 20290
  失败数      : 0
  平均耗时    : 4.9 ms
  P50         : 5.0 ms
  P95         : 7.0 ms
  P99         : 9.0 ms
  最小耗时    : 1.0 ms
  最大耗时    : 48.0 ms
```

## 参数说明

| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--baseUrl` | `http://127.0.0.1:3000` | 目标服务地址 |
| `--appKey` | .env 中读取 | 快手分配的 appKey |
| `--signSecret` | .env 中读取 | 签名密钥 |
| `--signMethod` | `MD5` | 签名算法: MD5 / HMAC_SHA256 |
| `--load` | false | 启用压力测试 |
| `--tps` | 100 | 目标 TPS/QPS |
| `--duration` | 10 | 持续时间（秒） |
| `--endpoint` | 全部 | 指定接口: send-code / query-code / destroy-code |
| `--insecure` | false | 跳过 SSL 验证（测试环境用） |

## 配置密钥

三种方式任选：

**1. .env 文件（推荐）**
```bash
KUASHOU_INDUSTRY_APP_KEY=ks660621772091030245
KUASHOU_INDUSTRY_SIGN_SECRET=你的signSecret
```

**2. 命令行**
```bash
npm run test:industry:http -- --appKey=xxx --signSecret=xxx
```

**3. 环境变量**
```bash
KUASHOU_INDUSTRY_APP_KEY=xxx \
KUASHOU_INDUSTRY_SIGN_SECRET=xxx \
npm run test:industry:http
```

## 压测前调高限流

服务端默认限流 120 req/min，压测需要调高：

```bash
# docker-compose.dev.yml 已支持，重启时传入即可
KUASHOU_INDUSTRY_RATE_LIMIT_MAX=60000 docker compose -f docker-compose.dev.yml up -d backend
```

## 直接调用服务层（不需启动 HTTP）

```bash
npm run test:industry          # 直接调用 handler，绕过 HTTP 层
```

## 签名算法

请求签名流程：

1. 所有参数（除 sign）按 key 字典序排序
2. 用 `&` 拼接为 `key=value` 格式
3. 末尾追加 `&signSecret=xxx`
4. MD5 或 HMAC_SHA256 计算签名

脚本内置了签名计算，自动处理。

## 注意事项

- 测试环境需将出口 IP 加入快手白名单
- 远程压力测试避免影响线上业务，建议先功能测试再逐步加量
- 签名密钥勿提交到 git，通过 .env 或命令行传入
