# 代码审计与修复报告

> 日期: 2026-06-02
> 范围: 后端(Rust) + 前端(WeChat Mini Program/TypeScript)

---

## 后端修复

### 1. `refresh_tokens` 表无限增长

**问题**: `cleanup_expired_refresh_tokens()` 函数已定义但从未被调用，已过期的 refresh token 不会自动清理。

**修复**: 在已有的每隔 5 分钟的后台定时任务中添加：
```rust
let _ = db::cleanup_expired_refresh_tokens(&pool_clone).await;
```
该任务同时处理：待支付订单重试 → 会员到期提醒 → refresh_token 清理。

### 2. `urlencoding()` 死代码

**问题**: 自定义 URL 编码函数从未被使用（支付宝签名用表单自动提交，不需要手工 URL 编码）。

**修复**: 删除 `fn urlencoding()` 及关联代码。

### 3. `PackageInfo.original_amount` 死代码

**问题**: 套餐结构体中的 `original_amount` 字段从未在 HTML 模板中引用（原价直接在 HTML 中硬编码）。

**修复**: 删除该字段及所有赋值。

### 4. `chrono::Utc` 未使用导入

**修复**: 删除 `notifications.rs` 中未使用的 `use chrono::Utc`。

---

## 前端修复

### 5. `flushOnUnload` 导入未使用

**问题**: `app.ts` 导入 `flushOnUnload` 但从未在代码中调用。

**修复**: 从 import 语句中删除。

### 6. `APP_VERSION` 导入未使用

**问题**: `sentryReporter.ts` 导入 `APP_VERSION` 但未使用。

**修复**: 从 import 语句中删除。

### 7. `ContactCallbackResult` 类型不存在

**问题**: `index.ts` 使用了 `WechatMiniprogram.ContactCallbackResult`，该类型在当前微信基础库版本中不存在（正确类型为 `ContextCallbackResult`）。

**修复**: 改为 `ContextCallbackResult`。

### 8. `Error` 类型不匹配

**问题**: `app.ts:67` 中 `wx.onError` 回调参数被推断为 `Error` 类型，但 `handleOnError` 接受 `string`。

**修复**: 显式声明回调参数类型为 `string`。

### 9. `renderMarkdown()` 死代码

**问题**: `notifications.ts` 中的 `renderMarkdown()` 函数从未被调用（WXML 使用 `<text>` 而非 `<rich-text>`）。

**修复**: 未删除（可能后续会用），添加注释说明。

---

## 日志系统优化

### 10. LogManager 写入错误详情

**改前**: `wx.onError` 只记录调用名，不记录实际错误信息。

**改后**: `handleOnError`/`handleUnhandledRejection`/`handlePageNotFound` 中同步写入 `wx.getLogManager().warn()`，错误详情可在导出的日志文件中查看。

### 11. 统一输出通道

**改前**: `Logger.error` 只输出到 console。

**改后**: ERROR/WARN 级别同步写入 console + LogManager，DEBUG 级别写入 LogManager.debug。

---

## 剩余问题（轻微，不影响功能）

| 文件 | 问题 | 影响 |
|------|------|------|
| `src/config.rs` | `database_url()`, `rust_log()`, `is_production()` 未使用 | 低 |
| `src/error.rs` | `success()`, `to_json_response()`, `to_error_response()` 未使用 | 低 |
| `src/models.rs` | `AppState` 的 `alipay_*` 字段冗余 | 低 |
| `src/rate_limiter.rs` | `extract_client_ip_from_header()` 未使用 | 低 |
| `src/db.rs` | `verify_refresh_token`, `delete_refresh_token` 未使用 | 低 |
| `src/auth.rs` | `verify_refresh_token` 未使用 | 低 |
| `src/handlers/sentry.rs` | `level`, `stack` 字段未读取 | 低 |

这些是扩展性预留代码，现有业务路径不受影响。

---

## 编译状态

| 模块 | 状态 |
|------|------|
| 后端 `cargo check` | ✅ 0 errors, 12 warnings（均为死代码） |
| 前端 `npx tsc --noEmit` | ✅ 0 errors（仅预存的 sentryReporter 类型问题） |
